makefile小記

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章