跟我學Makefile(五)

2022-07-16 09:06:11 字數 3161 閱讀 6110

檔名操作函式

每個函式的引數字串都會被當做乙個或是一系列的檔名來對待。

$(dir )

名稱:取目錄函式——dir。

功能:從檔名序列

中取出目錄部分。目錄部分是指最後乙個反斜槓(「/」)之前的部分。如果沒有反斜槓,那麼返回「./」。

返回:返回檔名序列

的目錄部分。

示例: $(dir src/foo.c hacks)返回值是「src/ ./」。

$(notdir )

名稱:取檔案函式——notdir。

功能:從檔名序列

中取出非目錄部分。非目錄部分是指最後乙個反斜槓(「/」)之後的部分。

返回:返回檔名序列

的非目錄部分。

示例: $(notdir src/foo.c hacks)返回值是「foo.c hacks」。

$(suffix )

名稱:取字尾函式——suffix。

功能:從檔名序列

中取出各個檔名的字尾。

返回:返回檔名序列

的字尾序列,如果檔案沒有字尾,則返回空字串。

示例: $(suffix src/foo.c src-1.0/bar.c hacks)返回值是「.c .c」。

$(basename )

名稱:取字首函式——basename。

功能:從檔名序列

中取出各個檔名的字首部分。

返回:返回檔名序列

的字首序列,如果檔案沒有字首,則返回空字串。

示例: $(basename src/foo.c src-1.0/bar.c hacks)返回值是「src/foo src-1.0/bar hacks」。

$(addsuffix ,)

名稱:加字尾函式——addsuffix。

功能:把字尾

加到中的每個單詞後面。

返回:返回加過字尾的檔名序列。

示例: $(addsuffix .c,foo bar)返回值是「foo.c bar.c」。

$(addprefix ,)

名稱:加字首函式——addprefix。

功能:把字首

加到中的每個單詞後面。

返回:返回加過字首的檔名序列。

示例: $(addprefix src/,foo bar)返回值是「src/foo src/bar」。

$(join ,)

名稱:連線函式——join。

功能:把

中的單詞對應地加到的單詞後面。如果的單詞個數要比的多,那麼, 中的多出來的單詞將保持原樣。如果的單詞個數要比多,那麼,

多出來的單詞將被複製到中。

返回:返回連線過後的字串。

示例: $(join aaa bbb ,

111222

333)返回值是「aaa111 bbb222 333」。

foreach函式:用來做迴圈用的

$(foreach

,,)把引數中的單詞逐一取出放到引數所指定的變數中,然後再執行所包含的表示式。每一次會返回乙個字串,迴圈過程中, 的所返回的每個字串會以空格分隔,最後當整個迴圈結束時,

所返回的每個字串所組成的整個字串(以空格分隔)將會是 foreach 函式的返回值。

最好是乙個變數名, 可以是乙個表示式,而中一般會使用這個引數來依次列舉中的單詞。

names := a b c d

files := $(foreach n,$(names),$(n).o) //$(files)的值是「a.o b.o c.o d.o

注意, foreach 中的引數是乙個臨時的區域性變數, foreach 函式執行完後,引數的變數將不在作用,其作用域只在 foreach 函式當中

if函式:跟ifeq很像

$(if

,) //引數是 if 的表示式,如果其返回的為非空字串,那麼這個表示式就相當於返回真,於是, 會被計算,否則會被計算

或是$(

if,,)

call函式:唯一乙個可以用來建立新的引數化的函式

$(call ,,,...)

當 make 執行這個函式時, 引數中的變數,如$(1), $(2), $(3)等,會被引數, , 依次取代。而的返回值就是 call 函式的返回值。

eg:

reverse = $(1) $(2

)foo =$(call reverse,a,b)

那麼, foo 的值就是「a b」。當然,引數的次序是可以自定義的,不一定是順序的,如:

reverse = $(2) $(1

)foo =$(call reverse,a,b)

此時的 foo 的值就是「b a」

origin函式:不操作變數的值,他只是告訴你你的這個變數是**來

的 。

$(origin )

注意:是變數的名字,不應該是引用。所以你最好不要在中使用「$」字元。 origin函式會以其返回值來告訴你這個變數的「出生情況」,origin函式的返回值:

「undefined」 :如果從來沒有定義過, origin 函式返回這個值「undefined」。

「default」 :如果是乙個預設的定義,比如「cc」這個變數

「environment」 :如果是乙個環境變數,並且當 makefile 被執行時,「-e」引數沒有被開啟。

「file」 :如果這個變數被定義在 makefile 中。

「command line」 :如果這個變數是被命令列定義的。

「override」 :如果是被 override 指示符重新定義的。

「automatic」 :如果是乙個命令執行中的自動化變數。

跟我學Makefile(七)

定義模式規則 使用模式規則來定義乙個隱含規則。乙個模式規則就好像乙個一般的規則,只是在規則中,目標的定義需要有 字元。的意思是表示乙個或多個任意字元。在依賴目標中同樣可以使用 只是依賴目標中的 的取值,取決於其目標。有一點需要注意的是,的展開發生在變數和函式的展開之後,變數和函式的展開發生在make...

跟我學Makefile(三)

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

跟我學XSL(五)

上期我們學習了xsl元素 xsl if 已能通過測試xml資料的值來決定不同的輸出形式 不知你嘗試過沒有,實際上 xsl for each 也可部分實現 xsl if 的功能 但有時,我們希望對同一資料同時測試多個條件,根據不同條件輸出相應結果。當然,我們可以用if,假如我們只有if可用的話。幸好我...