1. 程式人生 > >Makefile規則(一):生成多個目標

Makefile規則(一):生成多個目標

這一篇,主要講述利用偽目標特性可以生成多個目標,以及make的檔案搜尋設定


target : prerequisites
command


target : prerequisites ; command
command

1、 makefile:依賴關係,生成目標的方法
2、 上面的語法規則:command和prerequisites在一行,以分號隔開。
3、 規則的萬用字元:*、?、[...]
(1) “~”:
~/test表示當前使用者的$HOME目錄下的test目錄
~hchen/test表示使用者hchen的宿主目錄下的test目錄
在Win或MS-DOS下,使用者沒有宿主目錄,則~所指目錄根據環境變數HOME而定
(2) 萬用字元可替代一系列的檔案。若檔名中有萬用字元*,則需要使用反斜槓“\*”,例子:
clean :
rm -f *.o

print : *.c
lpr -p $?
touch print

objects = *.o,這句話是objects的值是*.o,而不是表示能像巨集一樣展開的所有[.o]檔案的的集合。若想

要萬用字元在變數中展開:objects := $(wildcard *.o),這用法要使用關鍵字wildcard


4、 檔案搜尋:
在大工程中,大量的原始檔,檔案搜尋功能是很重要的。我們一般會為原始檔進行分類,併發在不同目錄

中。一般的做法是讓make自動去搜索目標檔案的依賴檔案,當然也可以直接在檔案前加上路徑。

自動尋找倆種方法
(1) VPATH = src:../headers
上面定義的VPATH變數指定了倆個目錄,src和../headers,make按順序進行搜尋。用冒號分隔。
(2) vpath

全小寫。三種格式:
<1> vpath <pattern> <directories>
為符合模式<pattern>指定搜尋目錄<directories>
<2> vpath <pattern>
清除符合模式<pattern>的檔案的搜尋目錄
<3> vpath
清除所有已設定好了的檔案的搜尋目錄

vpath使用方法中的<pattern>需要包含”%”字元。“%”的意思是匹配零或若干字元。例如:%.h表示所

有以.h結尾的檔案。<pattern>指定了要搜尋的檔案集,而<directories>則指定了<pattern>的檔案集的

搜尋的目錄。例:
vpath %.h ../headers

vpath的用法可以很靈活。
vpath %.c foo
vpath % blish
vpath %.c bar
順序去搜索:foo、blish、bar
vpath %.c foo:bar
vpath % blish
順序搜素:foo、bar、blish

5、 偽目標:有一個很重要的作用,同時生成多個目標檔案。
使用.PHONY : clean,顯示的指明clean是一個偽目標,向make說明不管是否有這個檔案,在makefile中的

clean都是一個偽目標,一般不建議跟檔名重名去命名這個標籤,它只是一個要執行的動作。
.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

由於偽目標的特性,總是被執行,其依賴的三個目標總不如all新,所以三個目標的規則總是被執行,這

樣就達到了一口氣同時生成多個目標的目的。

偽目標也可以是依賴檔案:
.PHONY : cleanall cleanobj cleandiff

cleanall : cleanobj cleandiff
rm program

cleanobj :
rm *.o

cleandiff :
rm *.diff

這樣,就可以使用make cleanall/make cleanobj/make cleandiff三種命令,實現不用的目的。

Makefile規則(二)介紹如何自動生成目標的依賴關係並且自動更新依賴關係

Makefile規則(三)中介紹變數,瞭解變數的使用就可以很方便的簡寫makefile了