模式規則
模式規則類似於普通規則。只是在模式規則中,目標名中需要包含有模式字元「%」(乙個),包含有模式字元「%」的目標被用來匹配乙個檔名,「%」可以匹配任何非空字串。規則的依賴檔案中同樣可以使用「%」,依賴檔案中模式字元「%」的取值情況由目標中的「%」來決定。例如:對於模式規則「%.o : %.c」,它表示的含義是:所有的.o檔案依賴於對應的.c檔案。
有一點需要注意的是,"%"的展開發生在變數和函式的展開之後,變數和函式的展開發生在make載入makefile時,而模式規則中的"%"則發生在執行時。
1、模式規則介紹
模式規則中,至少在規則的目標定義中要包含"%",否則,就是一般的規則。目標中的"%"定義表示對檔名的匹配,"%"表示長度任意的非空字串。例如:"%.c"表示以".c"結尾的檔名(檔名的長度至少為3),而"s.%.c"則表示以"s."開頭,".c"結尾的檔名(檔名的長度至少為5)。
如果"%"定義在目標中,那麼,目標中的"%"的值決定了依賴目標中的"%"的值,也就是說,目標中的模式的"%"決定了依賴目標中"%"的樣子。例如有乙個模式規則如下:
%.o : %.c
其含義是,指出了怎麼從所有的[.c]檔案生成相應的[.o]檔案的規則。如果要生成的目標是"a.o b.o",那麼"%c"就是"a.c b.c"。
一旦依賴目標中的"%"模式被確定,那麼,make會被要求去匹配當前目錄下所有的檔名,一旦找到,make就會規則下的命令,所以,在模式規則中,目標可能會是多個的,如果有模式匹配出多個目標,make就會產生所有的模式目標,此時,make關心的是依賴的檔名和生成目標的命令這兩件事。
2、模式規則示例
下面這個例子表示了,把所有的[.c]檔案都編譯成[.o]檔案.
%.o : %.c
$(cc) -c $(cflags) $(cppflags) $< -o $@
其中,"$@"表示所有的目標的挨個值,"$<"表示了所有依賴目標的挨個值。這些奇怪的變數我們叫"自動化變數",後面會詳細講述。
自動化變數
模式規則中,規則的目標和依賴檔名代表了一類檔名;規則的命令是對所有這一類檔案重建過程的描述,顯然,在命令中不能出現具體的檔名,否則模式規則失去意義。那麼在模式規則的命令列中該如何表示檔案,將是本小節的討論的重點。
假如你需要書寫乙個將.c檔案編譯到.o檔案的模式規則,那麼你該如何為gcc書寫正確的源檔名?當然了,不能使用任何具體的檔名,因為在每一次執行模式規則時源檔名都是不一樣的。為了解決這個問題,就需要使用「自動環變數」,自動化變數的取值是根據具體所執行的規則來決定的,取決於所執行規則的目標和依賴檔名。所謂自動化變數,就是這種變數會把模式中所定義的一系列的檔案自動地挨個取出,直至所有的符合模式的檔案都取完了。這種自動化變數只應出現在規則的命令中。
下面是所有的自動化變數及其說明:
$@表示規則中的目標檔案集。在模式規則中,如果有多個目標,那麼,"$@"就是匹配於目標中模式定義的集合。
$%僅當目標是函式庫檔案中,表示規則中的目標成員名。例如,如果乙個目標是"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所不能識別的,那麼"$*"就是空值。
makefile自動化變數
makefile自動化變數 表示規則中的目標檔案集。在模式規則中,如果有多個目標,那麼,就是匹配於目標中模式定義的集合。僅當目標是函式庫檔案中,表示規則中的目標成員名。例如,如果乙個目標是 foo.a bar.o 那麼,就是 bar.o 就是 foo.a 如果目標不是函式庫檔案 unix下是 a w...
makefile 自動化變數
代表規則中的目標檔名。如果目標是乙個文件 linux中,一般稱.a檔案為文件 那麼它代表這個文件的檔名。在多目標的模式規則中,它代表的是哪個觸發規則被執行的目標檔名。規則的目標檔案是乙個靜態庫檔案時,代表靜態庫的乙個成員名。例如,規則的目標是 foo.a bar.o 那麼,的值就為 bar.o 的值...
Makefile自動化變數
在上述的模式規則中,目標和依賴檔案都是一系例的檔案,那麼我們如何書寫乙個命令來完成從不同的依賴檔案生成相應的目標?因為在每一次的對模式規則的解析時,都會是不同的目標和依賴檔案。自動化變數就是完成這個功能的。在前面,我們已經對自動化變數有所提涉,相信你看到這裡已對它有乙個感性認識了。所謂自動化變數,就...