1.規則的語法
targets : prerequisites
command
...
或
targets : prerequisites ; command
command
...
兩者區別:第二種command和prerequisites在同一行且用;號隔開
2.在規則中使用萬用字元
make支援三個萬用字元:「*」,「?」和「~」
3.檔案搜尋
1).vpath
特殊變數,如果沒有指明這個變數,make只會在當前的目錄中去找尋依賴檔案和目標檔案。如果定義了這個變數,那麼,make就會在當前目錄找不到的情況下,到所指定的目錄中去找尋檔案了。
vpath = src:../headers
2).vpath
關鍵字(注意,它是全小寫的),這不是變數,這是乙個make的關鍵字,這和上面提到的那個vpath變數很類似,但是它更為靈活。它可以指定不同的檔案在不同的搜尋目錄中。這是乙個很靈活的功能。它的使用方法有三種:
a、vpath pattern directories
為符合模式pattern的檔案指定搜尋目錄directories。
b、vpath pattern
清除符合模式pattern的檔案的搜尋目錄。
c、vpath
清除所有已被設定好了的檔案搜尋目錄。
vpath使用方法中的pattern>要包含「%」字元。「%」的意思是匹配零或若干字元,舉例:
vpath %.h ../headers
vpath %.c foo
vpath %.c blish
vpath %.c bar
vpath %.c foo:bar
vpath %.c blish
4.偽目標
「偽目標」並不是乙個檔案,只是乙個標籤,由於「偽目標」不是檔案,所以make無法生成它的依賴關係和決定它是否要執行。我們只有通過顯式地指明這個「目標」才能讓其生效。當然,「偽目標」的取名不能和檔名重名,不然其就失去了「偽目標」的意義了。
當然,為了避免和檔案重名的這種情況,我們可以使用乙個特殊的標記「.phony」來顯式地指明乙個目標是「偽目標」,向make說明,不管是否有這個檔案,這個目標就是「偽目標」。
舉例:
.phony : clean
clean :
rm *.o temp
all : prog1 prog2 prog3
.phony : all
prog1 : prog1.o utils.o
cc -o prog1 prog1.o utils.o
prog2 : prog2.o
cc -o prog2 prog2.o
prog3 : prog3.o sort.o utils.o
cc -o prog3 prog3.o sort.o utils.o
注:一次生成多個目標
.phony : cleanall cleanobj cleandiff
cleanall : cleanobj cleandiff
rm program
cleanobj :
rm *.o
cleandiff :
rm *.diff
注:偽目標作為依賴
5.多目標
makefile的規則中的目標可以不止乙個,其支援多目標,有可能我們的多個目標同時依賴於乙個檔案,並且其生成的命令大體類似。於是我們就能把其合併起來
bigoutput littleoutput : text.g
generate text.g -$(subst output,,$@) > $@
其中,-(su
bsto
utpu
t,
,(subst output,,
(subst
outp
ut,,
@)中的「」表示
執行乙個
make
file
的函式,
函式名為
subs
t,後面
的為引數
。這裡的
這個函式
是替換字
符串的意
思,
「」表示執行乙個makefile的函式,函式名為subst,後面的為引數。這裡的這個函式是替換字串的意思,「
」表示執行一
個mak
efil
e的函式
,函式名
為sub
st,後
面的為參
數。這裡
的這個函
數是替換
字串的
意思,「
@」表示目標的集合,就像乙個陣列,「$@」依次取出目標,並執於命令。.
6.靜態模式
語法:
: : ...
舉例:
files = foo.elc bar.o lose.o
$(filter %.o,$(files)): %.o: %.c
$(cc) -c $(cflags) $< -o $@
$(filter %.elc,$(files)): %.elc: %.el
emacs -f batch-byte-compile $<
7.自動生成依賴性
gcc -m(或-mm) 自動找尋原始檔中包含的標頭檔案,並生成乙個依賴關係
我們可以寫出[.c]檔案和[.d]檔案的依賴關係,並讓make自動更新或自成[.d]檔案,並把其包含在我們的主makefile中,這樣,我們就可以自動化地生成每個檔案的依賴關係了。
%.d: %.c
@set -e; rm -f $@; \
$(cc) -m $(cppflags) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
這個規則的意思是,所有的[.d]檔案依賴於[.c]檔案,「rm -f @」的
意思是刪
除所有的
目標,也
就是[.
d]檔案
,第二行
的意思是
,為每個
依賴檔案
「@」的意思是刪除所有的目標,也就是[.d]檔案,第二行的意思是,為每個依賴檔案「
@」的意思是
刪除所有
的目標,
也就是[
.d]文
件,第二
行的意思
是,為每
個依賴文
件「<」,也就是[.c]檔案生成依賴檔案,「@」表
示模式「
@」表示模式「%.d」檔案,如果有乙個c檔案是name.c,那麼「%」就是 「name」,「
@」表示模式
「$$$」意為乙個隨機編號,第二行生成的檔案有可能是「name.d.12345」,第三行使用sed命令做了乙個替換,關於sed命令的用法請參看相關的使用文件。第四行就是刪除臨時檔案。
接下來,我們就要把這些自動生成的規則放進我們的主makefile中。我們可以使用makefile的「include」命令,來引入別的makefile檔案
sources = foo.c bar.c
include $(sources:.c=.d)
跟我一起寫 Makefile
概述 什麼是makefile?或許很多winodws的程式設計師都不知道這個東西,因為那些windows的ide都為你做了這個工作,但我覺得要作乙個好的和professional的程式設計師,makefile還是要懂。這就好像現在有這麼多的html的編輯器,但如果你想成為乙個專業人士,你還是要了解h...
跟我一起寫 Makefile
概述 什麼是makefile?或許很多winodws的程式設計師都不知道這個東西,因為那些windows的ide都為你做了這個工作,但我覺得要作乙個好的和professional的程式設計師,makefile還是要懂。這就好像現在有這麼多的html的編輯器,但如果你想成為乙個專業人士,你還是要了解h...
跟我一起寫 Makefile
跟我一起寫 makefile 陳皓 概述 什麼是makefile?或許很多winodws的程式設計師都不知道這個東西,因為那些windows的ide都為你做了這個工作,但我覺得要作乙個好的和professional的程式設計師,makefile還是要懂。這就好像現在有這麼多的html的編輯器,但如果...