學(xué)習(xí)筆記阅爽,摘自陳皓的《跟我一起寫 Makefile》
Makefile規(guī)則
Makefile文件由一系列規(guī)則構(gòu)成谅河。每條規(guī)則的形式如下:
<target> : <prerequisites>
[tab] <command>
- 第一行冒號前面的部分行施,叫做“目標”延刘,冒號后面的部分叫做“依賴條件”;
- 第二行必須由一個tab鍵開始极谊,后面跟著“命令”诡右。
模式規(guī)則
可以使用模式規(guī)則來定義一個隱含規(guī)則。一個模式規(guī)則像一個一般的規(guī)則轻猖,只是在規(guī)則中帆吻,目標的定義需要有“%”字符。它的意思是表示一個或多個任意字符咙边。在依賴目標中同樣可以使用“%”猜煮,只是依賴目標中的“%”的取值,取決于其目標败许。也就是說王带,目標中的模式的“%”決定了依賴目標中“%”的樣子。如:
%.o : %.c
其含義是市殷,指出了怎么從所有的[.c]文件生成相應(yīng)的[.o]文件的規(guī)則愕撰。
自動化變量
所謂自動化變量,就是這種變量會把模式中所定義的一系列的文件自動地挨個取出被丧,直到所有的符合模式的文件都取完了。這種自動化變量直營出現(xiàn)在規(guī)則的命令中绪妹。
目標
$@
表示規(guī)則中的目標文件集甥桂。在模式規(guī)則中,如果有多個目標邮旷,那么黄选,"$@"就是匹配與目標中模式定義的集合。
$%
僅當目標是函數(shù)庫文件時,"$%"表示規(guī)則中的目標成員名办陷。如:如果目標是"foo.a(bar.o)"貌夕,那么,"$%"就是"bar.o","%@"就是"foo.a"民镜。如果目標不是函數(shù)庫文件啡专,那么其值為空。
$<
依賴目標中的第一個目標名字制圈。如果依賴目標是以模式(即"%")定義的们童,那么"%<"將是符合模式的一系列的文件集。注意鲸鹦,其是一個個取出來的慧库。
依賴目標
$?
所有比目標新的依賴目標的集合。以空格分隔馋嗜。
$^
所有的依賴目標的集合齐板。以空格分隔。如果在依賴目標中有多個重復(fù)的葛菇,那么這個變量會取出重復(fù)的依賴目標甘磨,只保留一份。
$+
這個變量很像"$^"熟呛,也是所有依賴目標的幾何宽档。只是它不去除重復(fù)的依賴目標。
$*
這個變量表示目標模式中"%"及之前的部分庵朝。如果目標的模式是"a.%.b"吗冤,那么,"$*"
的值是"dir/a.foo"九府。這個變量對于構(gòu)造有關(guān)聯(lián)的文件名是比較有效椎瘟。
如果目標中沒有模式的定義,那么"$*"
也就不能被推導(dǎo)出來侄旬,但是肺蔚,如果目標文件的后綴是make所識別的,那么"$*"
的值就是"foo"儡羔。這個特性是GNU make的宣羊,很有可能不兼容其它版本的make,所以應(yīng)盡量避免使用"$*"
汰蜘。
如果目標中的后綴是make所不能識別的仇冯,那么"$*"
就是空值。