make 內建函數
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)
$(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 內建函數