Makefile自動化變量

作業部落簡書 同步發佈


學習筆記,摘自陳皓的《跟我一起寫 Makefile》

Makefile規則

Makefile文件由一系列規則構成。每條規則的形式如下:

<target> : <prerequisites>
[tab] <command>
  • 第一行冒號前面的部分,叫做“目標”,冒號後面的部分叫做“依賴條件”;
  • 第二行必須由一個tab鍵開始,後面跟着“命令”。

模式規則

可以使用模式規則來定義一個隱含規則。一個模式規則像一個一般的規則,只是在規則中,目標的定義需要有“%”字符。它的意思是表示一個或多個任意字符。在依賴目標中同樣可以使用“%”,只是依賴目標中的“%”的取值,取決於其目標。也就是說,目標中的模式的“%”決定了依賴目標中“%”的樣子。如:

    %.o : %.c

其含義是,指出了怎麼從所有的[.c]文件生成相應的[.o]文件的規則。

自動化變量

所謂自動化變量,就是這種變量會把模式中所定義的一系列的文件自動地挨個取出,直到所有的符合模式的文件都取完了。這種自動化變量直營出現在規則的命令中。


目標
$@
表示規則中的目標文件集。在模式規則中,如果有多個目標,那麼,”$@”就是匹配與目標中模式定義的集合。

$%
僅當目標是函數庫文件時,” %”就是”bar.o”**,”%@”就是”foo.a”。如果目標不是函數庫文件,那麼其值爲空。

$<
依賴目標中的第一個目標名字。如果依賴目標是以模式(即”%”)定義的,那麼”%<”將是符合模式的一系列的文件集。注意,其是一個個取出來的。


依賴目標
$?
所有比目標新的依賴目標的集合。以空格分隔。

$^
所有的依賴目標的集合。以空格分隔。如果在依賴目標中有多個重複的,那麼這個變量會取出重複的依賴目標,只保留一份。

$+
這個變量很像”$^”,也是所有依賴目標的幾何。只是它不去除重複的依賴目標。

$*
這個變量表示目標模式中”%”及之前的部分。如果目標的模式是”a.%.b”,那麼,"$*"的值是”dir/a.foo”。這個變量對於構造有關聯的文件名是比較有效。
如果目標中沒有模式的定義,那麼"$*"也就不能被推導出來,但是,如果目標文件的後綴是make所識別的,那麼"$*"的值就是”foo”。這個特性是GNU make的,很有可能不兼容其它版本的make,所以應儘量避免使用"$*"
如果目標中的後綴是make所不能識別的,那麼"$*"就是空值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章