Makefile中的自動化變數
阿新 • • 發佈:2020-07-13
Makefile中的自動化變數
參考連結:https://seisman.github.io/how-to-write-makefile/implicit_rules.html#id8
簡介
所謂自動化變數,就是這種變數會把模式中所定義的一系列的檔案自動地挨個取出,直至所有的符合模式的檔案都取完。這種自動化變數只應出現在規則的命令中。
變數列表
下面是所有的自動化變數及其說明:
$@
: 表示規則中的目標檔案集。在模式規則中,如果有多個目標,那麼,$@
就是匹配於目標中模式定義的集合。$%
: 僅當目標是函式庫檔案中,表示規則中的目標成員名。例如,如果一個目標是foo.a(bar.o)
,那麼,$%
bar.o
,$@
就是foo.a
。如果目標不是函式庫檔案(Unix下是.a
,Windows下是.lib
),那麼,其值為空。$<
: 依賴目標中的第一個目標名字。如果依賴目標是以模式(即%
)定義的,那麼$<
將是符合模式的一系列的檔案集。注意,其是一個一個取出來的。$?
: 所有比目標新的依賴目標的集合。以空格分隔。$^
: 所有的依賴目標的集合。以空格分隔。如果在依賴目標中有多個重複的,那麼這個變數會去除重複的依賴目標,只保留一份。$+
: 這個變數很像$^
,也是所有依賴目標的集合。只是它不去除重複的依賴目標。$*
: 這個變量表示目標模式中%
dir/a.foo.b
,並且目標的模式是a.%.b
,那麼,$*
的值就是dir/a.foo
。這個變數對於構造有關聯的檔名是比較有較。如果目標中沒有模式的定義,那麼$*
也就不能被推匯出,但是,如果目標檔案的字尾是make所識別的,那麼$*
就是除了字尾的那一部分。例如:如果目標是foo.c
,因為.c
是make所能識別的字尾名,所以,$*
的值就是foo
。這個特性是GNU make的,很有可能不兼容於其它版本的make,所以,你應該儘量避免使用$*
,除非是在隱含規則或是靜態模式中。如果目標中的字尾是make所不能識別的,那麼$*
就是空值。