作業部落 與 簡書 同步發佈
學習筆記,摘自陳皓的《跟我一起寫 Makefile》
Makefile規則
Makefile文件由一系列規則構成。每條規則的形式如下:
<target> : <prerequisites>
[tab] <command>
- 第一行冒號前面的部分,叫做“目標”,冒號後面的部分叫做“依賴條件”;
- 第二行必須由一個tab鍵開始,後面跟着“命令”。
模式規則
可以使用模式規則來定義一個隱含規則。一個模式規則像一個一般的規則,只是在規則中,目標的定義需要有“%”字符。它的意思是表示一個或多個任意字符。在依賴目標中同樣可以使用“%”,只是依賴目標中的“%”的取值,取決於其目標。也就是說,目標中的模式的“%”決定了依賴目標中“%”的樣子。如:
%.o : %.c
其含義是,指出了怎麼從所有的[.c]文件生成相應的[.o]文件的規則。
自動化變量
所謂自動化變量,就是這種變量會把模式中所定義的一系列的文件自動地挨個取出,直到所有的符合模式的文件都取完了。這種自動化變量直營出現在規則的命令中。
目標
$@
表示規則中的目標文件集。在模式規則中,如果有多個目標,那麼,”$@”就是匹配與目標中模式定義的集合。
$%
僅當目標是函數庫文件時,”
$<
依賴目標中的第一個目標名字。如果依賴目標是以模式(即”%”)定義的,那麼”%<”將是符合模式的一系列的文件集。注意,其是一個個取出來的。
依賴目標
$?
所有比目標新的依賴目標的集合。以空格分隔。
$^
所有的依賴目標的集合。以空格分隔。如果在依賴目標中有多個重複的,那麼這個變量會取出重複的依賴目標,只保留一份。
$+
這個變量很像”$^”,也是所有依賴目標的幾何。只是它不去除重複的依賴目標。
$*
這個變量表示目標模式中”%”及之前的部分。如果目標的模式是”a.%.b”,那麼,"$*"
的值是”dir/a.foo”。這個變量對於構造有關聯的文件名是比較有效。
如果目標中沒有模式的定義,那麼"$*"
也就不能被推導出來,但是,如果目標文件的後綴是make所識別的,那麼"$*"
的值就是”foo”。這個特性是GNU make的,很有可能不兼容其它版本的make,所以應儘量避免使用"$*"
。
如果目標中的後綴是make所不能識別的,那麼"$*"
就是空值。