通過Ubuntu Makefile總結而得
#######make file #make支持三個通配符:“*”,“?”和“~”。 include ../src/Makefile VPATH = src:../headers //文件搜索 { 1、vpath <pattern> <directories> :爲符合模式<pattern>的文件指定搜索目錄<directories>。 2、vpath <pattern> :清除符合模式<pattern>的文件的搜索目錄。 3、vpath :清除所有已被設置好了的文件搜索目錄。 } 僞目標一般沒有依賴的文件。但是,我們也可以爲僞目標指定所依賴的文件:.PHONY=all 僞目標同樣可以作爲“默認目標”,只要將其放在第一個。 將目標放到第一個,即做爲“默認目標”時,make 不帶參數時,生成的將只有默認目標 { 靜態模式可以更加容易地定義多目標的規則,可以讓我們的規則變得更加的有彈性和靈活。我們還是先來看一下語法: <targets ...>: <target-pattern>: <prereq-patterns ...> <commands> targets定義了一系列的目標文件,可以有通配符。是目標的一個集合。 target-pattern是指明瞭targets的模式,也就是的目標集模式。 prereq-patterns是目標的依賴模式,它對target-pattern形成的模式再進行一次依賴目標的定義。 其中把targets去掉就是隱藏規則 } { 常用的隱含規則 1、編譯C程序的隱含規則。 “.o”的目標的依賴目標會自動推導爲“.c”,並且其生成命令是“$(CC) –c $(CPPFLAGS) $(CFLAGS)” 2、編譯C++程序的隱含規則。 “.o”的目標的依賴目標會自動推導爲“.cc”或是“.C”, 並且其生成命令是 “$(CXX) –c $(CPPFLAGS) $(CFLAGS)”。(建議使用“.cc”作爲C++源文件的後綴,而不是“.C”) 7、彙編和彙編預處理的隱含規則。 “.o” 的目標的依賴目標會自動推導爲“.s”,默認使用編譯器“as”, 並且其生成命令是:“$(AS) $(ASFLAGS)”。“.s” 的目標的依賴目標會自動推導爲“.S”, 默認使用C預編譯器 “cpp”,並且其生成命令是:“$(AS) $(ASFLAGS)”。 8、鏈接Object文件的隱含規則。 目標依賴於“.o”,通過運行C的編譯器來運行鏈接程序生成(一般是“ld”), 其生成命令是: “$(CC) $(LDFLAGS) .o $(LOADLIBES) $(LDLIBS)”。 這個規則對於只有一個源文件的工程有效,同時也對多個Object文件(由不同的源文件生成)的也有效。 } { 你可以使用模式規則來定義一個隱含規則。 模式規則中,至少在規則的目標定義中要包含"%",否則,就是一般的規則。 } 下面是所有的自動化變量及其說明: $@ 表示規則中的目標文件集。在模式規則中,如果有多個目標,那麼,"$@"就是匹配於目標中模式定義的集合。 $% 僅當目標是函數庫文件中,表示規則中的目標成員名。例如,如果一個目標是"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所不能識別的,那麼"$*"就是空值。