makefile 常用函式雲集

2021-06-22 14:17:34 字數 3458 閱讀 7061

1、foreach函式

foreach函式和別的函式非常的不一樣。因為這個函式是用來做迴圈用的,makefile中的foreach函式幾乎是仿照於unix標準shell(/bin/sh)中的for語句,或是c-shell(/bin/csh)中的foreach語句而構建的。它的語法是:

$(foreach ,,)

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

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

names := a b c d

files := $(foreach n,$(names),$(n).o)

上面的例子中,$(name)中的單詞會被挨個取出,並存到變數「n」中,「$(n).o」每次根據「$(n)」計算出乙個值,這些值以空格分隔,最後作為foreach函式的返回,所以,$(files)的值是「a.o b.o c.o d.o」。

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

2、if 函式

if函式很像gnu的make所支援的條件語句——ifeq(參見前面所述的章節),if函式的語法是:

$(if ,) 

或是$(if ,,)

可見,if函式可以包含「else」部分,或是不含。即if函式的引數可以是兩個,也可以是三個。引數是if的表示式,如果其返回的為非空字串,那麼這個表示式就相當於返回真,於是,會被計算,否則會被計算。

而if函式的返回值是,如果為真(非空字串),那個會是整個函式的返回值,如果為假(空字串),那麼會是整個函式的返回值,此時如果沒有被定義,那麼,整個函式返回空字串。

所以,和只會有乙個被計算。

3、call函式

call函式是唯一乙個可以用來建立新的引數化的函式。你可以寫乙個非常複雜的表示式,這個表示式中,你可以定義許多引數,然後你可以用call函式來向這個表示式傳遞引數。其語法是:

$(call ,,,...)

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

reverse =  $(1) $(2)

foo = $(call reverse,a,b)

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

reverse =  $(2) $(1)

foo = $(call reverse,a,b)

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

4、origin函式

origin函式不像其它的函式,他並不操作變數的值,他只是告訴你你的這個變數是**來的?其語法是:

$(origin )

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

「undefined」

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

「default」

如果是乙個預設的定義,比如「cc」這個變數,這種變數我們將在後面講述。

「environment」

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

「file」

如果這個變數被定義在makefile中。

「command line」

如果這個變數是被命令列定義的。

「override」

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

「automatic」

如果是乙個命令執行中的自動化變數。關於自動化變數將在後面講述。

這些資訊對於我們編寫makefile是非常有用的,例如,假設我們有乙個makefile其包了乙個定義檔案make.def,在make.def中定義了乙個變數「bletch」,而我們的環境中也有乙個環境變數「bletch」,此時,我們想判斷一下,如果變數**於環境,那麼我們就把之重定義了,如果**於make.def或是命令列等非環境的,那麼我們就不重新定義它。於是,在我們的makefile中,我們可以這樣寫:

ifdef bletch

ifeq "$(origin bletch)" "environment"

bletch = barf, gag, etc.

endif

endif

當然,你也許會說,使用override關鍵字不就可以重新定義環境中的變數了嗎?為什麼需要使用這樣的步驟?是的,我們用override是可以達到這樣的效果,可是override過於粗暴,它同時會把從命令列定義的變數也覆蓋了,而我們只想重新定義環境傳來的,而不想重新定義命令列傳來的。

5、shell函式

shell函式也不像其它的函式。顧名思義,它的引數應該就是作業系統shell的命令。它和反引號「`」是相同的功能。這就是說,shell函式把執行作業系統命令後的輸出作為函式返回。於是,我們可以用作業系統命令以及字串處理命令awk,sed等等命令來生成乙個變數,如:

contents := $(shell cat foo)

files := $(shell echo *.c)

注意,這個函式會新生成乙個shell程式來執行命令,所以你要注意其執行效能,如果你的makefile中有一些比較複雜的規則,並大量使用了這個函式,那麼對於你的系統效能是有害的。特別是makefile的隱晦的規則可能會讓你的shell函式執行的次數比你想像的多得多。

6、控制make的函式

make提供了一些函式來控制make的執行。通常,你需要檢測一些執行makefile時的執行時資訊,並且根據這些資訊來決定,你是讓make繼續執行,還是停止。

$(error )

產生乙個致命的錯誤,是錯誤資訊。注意,error函式不會在一被使用就會產生錯誤資訊,所以如果你把其定義在某個變數中,並在後續的指令碼中使用這個變數,那麼也是可以的。例如:

示例一:

ifdef error_001

$(error error is $(error_001))

endif

示例二:

err = $(error found an error!)

.phony: err

err: ; $(err)

示例一會在變數error_001定義了後執行時產生error呼叫,而示例二則在目錄err被執行時才發生error呼叫。

$(warning )

這個函式很像error函式,只是它並不會讓make退出,只是輸出一段警告資訊,而make繼續執行。

makefile常用函式

一 字串處理函式 1.subst from,to,text 函式名稱 字串替換函式 subst。函式功能 把字串 text 中的 from 字元替換為 to 返回值 替換後的新字串。2.patsubst pattern,replacement,text 函式名稱 模式替換函式 patsubst。函式...

Makefile 常用函式

1.strip 去空格函式 刪除字串開頭和結尾的空格 2.比較函式ifeq 和ifneq ifeq是當相等時繼續執行,ifneq 當不等是繼續執行。ifneq strip target vendor target vendor 去除空格後不為空,product list target product...

Makefile常用函式

單詞以 空格 tab 或 回車 換行 分隔 info 列印資訊。warning 列印警告資訊。error 答應錯誤資訊並停止make。shell 返回值是shell命令的標準輸出。call 建立新的引數化的函式。eval 將的內容作為makefile的一部分而被make解析和執行。sort 給字串中...