我過去認爲 makefile 只是一種將一組組的 shell 命令列出來的簡便方法;過了一段時間我瞭解到它們是有多麼的強大、靈活以及功能齊全。這篇文章帶你領略其中一些有關規則的特性。html
備註:這些全是針對 GNU Makefile 的,若是你但願支持 BSD Makefile ,你會發現有些新的功能缺失。感謝 zge 指出這點。linux
規則是指示 make
應該如何而且什麼時候構建一個被稱做爲目標的文件的指令。目標能夠依賴於其它被稱做爲前提的文件。git
你會指示 make
如何按步驟構建目標,那就是一套按照出現順序一次執行一個的 shell 命令。語法像這樣:github
target_name : prerequisites
recipe
複製代碼
一但你定義好了規則,你就能夠經過從命令行執行如下命令構建目標:redis
$ make target_name
複製代碼
目標一經構建,除非前提改變,不然 make
會足夠聰明地再也不去運行該步驟。shell
前提代表了兩件事情:ruby
make
假定目的應當被構建。若是你想要定義一個順序可是你不想在前提改變的時候從新構建目標,你可使用一種特別的叫作「惟順序」的前提。這種前提能夠被放在普通的前提以後,用管道符(|
)進行分隔。bash
爲了便利,make
接受目標和前提的樣式。經過包含 %
符號能夠定義一種樣式。這個符號是一個能夠匹配任何長度的文字符號或者空隔的通配符。如下有一些示例:工具
%
:匹配任何文件%.md
:匹配全部 .md
結尾的文件prefix%.go
:匹配全部以 prefix
開頭以 .go
結尾的文件有一系列目標名字,它們對於 make
來講有特殊的意義,被稱做特殊目標。ui
你能夠在這個文檔發現全套特殊目標。做爲一種經驗法則,特殊目標以點開始後面跟着大寫字母。
如下是幾個有用的特殊目標:
.PHONY
:向 make
代表此目標的前提能夠被當成僞目標。這意味着 make
將老是運行,不管有那個名字的文件是否存在或者上次被修改的時間是什麼。.DEFAULT
:被用於任何沒有指定規則的目標。.IGNORE
:若是你指定 .IGNORE
爲前提,make
將忽略執行步驟中的錯誤。當你須要以你指定的改動方式改變一個變量的值,替代就十分有用了。
替代的格式是 $(var:a=b)
,它的意思是獲取變量 var
的值,用值裏面的 b
替代詞末尾的每一個 a
以代替最終的字符串。例如:
foo := a.o
bar : = $(foo:.o=.c) # sets bar to a.c
複製代碼
注意:特別感謝 Luis Lavena 讓咱們知道替代的存在。
檔案文件是用來一塊兒將多個數據文檔(相似於壓縮文件的概念)收集成一個文件。它們由 ar
Unix 工具所構建。ar
能夠用於爲任何目的建立檔案,但除了靜態庫,它已經被 tar
大量替代。
在 make
中,你可使用一個檔案文件中的單獨一個成員做爲目標或者前提,就像這樣:
archive(member) : prerequisite
recipe
複製代碼
關於 make
還有更多可探索的,可是至少這是一個起點,我強烈鼓勵你去查看文檔,建立一個笨拙的 makefile 而後就能夠探索它了。
via: monades.roperzh.com/rediscoveri…
做者:Roberto Dip 譯者:tomjlw 校對:wxy