免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
怎樣編寫Makefile文件 - Moose W. Oler的日志 - 網(wǎng)易博客

怎樣編寫Makefile文件

Debian2009-03-19 15:48:50閱讀408評(píng)論3  字號(hào): 訂閱

引言:makefile入門讀本,有些翻譯拿不準(zhǔn)的保留原文。原作者的行文結(jié)構(gòu)可能不太好理解,待全部驗(yàn)證后會(huì)根據(jù)自己的使用經(jīng)驗(yàn)調(diào)整內(nèi)容的布局。
轉(zhuǎn)載請注明出處。
==========================================================================
怎樣編寫Makefile文件

原作者 : anonymous
譯者 : Moose W. Oler (原文部分修改)
參考 : Make and Makefiles by Reg Quinton
原文鏈接:http://www.hsrl.rutgers.edu/ug/make_help.html
==========================================================================
1. 介紹
在使用Debian GNU/Linux的過程中,我們會(huì)經(jīng)常用到(有意或無意識(shí)的)make工具。
make是UNIX自帶的,最初由AT&T貝爾實(shí)驗(yàn)室的S.I. Feldman在1975年完成。
不過現(xiàn)在也有GNU版本(public domain versions)和其他系統(tǒng)的版本(例如:Vax/VMS)。
相關(guān)工具有編譯器(如cc,f77,lex,yacc等)和shell編程工具(awk,sed,cp,rm等)
在閱讀本文之前,作為背景知識(shí),你需要知道如何使用以上工具。

重要的輔助工具:
lint(源碼錯(cuò)誤檢查工具)
ctags(可在源程序內(nèi)定位函數(shù))
mkdepand
它們的功能都很強(qiáng)大,很多優(yōu)秀的程序員在使用它們。

重要的相關(guān)工具:
SCCS(Source Code Control System源代碼控制系統(tǒng))
RCS(Revision Control System軟件修訂控制系統(tǒng),推薦使用)
使用它們的目的在于自動(dòng)完成并且優(yōu)化程序/文件的結(jié)構(gòu),也就是說要留下足夠多的信息,以便在其他人閱讀
源代碼的時(shí)候能夠較輕松的理解。

==========================================================================
2.Makefile的命名
make在運(yùn)行的時(shí)候,默認(rèn)的是先查找叫做Makefile配置文件,如果沒找到再找叫做makefile的文件。盡量使用
Makefile這個(gè)名字(你不覺得ls的時(shí)候,Makefile要比makefile突出嗎?)

You can get away without any Makefile (but shouldn't)!
make有它自己默認(rèn)的"rules"(rules這個(gè)關(guān)鍵詞很重要,所以不翻譯)。

==========================================================================
3.Makefile組成部分

3.1 注釋Comments
以井號(hào)(#)開始的文本部分,被視為注釋。
注釋可以從一行的任意點(diǎn)開始,直到行尾。
例如:
# $Id: slides,v 1.2 1992/02/14 21:00:58 reggers Exp $

3.2 宏Macros
make有一個(gè)簡單的宏定義和替換系統(tǒng)。
在Makefile中,宏定義是一個(gè)等號(hào)對(duì)。
例如:
MACROS= -me
PSROFF= groff -Tps
DITROFF= groff -Tdvi
CFLAGS= -O -systype bsd43
系統(tǒng)中有很多默認(rèn)的宏——你應(yīng)該遵循已有的宏命名約定。
要查看現(xiàn)有的rules/macros,使用如下命令:
% make -p
注意:如果將環(huán)境變量作為宏,export到make里使用,它會(huì)覆蓋原有的宏。

也可以在命令行中定義宏:
% make "CFLAGS= -O" "LDFLAGS=-s" printenv cc -O printenv.c -s -o printenv

3.3 目標(biāo)Targets
當(dāng)你make一個(gè)特定目標(biāo)的時(shí)候(比如說make all), 如果沒指定make的順序話,將從makefile的第一個(gè)開始make:
paper.dvi: $(SRCS)
$(DITROFF) $(MACROS) $(SRCS) >paper.dvi
注意:第二行以TAB開始,而不是空格(雖然看起來一樣)。

如果target依賴的文件發(fā)生了變化,target就會(huì)被執(zhí)行。
上邊例子中的依賴文件是由$(SRC)語句指定的部分。

3.4 行的格式Continuation of Lines
在macros或rules非常長的時(shí)候,可以分開多行寫,每行結(jié)尾以“\”結(jié)束。

3.5 常用宏Conventional Macros
有很多默認(rèn)的宏(使用“make -p”查看)。
Most are pretty obvious from the rules in which they are used:
AR = ar
GFLAGS =
GET = get
ASFLAGS =
MAS = mas
AS = as
FC = f77
CFLAGS =
CC = cc
LDFLAGS =
LD = ld
LFLAGS =
LEX = lex
YFLAGS =
YACC = yacc
LOADLIBS =
MAKE = make
MAKEARGS = 'SHELL=/bin/sh'
SHELL = /bin/sh
MAKEFLAGS = b

3.6 特殊宏Special Macros
在嘗試寫自己的makefile之前,還需要了解一些特殊的宏:
1. $@ —— 正在被made的文件名
2. $? —— 有改動(dòng)的依賴文件的文件名
例如,這個(gè)rule:
printenv: printenv.c
$(CC) $(CFLAGS) $? $(LDFLAGS) -o $@
也可以這樣寫:
printenv: printenv.c
$(CC) $(CFLAGS) $@.c $(LDFLAGS) -o $@

還有兩個(gè)特殊的宏,它們用在隱式rule中:
1. $< 引起此行為的相關(guān)文件名
2. $* 由target和依賴文件共用的前綴

3.7 Makefile目標(biāo)規(guī)則Makefile Target Rules
一個(gè)目標(biāo)規(guī)則的寫法是:
target [target...] : [dependent ....]
[ command ...]
方括號(hào)中的是可選項(xiàng)目,省略號(hào)代表可以有多項(xiàng)
注意:在第二行開頭有一個(gè)TAB,第一行是頂頭寫的。

語義相當(dāng)?shù)暮唵巍?br>The semantics is pretty simple.
當(dāng)你輸入“make target”的時(shí)候,make就去尋找叫做target的rule。
如果規(guī)則的依賴文件發(fā)生了變化,make就會(huì)一個(gè)一個(gè)地執(zhí)行第二行的command(發(fā)生在宏替換之后)。
如果有些依賴必須被made,則先made這些依賴,然后遞歸回去。

如果某個(gè)command返回失敗值,整個(gè)make過程就會(huì)終止。
這就是為什么要使用這個(gè)rule:
clean:
-rm *.o *~ core paper
如果command行以“-”開頭的話,Make會(huì)忽略命令行調(diào)用時(shí)返回的提示信息。
eg. who cares if there is no core file?

Make會(huì)回顯執(zhí)行的commands, 當(dāng)宏替換后,make會(huì)回顯當(dāng)前的命令,以便讓你知道目前的內(nèi)容和進(jìn)度。
有時(shí)候,你也許想關(guān)掉這個(gè)功能,那么這樣作:
install:
@echo You must be root to install

3.8 示例Example Target Rules
例如,為了管理在RCS中的源文件,使用如下rule:
SRCS=x.c y.c z.c
$(SRCS):
co $@

管理SCCS中的源文件 (有時(shí)候你希望"get"一個(gè)源文件):
$(SRCS):
sccs get $@

為了更有普遍性一些,我們可以將rule修改一下:
SRCS=x.c y.c z.c
# GET= sccs get
GET= co
$(SRCS):
$(GET) $@

又如,下面的rule建立一個(gè)對(duì)象文件的庫:
lib.a: x.o y.o z.o
ar rvu lib.a x.o y.o z.o
ranlib lib.a

另外,你也許會(huì)喜歡這樣寫:
OBJ=x.o y.o z.o
AR=ar

lib.a: $(OBJ)
$(AR) rvu $@ $(OBJ)
ranlib $@
因?yàn)锳R是一個(gè)默認(rèn)宏,所以你也可以省略第二行(但是不推薦這樣做)

如果你習(xí)慣于使用宏,你就能只定義少量的有普遍性的rule,然后反復(fù)的調(diào)用它們。
例如,在其他的目錄中構(gòu)建一個(gè)庫:
INC=../misc
OTHERS=../misc/lib.a

$(OTHERS):
cd $(INC); make lib.a
注意:下面這種寫法是錯(cuò)誤的(雖然看起來沒問題)
INC=../misc
OTHERS=../misc/lib.a

$(OTHERS):
cd $(INC)
make lib.a
因?yàn)閞ule中的command是在各自獨(dú)立的shell中執(zhí)行。
這導(dǎo)致了一些有意思的結(jié)構(gòu),和那種超長行。

這個(gè)rule可以生成多個(gè)文件的tags文件:
SRCS=x.c y.c z.c
CTAGS=ctags -x >tags

tags: $(SRCS)
${CTAGS} $(SRCS)
在一個(gè)大的工程中,tag文件列出了所有的函數(shù)和它們的定義。
tags是一個(gè)很好的工具。

可以用lint查找可能的錯(cuò)誤所在:
lint:
lint $(CFLAGS) $(SRCS)
lint是一個(gè)相當(dāng)不錯(cuò)的查錯(cuò)工具,用它檢查那些無意識(shí)犯下的小錯(cuò)誤再好不過了——如拼寫類錯(cuò)誤,錯(cuò)誤的
參數(shù)等等。

3.9 一些基本的規(guī)則Some Basic Make Rule
你的Makefile最好具有以下三個(gè)target:
all、install、clean
1. make all -- 將所有的文件進(jìn)行編譯以便進(jìn)行本地調(diào)試。
2. make install -- 將文件安裝到正確位置。避免破壞安裝文件
3. make clean -- 清除文件。清楚所有可執(zhí)行的、臨時(shí)的和對(duì)象文件。

一些其他的目標(biāo)也會(huì)經(jīng)常用到,比如tags和lint。

3.10 完整Makefile的示例An Example Makefile for printenv
# make the printenv command
#
OWNER=bin
GROUP=bin
CTAGS= ctags -x >tags
CFLAGS= -O
LDFLAGS= -s
CC=cc
GET=co
SRCS=printenv.c
OBJS=printenv.o
SHAR=shar
MANDIR=/usr/man/manl/printenv.l
BINDIR=/usr/local/bin
DEPEND= makedepend $(CFLAGS)

all: printenv

# To get things out of the revision control system
$(SRCS):
$(GET) $@
# To make an object from source
$(CC) $(CFLAGS) -c $*.c
# To make an executable
printenv: $(OBJS)
$(CC) $(LDFLAGS) -o $@ $(OBJS)

# To install things in the right place
install: printenv printenv.man
$(INSTALL) -c -o $(OWNER) -g $(GROUP) -m 755 printenv $(BINDIR)
$(INSTALL) -c -o $(OWNER) -g $(GROUP) -m 644 printenv.man $(MANDIR)
# where are functions/procedures?
tags: $(SRCS)
$(CTAGS) $(SRCS)

# what have I done wrong?
lint: $(SRCS)
lint $(CFLAGS) $(SRCS)

# what are the source dependencies
depend: $(SRCS)
$(DEPEND) $(SRCS)

# to make a shar distribution
shar: clean
$(SHAR) README Makefile printenv.man $(SRCS) >shar

# clean out the dross
clean:
-rm printenv *~ *.o *.bak core tags shar

# DO NOT DELETE THIS LINE -- make depend depends on it.
printenv.o: /usr/include/stdio.h

3.11 隱式規(guī)則Makefile Implicit Rules
假設(shè)有如下rule:
Consider the rule we used for printenv
printenv: printenv.c
$(CC) $(CFLAGS) printenv.c $(LDFLAGS) -o printenv

可以更一般化些:
We generalized a bit to get
printenv: printenv.c
$(CC) $(CFLAGS) $@.c $(LDFLAGS) -o $@

上邊的第二行是普遍適用的,當(dāng)把.c文件編譯為可執(zhí)行的文件時(shí),就可以用它,而不僅僅限于printenv.c
這個(gè)文件。像這樣的情況,就可以使用隱式rule:
.c:
$(CC) $(CFLAGS) $@.c $(LDFLAGS) -o $@

這個(gè)隱式規(guī)則指明如何將.c文件編譯成可執(zhí)行文件——運(yùn)行cc進(jìn)行編譯鏈接,然后命名之。
之所以稱其為隱式的,因?yàn)檫@個(gè)rule沒有確定的指出某一個(gè)文件,而是含糊的劃定了一個(gè)大的范圍。

另一個(gè)常見的隱式rule是將.c文件生成.o文件(OBJ):
.o.c:
$(CC) $(CFLAGS) -c $<

也可以這樣:
.o.c:
$(CC) $(CFLAGS) -c $*.c

3.12 make依賴Make Dependencies
使用include在源代碼中很常見。
比如:
% cat program.c
#include
#include "defs.h"
#include "glob.h"
etc....
main(argc,argv)
etc...

隱式rule僅包含了部分的源代碼依賴(它只知道.o文件依賴于.c文件),卻無法解決包含依賴。
常用的解決辦法是,將詳細(xì)的依賴關(guān)系單獨(dú)寫出來:
etc...
$(CC) $(CFLAGS) -c $*.c
etc...
program.o: program.c defs.h glob.h

一般來說,通過隱式rule和獨(dú)立的依賴列表就可以很好的解決所有的依賴問題。

不過,還有其他的工具可以自動(dòng)的替你生成依賴關(guān)系列表。
例如(trivial):
DEPEND= makedepend $(CFLAGS)
etc...
# what are the source dependencies

depend: $(SRCS)
$(DEPEND) $(SRCS)
etc....
# DO NOT DELETE THIS LINE -- ....
printenv.o: /usr/include/stdio.h

使用這些工具(mkdepend,mkmkf等)已經(jīng)很常見了,它們也不是太難理解和使用。
其實(shí)這些工具只是shell腳本,通過運(yùn)行cpp(或者cc -M等)來查找所有的依賴關(guān)系。
然后把依賴關(guān)系添加到Makefile的結(jié)尾。
(EOF)
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
嵌入式之行(5):我的Makefile
KBUILD系統(tǒng)原理分析
向大家推薦一個(gè)C/C 通用Makefile
移植中Makefile學(xué)習(xí) 關(guān)鍵字理解
makefile中的patsubst
makefile編譯所有c文件
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服