日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

GNU Make 簡介( 六 )



注意:"PATTERN"是大小寫敏感的 。

3.4 目錄搜索

對于大的系統(tǒng),通常將源文件和目標(biāo)文件放在不同的目錄中 。目錄搜索功能可以讓make 自動在多個(gè)目錄中搜尋依賴文件,當(dāng)你將文件重新分布是,不需要改變規(guī)則,更改搜索路徑即可 。

3.4.1‘VPATH"

make 變量"VPATH"列出make 應(yīng)當(dāng)搜索的目錄列表 。很多情況下,當(dāng)前目錄不包含依賴文件,"VPATH"描述一個(gè)對所有文件的搜索列表,包含那些是規(guī)則的目標(biāo)的文件 。如果一個(gè)目標(biāo)或者依賴文件在當(dāng)前目錄沒找到的話,"make"在"VPATH"中列出的目錄中查找同名的文件 。如果找到的話,那個(gè)文件成為依賴文件;規(guī)則可以象這些文件在當(dāng)前目錄中一樣來使用他們 。

"VPATH"變量中,目錄名以冒號或空格隔開;目錄列出的順序決定make查找的順序 。(注:在pSOSystem 2.5 移植到Win32 的GNU make 目錄名必須使用分號隔開,以下均簡稱Win32 GNU make) 。舉例說明:

VPATH = src:../headers 則規(guī)則
foo.o : foo.c
被解釋為
foo.o : src/foo.c
假設(shè)"foo.c"在當(dāng)前目錄不存在,在"src"目錄中可以找到 。

3.4.2 選擇性搜索

與"VPATH"變量相似但更具選擇性的是"vpath"指令(注意是小寫),可以指定對于符合特定模式文件的查找路徑 。這樣可以為不同類型的文件指定不同的搜索路徑 。

"vpath"指令共有三中形式:

"vpath PATTERN DirectorIES" 為匹配PATTERN 的文件名指定搜索路徑DIRECTORIES,目錄的分隔和"VPATH"的相同

"vpath PATTERN" 清除為匹配PATTERN 的文件名指定的搜索路徑
"vpath" 清除所有以前用"vpath"指定的搜索路徑
"vpath"的模式是包含"%"的字符串:這個(gè)字符串必須匹配需要搜索的依賴文件名,"%"字符匹配0 個(gè)或多個(gè)任意字符 。例如:"%.h"匹配任何以".h"結(jié)尾的文件(如果沒有%,則PATTERN 必須和依賴文件完全一致,這種用法不太多) 。

當(dāng)前目錄中不存在依賴文件時(shí),如果"vpath"中的PATTERN 匹配依賴文件名,則指令中DIRECTORIES 列出的目錄和"VPATH"中同樣處理 。舉例:

vpath %.h ../headers

告訴make 在當(dāng)前目錄中未找到的".h"文件在../headers 目錄中查找 。如果多個(gè)"vapth"的模式匹配依賴文件名,make 將逐一處理,在所有指定的目錄中搜索 。Make 按照"vapth"在makefile 中的次序;來處理它們,多個(gè)相同模式的"vapth"是相互獨(dú)立的 。

vpath %.c foo
vpath % blish
vpath %.c bar
將按照"foo",‘blish","bar"的次序查找".c"文件 。而
vpath %.c foo:bar
vpath % blish
按照"foo","bar","blish"的順序搜索 。

3.4.3 使用自動變量

目錄搜索的結(jié)果并不改變規(guī)則中的命令:命令按原樣被執(zhí)行 。因此,必須寫出與目錄搜索功相適應(yīng)的命令 。這可以通過使用"$^"這樣的自動變量來完成 。

"$^"表示規(guī)則中的所有依賴文件,包含它們所在的目錄名(參見目錄搜索);"$@"表示目標(biāo) 。例如:

foo.o : foo.c
cc -c $(CFLAGS) $^ -o $@
通常情況下,依賴文件也包含頭文件,但命令中并不提及這些文件:
變量"$<"表示第一個(gè)依賴文件:
VPATH = src:../headers
foo.o : foo.c defs.h hack.h
cc -c $(CFLAGS) $< -o $@

3.4.4 目錄搜索和隱含規(guī)則

使用"VPATH"和"vpath"指定目錄搜索也會影響隱含規(guī)則 。例如:文件"foo.o"沒有顯式規(guī)則,make 會考慮隱式規(guī)則:如果"foo.c"存在則編譯它;如果這個(gè)文件不存在,則在相應(yīng)的目錄中查找;如果"foo.c"在任一的目錄中存在,則C編譯的隱式規(guī)則被應(yīng)用 。

隱式規(guī)則的命令使用自動變量通常是必要的,這樣無需其它努力即可以使用目錄搜索得到的文件名 。

3.5 PHONY 目標(biāo)

PHONY 目標(biāo)并非實(shí)際的文件名:只是在顯式請求時(shí)執(zhí)行命令的名字 。有兩種理由需要使用PHONY 目標(biāo):避免和同名文件沖突,改善性能 。

推薦閱讀