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

Makefile工具的使用( 四 )


如果沒有使用"-f"或"--file"選項,make會嘗試缺省的makefile文件名 。和指明"-f"或"--file"選項不同,make不能確定這些文件是否應當存在 。然而,如果缺省makefile不存在但可以通過運行make規(guī)則生成,你可能希望這些規(guī)則被運行使得makefile可以使用 。
因此,如果沒有缺省makefile,make試圖按照makefile名查找的順序生成它,直到成功或名字用完 。注意如果make 不能找到或生成makefile,這并不是錯誤;makefile不總是必需的 。
當使用"-t"或"--touch"選項時,不希望使用過時的makefile來決定那個目標來touch 。所以"-t"選項對makefile更新不起作用;類似"-q"(or ‘—question")和"-n"(or "—just-print")不阻止makefile的更新,因為過時的makefile會產生錯誤的輸出 。這樣"make –f mfile –n foo"會更新"mfile",讀入它,打印出更新"foo"需要執(zhí)行的命令但不運行這些命令 。與"foo"有關的命令是更新過的"mfile"中的內容 。
但是有時不希望更新makefile,可以將makefile作為命令行的目標,當makefile被顯式指定為目標時,"-t"選項也適用于它們 。
這樣"make –f mfile –n mfile foo"會讀入"mfile",打印出更新執(zhí)行的命令,"foo"的命令是當前的"mfile"中的內容 。
2.5重載makefile
可以使用"include"指令來包含其它makefile,增加目標的變量定義 。然而,make不允許同一個目標有不同的命令,有其它的途徑可以達到目的 。
假設有"makefile" 和"mfile","makfile"要包含"mfile",但都有對于目標"foo"的規(guī)則 。這是可以在"makefile"中寫一條匹配任意模式的規(guī)則,指明當make在"makefile"中未找到目標時,搜索"mfile":
foo:
frobnicate > foo
%: force
@$(MAKE) -f mfile $@
force: ;
當執(zhí)行"make foo"時,make找到"makefile",執(zhí)行命令" frobnicate > foo";執(zhí)行"make bar"時,在"makefile"中未找到相應的規(guī)則,這時模式規(guī)則適用,執(zhí)行命令"make –f mfile bar","makefile"中未提及的其它目標也是類似的 。
這種方法之所有工作是因為模式規(guī)則的模式是"%",可以匹配任何的目標;這條規(guī)則的依賴是"force",保證即使目標存在命令也會執(zhí)行;"force"規(guī)則的命令為空防止"make"為其搜索隱式規(guī)則-這樣會導致依賴循環(huán) 。
3規(guī)則
makefile中的規(guī)則描述如何生成特定的文件,即規(guī)則的目標 。規(guī)則列出了目標的依賴文件,指定生成或更新目標的命令 。
規(guī)則的次序是不重要的,除非是確定缺省目標:缺省目標是第一個makefile中的第一個規(guī)則;如果第一個規(guī)則有多個目標,第一個目標是缺省的 。有兩個例外:以"."開頭的目標不是缺省目標;模式規(guī)則對缺省目標沒有影響 。
通常我們所寫的地一個規(guī)則是編譯整個或makefile中指定的所有程序 。
3.1例子
foo.o : foo.c defs.h # module for twiddling the frobs
cc -c -g foo.c
它的目標是"foo.o",依賴于"foo.c"和"defs.h",有一個命令"cc –c –g foo.c" 。命令行以TAB字符開始標識它是一個命令 。
這條規(guī)則說明兩件事:
?;如何決定"foo.o"是舊的:如果它不存在,或者"foo.c"或者"defs.h"比它新 。
?;如何更新"foo.o"文件:通過運行"cc"程序 。命令未提及"defs.h",擔可以猜想"foo.c"包含了它,這是"defs.h"被置于依賴關系中的理由 。
3.2規(guī)則的語法
語法如下:
TARGETS : DEPENDENCIES
COMMAND
...
或者
TARGETS : DEPENDENCIES ; COMMAND
COMMAND
...
TARGETS是以空格隔開的文件名,統(tǒng)配符可以使用 。通常一個規(guī)則只有一個目標,偶爾也有多個 。
命令行以TAB鍵開始 。第一條命令可在依賴關系的下一行;或者在同一行,在分號后面;兩種方式效果相同 。
因為"$"符號被用做變量引用,如果要在規(guī)則中使用"$"符號,必須寫兩個:"$$" ??梢杂?"符號來分割一個長行,這不是必須的,因為make對行的長度沒有限制 。

推薦閱讀