定義模式規則
函數
使用模式規則來定義一個隱含規則。一個模式規則就好像一個通常的規則,只是在規則中,目標的定義須要有「%」字符。「%」的意思是表示一個或多個任意字符。在依賴目標中一樣可使用「%」,只是依賴目標中的「%」的取值,取決於其目標。 spa
有一點須要注意的是,「%」的展開發生在變量和函數的展開以後,變量和函數的展開發生在make 載入 Makefile 時,而模式規則中的「%」則發生在運行時。 code
模式規則介紹 :
模式規則中,至少在規則的目標定義中要包含「%」,不然,就是通常的規則。目標中的「%」定義表示對文件名的匹配,「%」表示長度任意的非空字符串。例如:「%.c」表示以「.c」結尾的文件名(文件名的長度至少爲 3),而「s.%.c」則表示以「s.」開頭,「.c」結尾的
文件名(文件名的長度至少爲 5)。
blog
若是「%」定義在目標中,那麼,目標中的「%」的值決定了依賴目標中的「%」的值,也就是說,目標中的模式的「%」決定了依賴目標中「%」的樣子。 開發
%.o : %.c ; <command ......>
其含義是,指出了怎麼從全部的[.c]文件生成相應的[.o]文件的規則。若是要生成的目標是「a.o b.o」,那麼「%c」就是「a.c b.c」。 字符串
一旦依賴目標中的「%」模式被肯定,那麼, make 會被要求去匹配當前目錄下全部的文件名,一旦找到, make 就會規則下的命令,因此,在模式規則中,目標可能會是多個的,若是有模式匹配出多個目標, make 就會產生全部的模式目標,此時, 自動化
make 關心的是依賴的文件名和生成目標的命令這兩件事。
編譯
%.o : %.c //把全部的[.c]文件都編譯成[.o]文件
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
「$@」表示全部的目標的挨個值,「$<」表示了全部依賴目標的挨個值
class
自動化變量說明變量
$@ 表示規則中的目標文件集。在模式規則中,若是有多個目標,那麼,「$@」就是匹配於目標中模式定義的集合。 $% 僅當目 標是函數庫 文件中,表 示規則中的 目標成員名 。例如,如 果一個目標 是「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 所不能識別的,那麼「$*」就是空值。
四個變量($@、 $<、 $%、 $*)在擴展時只會有一個文件,而另三個的值是一個文件列表 。
「D」的含義就是Directory,就是目錄,「F」的含義就是 File,就是文件 。下面是對於上面的七個變量分別加上「D」或是「F」的含義:
$(@D) 表示「$@」的目錄部分(不以斜槓做爲結尾),若是「$@」值是「dir/foo.o」,那麼「$(@D)」就是「dir」,而若是「$@」中沒有包含斜槓的話,其值就是「.」(當前目錄)。
$(@F)
表示「$@」的文件部分,若是「$@」值是「dir/foo.o」,那麼「$(@F)」就是「foo.o」,「$(@F)」至關於函數「$(notdir $@)」。
「$(*D)」
「$(*F)」
和上面所述的同理,也是取文件的目錄部分和文件部分。對於上面的那個例子,「$(*D)」返回「dir」,而「$(*F)」返回「foo」 。
「$(%D)」
「$(%F)」
分別表示了函數包文件成員的目錄部分和文件部分。這對於形同「archive(member)」形式的目標中的「member」中包含了不一樣的目錄頗有用。
「$(<D)」
「$(<F)」
分別表示依賴文件的目錄部分和文件部分。
「$(^D)」
「$(^F)」
分別表示全部依賴文件的目錄部分和文件部分。(無相同的)
「$(+D)」
「$(+F)」
分別表示全部依賴文件的目錄部分和文件部分。(能夠有相同的)
「$(?D)」
「$(?F)」分別表示被更新的依賴文件的目錄部分和文件部分。