1. 程式人生 > 實用技巧 >Makefile中的自動化變數

Makefile中的自動化變數

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所不能識別的,那麼 $* 就是空值。