跟我學Makefile(七)

2022-07-16 09:00:14 字數 2842 閱讀 6182

定義模式規則

使用模式規則來定義乙個隱含規則。乙個模式規則就好像乙個一般的規則,只是在規則中,目標的定義需要有「%」字元。「%」的意思是表示乙個或多個任意字元。在依賴目標中同樣可以使用「%」,只是依賴目標中的「%」的取值,取決於其目標。

有一點需要注意的是,%」的展開發生在變數和函式的展開之後變數和函式的展開發生在make載入makefile,而模式規則中的「%」則發生在執行時。

模式規則介紹

模式規則中,至少在規則的目標定義中要包含「%」,否則,就是一般的規則。目標中的「%」定義表示對檔名的匹配,「%」表示長度任意的非空字串。例如:「%.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 關心的是依賴的檔名和生成目標的命令這兩件事。

%.o : %.c                        //把所有的[.c]檔案都編譯成[.o]檔案 

$(cc) -c $(cflags) $(cppflags) $< -o $@

$@」表示所有的目標的挨個值,「$<」表示了所有依賴目標的挨個值

自動化變數說明

$@

表示規則中的目標檔案集。在模式規則中,如果有多個目標,那麼,「$@」就是匹配於目標中模式定義的集合。

$%僅當目 標是函式庫 檔案中,表 示規則中的 目標成員名 。例如,如 果乙個目標 是「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)」

分別表示被更新的依賴檔案的目錄部分和檔案部分。

跟我學Makefile(五)

檔名操作函式 每個函式的引數字串都會被當做乙個或是一系列的檔名來對待。dir 名稱 取目錄函式 dir。功能 從檔名序列 中取出目錄部分。目錄部分是指最後乙個反斜槓 之前的部分。如果沒有反斜槓,那麼返回 返回 返回檔名序列 的目錄部分。示例 dir src foo.c hacks 返回值是 src ...

跟我學Makefile(三)

緊接著跟我學makefile 二 繼續學習 變數高階用法 1 變數值的替換 替換變數中的共有的部分,其格式是 var a b 或是 把變數 var 中所有以 a 字串 結尾 的 a 替換成 b 字串。這裡的 結尾 意思是 空格 或是 結束符 foo a.o b.o c.o bar foo o c 第...

跟我學XSL(七)

xsl函式一 xml與dhtml 動態html 一樣,這些節點都是乙個個物件,而且這些物件都是有層次的,從根節點開始構成一顆層次清淅的樹狀結構,這就形成了文件物件模型dom,通過物件的屬性 方法來達到訪問控制xml節點的目的。我們這裡不打算就xml的dom逐一詳細闡述,因為這完全可以寫成乙個篇幅較多...