Makefile的規(guī)則
1.make如何確定目標(biāo)文件過期?
對(duì)比目標(biāo)文件和目標(biāo)文件的依賴,如果目標(biāo)文件的修改時(shí)間戳要比依賴文件的時(shí)間戳老,則過期,需要重新生成,否則不需要執(zhí)行命令重新生成。
2.在編譯.c或者.cpp/.cc文件的時(shí)候,我們不需要把頭文件加入命令中,因?yàn)橐话?c文件里面就包含了頭文件。而在編寫目標(biāo)的依賴的時(shí)候,我們還是要把頭文件加入到依賴?yán)锩?/strong>的。
可以看看下面這個(gè)例子(這個(gè)例子摘自《GNU make中文版》 徐海兵譯著):
foo.o : foo.c defs.h # module for twiddling the frobs cc -c -g foo.c
可以看到頭文件被加入目標(biāo)的依賴中去了。其中#是注釋符。
2.目標(biāo)的依賴其實(shí)還分為兩種
1.常規(guī)依賴,特性為每次更新這種依賴,目標(biāo)文件在make的時(shí)候就要重建。
2.order-only依賴,特性為,目標(biāo)文件不存在的時(shí)候才會(huì)參與規(guī)則命令的執(zhí)行。如果目標(biāo)文件存在,即使修改了這種依賴,也不會(huì)執(zhí)行規(guī)則的命令來重建目標(biāo)文件。
這兩種依賴一般由管道符來分割“|”,前面是常規(guī)依賴,后面的order-only依賴。
可以看看下面這個(gè)例子(這個(gè)例子摘自《GNU make中文版》 徐海兵譯著):
LIBS = libtest.a foo : foo.c | $(LIBS) $(CC) $(CFLAGS) $< -o $@ $(LIBS)
3.文件名使用通配符
Maekfile 中表示文件名時(shí)可使用通配符??墒褂玫耐ㄅ浞校骸?”、“?”和“[…]”。
在 Makefile 中通配符的用法和含義和 Linux(unix)的 Bourne shell 完全相同。
Makefile 中統(tǒng)配符可以出現(xiàn)在以下兩種場(chǎng)合:
- 可以用在規(guī)則的目標(biāo)、依賴中,make 在讀取 Makefile 時(shí)會(huì)自動(dòng)對(duì)其進(jìn)行匹配
處理(通配符展開); - 可出現(xiàn)在規(guī)則的命令中,通配符的通配處理是在 shell 在執(zhí)行此命令時(shí)完成的。
除這兩種情況之外的其它上下文中,不能直接使用通配符。而是需要通過函數(shù)
“wildcard”(這個(gè)以后有時(shí)間介紹函數(shù)的時(shí)候再進(jìn)一步介紹)來實(shí)現(xiàn)。
如果文件名中就包含了通配符,那么在Makefile書寫的時(shí)候要加上\來進(jìn)行轉(zhuǎn)義,否則make命令將會(huì)把它解釋為通配符。
5.目錄搜索
a.一般搜索
GNU make 可以識(shí)別一個(gè)特殊變量“VPATH”。通過變量“VPATH”可以指定依賴文件的搜索路徑,當(dāng)規(guī)則的依賴文件在當(dāng)前目錄不存在時(shí),make 會(huì)在此變量所指定的目錄下去尋找這些依賴文件。通常我們都是用此變量來指定規(guī)則的依賴文件的搜索路徑。其實(shí)“VPATH”變量所指定的是 Makefile 中所有文件的搜索路徑,包括了規(guī)則的依賴文件和目標(biāo)文件。定義變量“VPATH”時(shí),使用空格或者冒號(hào)(:)將多個(gè)需要搜索的目錄分開。make搜索目錄的順序是按照變量“VPATH”定義中的目錄順序進(jìn)行的(當(dāng)前目錄永遠(yuǎn)是第一搜索目錄)。
b.選擇性搜索
“vpath”關(guān)鍵字(全小寫的)
它的使用方法有三種:
1) vpath PATTERN DIRECTORIES
為所有符合模式“PATTERN”的文件指定搜索目錄“DIRECTORIES”。多個(gè)目
錄使用空格或者冒號(hào)(:)分開。
2) vpath PATTERN
清除之前為符合模式“PATTERN”的文件設(shè)置的搜索路徑。
3) vpath
清除所有已被設(shè)置的文件搜索路徑。
vapth 使用方法中的“PATTERN”需要包含模式字符“%”。“%”意思是匹配一個(gè)
或者多個(gè)字符,例如,“%.h”表示所有以“.h”結(jié)尾的文件。如果在“PATTERN”中
沒有包含模式字符“%”,那么它就是一個(gè)明確的文件名,這樣就是給定了此文件的所在目錄。