1. 程式人生 > >make 內建函數

make 內建函數

重新定義 text put 命令行 空格 -1 sta 打印 ifd

1.文本處理和分析函數

$(subst from,to,text) 替換

$(patsubst pattern,replacement,text) 模式替換,可用%(只用第一個%有用),如 $(patsubst %.c,%.o,x.c.c bar.c),結果 ‘x.c.o bar.o

$(strip string) 去掉文本兩端空格,以及把2個和2個以上的空格換成一個

$(findstring find,in) 查找

$(filter pattern…,text) 過濾,只保留pattern部分

$(filter-out pattern…,text) 過濾掉,不保留pattern部分

$(sort list

) 排序

$(word n,text) 取字符串

$(wordlist s,e,text) 取字符串列表 第s(start)個到第e(end)個

$(words text) Returns the number of words in text. Thus, the last word of text is $(word $(words text),text).

$(firstword names…) 取第一個

$(lastword names…) 去最後一個

2.文件名處理函數

$(dir names…) 取目錄

$(notdir names…) 取文件,但並不完全正確,註意觀察,因為這個原理是已斜杠“/”為標識符的,如果文件名中包含斜杠,則返回的文件名就有誤

$(suffix names…) 去文件後綴

$(basename names…) 去文件名,包括前面的目錄部分,如$(basename src/foo.c src-1.0/bar hacks), 結果為 src/foo src-1.0/bar hacks

$(addsuffix suffix,names…) 添加後綴

$(addprefix prefix,names…) 添加前綴,example : $(addprefix src/,foo bar),produces the result ‘src/foo src/bar’.

$(join list1,list2) 連接函數 example: ‘$(join a b,.c .o)

’ produces ‘a.c b.o’.

$(wildcard pattern) 通配符函數,表示可以使用正則表達式的符號。The argument pattern is a file name pattern, typically containing wildcard characters (as in shell file name patterns). The result of wildcard is a space-separated list of the names of existing files that match the pattern

$(realpath names…) 真實路徑

$(abspath names…) 絕對路徑

3. foreach函數

$(foreach var,list,text) 相當於for循環函數,不過最終這裏返回的是text的值,這個值是循環得到的一個list,如

find_files = $(wildcard $(dir)/*) “=”等號是延時加載(deferred)

dirs := a b c d

files := $(foreach dir,$(dirs),$(find_files))

files := $(wildcard a/* b/* c/* d/*)

4. if函數

ifeq (arg1, arg2)

ifneq (arg1, arg2)

ifdef variable-name

ifndef variable-name

5. call函數

$(call VARIABLE,PARAM,PARAM,...)

“call”函數是唯一一個可以創建定制化參數函數的引用函數。使用這個函數可以 實現對用戶自己定義函數引用。我們可以將一個變量定義為一個復雜的表達式,用“call” 函數根據不同的參數對它進行展開來獲得不同的結果。

如:reverse = $(2) $(1) foo = $(call reverse,a,b) foo will contain ‘b a

6. value函數

$(value variable)

The result of this function is a string containing the value of variable, without any expansion occurring. For example, in this makefile:

FOO = $PATH

all:
        @echo $(FOO)
        @echo $(value FOO)

The first output line would be ATH, since the “$P” would be expanded as a make variable, while the second output line would be the current value of your $PATH environment variable, since the value function avoided the expansion.

7. origin函數

$(origin variable) 獲取變量的屬性值,如下幾個

1. undefined 變量“VARIABLE”沒有被定義。

2. default 變量“VARIABLE”是一個默認定義(內嵌變量)。如“CC”、“MAKE”、“RM”等變 量。如果在 Makefile 中重新定義這些變量,函數返回值將相應發生變化。

3. environment 變量“VARIABLE”是一個系統環境變量,並且 make 沒有使用命令行選項“-e” (Makefile 中不存在同名的變量定義,此變量沒有被替代)。

4. environment override 變量“VARIABLE”是一個系統環境變量,並且 make 使用了命令行選項“-e”。 Makefile 中存在一個同名的變量定義,使用“make -e”時環境變量值替代了文 件中的變量定義。

5. file 變量“VARIABLE”在某一個 makefile 文件中定義。

6. command line 變量“VARIABLE”在命令行中定義。

7. override 變量“VARIABLE”在 makefile 文件中定義並使用“override”指示符聲明。

8. automatic 變量“VARIABLE”是自動化變量。

8. shell函數

contents := $(shell cat foo)

files := $(shell echo *.c)

9. make LOG以及控制函數

$(info text) 打印log

$(warning text) 和 error 一樣,但是 產生致命錯誤退出

$(error text) 產生致命錯誤,並提示“text”信息給用戶,並退出 make 的執行

make 內建函數