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

GNU Make 簡(jiǎn)介( 四 )



2.4 如何重新生成makefile

有時(shí)候makefile 是從其它文件生成的,比如RCS 或SCCS 文件 。如果makefile 是由其它文件生成的,需要make讀入最新版本的makefile 。

在讀入所有makefile 之后,make 認(rèn)為每個(gè)makefile 是一個(gè)目標(biāo),試圖去更新它;如果makefile 中有一條如何更新它的規(guī)則,或者有適用的隱式規(guī)則,需要的更新會(huì)進(jìn)行 。所有的makefile 檢查完之后,如果有的改變了,make 重新開(kāi)始再讀入(make 會(huì)試圖再做更新,但通常不會(huì)再改變了,因?yàn)橐呀?jīng)是最新的了) 。

如果一個(gè)文件使用雙冒號(hào)規(guī)則,提供了命令但沒(méi)有依賴關(guān)系,文件始終會(huì)被更新 。在makefile 的情況下,如果makefile 雙冒號(hào)規(guī)則,提供了命令但沒(méi)有依賴關(guān)系,這樣makefile 始終會(huì)重新生成,這會(huì)導(dǎo)致循環(huán):make 只是在不斷更新makefile,卻不干活 。為避免這種情況,make 不會(huì)重新生成那些只有命令沒(méi)有依賴關(guān)系的雙冒號(hào)規(guī)則的makefile 。

如果沒(méi)有使用"-f"或"--file"選項(xiàng),make 會(huì)嘗試缺省的makefile 文件名 。和指明"-f"或"--file"選項(xiàng)不同,make 不能確定這些文件是否應(yīng)當(dāng)存在 。然而,如果缺省makefile 不存在但可以通過(guò)運(yùn)行make 規(guī)則生成,你可能希望這些規(guī)則被運(yùn)行使得makefile 可以使用 。

因此,如果沒(méi)有缺省makefile,make 試圖按照makefile 名查找的順序生成它,直到成功或名字用完 。注意如果make 不能找到或生成makefile,這并不是錯(cuò)誤;makefile 不總是必需的 。

當(dāng)使用"-t"或"--touch"選項(xiàng)時(shí),不希望使用過(guò)時(shí)的makefile 來(lái)決定那個(gè)目標(biāo)來(lái)touch 。所以"-t"選項(xiàng)對(duì)makefile 更新不起作用;類似"-q"(or ‘-question")和"-n"(or "-just-print")不阻止makefile 的更新,因?yàn)檫^(guò)時(shí)的makefile 會(huì)產(chǎn)生錯(cuò)誤的輸出 。這樣"make -f mfile -n foo"會(huì)更新"mfile",讀入它,打印出更新"foo"需要執(zhí)行的命令但不運(yùn)行這些命令 。與"foo"有關(guān)的命令是更新過(guò)的"mfile"中的內(nèi)容 。

但是有時(shí)不希望更新makefile,可以將makefile 作為命令行的目標(biāo),當(dāng)makefile被顯式指定為目標(biāo)時(shí),"-t"選項(xiàng)也適用于它們 。

這樣"make -f mfile -n mfile foo"會(huì)讀入"mfile",打印出更新執(zhí)行的命令,"foo"的命令是當(dāng)前的"mfile"中的內(nèi)容 。

2.5 重載makefile

可以使用"include"指令來(lái)包含其它makefile,增加目標(biāo)的變量定義 。然而,make 不允許同一個(gè)目標(biāo)有不同的命令,有其它的途徑可以達(dá)到目的 。

假設(shè)有"makefile" 和"mfile","makfile"要包含"mfile",但都有對(duì)于目標(biāo)"foo"的規(guī)則 。這是可以在"makefile"中寫(xiě)一條匹配任意模式的規(guī)則,指明當(dāng)make 在"makefile"中未找到目標(biāo)時(shí),搜索"mfile":

foo:
frobnicate > foo
%: force
@$(MAKE) -f mfile $@
force: ;

當(dāng)執(zhí)行"make foo"時(shí),make 找到"makefile",執(zhí)行命令" frobnicate > foo";執(zhí)行"make bar"時(shí),在"makefile"中未找到相應(yīng)的規(guī)則,這時(shí)模式規(guī)則適用,執(zhí)行命令"make -f mfile bar","makefile"中未提及的其它目標(biāo)也是類似的 。
這種方法之所有工作是因?yàn)槟J揭?guī)則的模式是"%",可以匹配任何的目標(biāo);這條規(guī)則的依賴是"force",保證即使目標(biāo)存在命令也會(huì)執(zhí)行;"force"規(guī)則的命令為空防止"make"為其搜索隱式規(guī)則-這樣會(huì)導(dǎo)致依賴循環(huán) 。

3 規(guī)則

makefile 中的規(guī)則描述如何生成特定的文件,即規(guī)則的目標(biāo) 。規(guī)則列出了目標(biāo)的依賴文件,指定生成或更新目標(biāo)的命令 。規(guī)則的次序是不重要的,除非是確定缺省目標(biāo):缺省目標(biāo)是第一個(gè)makefile 中的第一個(gè)規(guī)則;如果第一個(gè)規(guī)則有多個(gè)目標(biāo),第一個(gè)目標(biāo)是缺省的 。有兩個(gè)例外:以"."開(kāi)頭的目標(biāo)不是缺省目標(biāo);模式規(guī)則對(duì)缺省目標(biāo)沒(méi)有影響 。

通常我們所寫(xiě)的第一個(gè)規(guī)則是編譯整個(gè)或makefile 中指定的所有程序 。

推薦閱讀