Makefile常用函數
1. 格式
Makefile 中函數的調用格式如下:
$(function arguments)
其中,function 為函數名,arguments 為參數。
函數名與參數之間由空格或Tab分隔,如果有多個參數,這些參數之間由逗號分隔。
2. 常用函數介紹
內核的 Makefile 中用到大量的函數,以下介紹一些常用的函數。
2.1 字符串替換和分析函數
- $(subst from,to,text)
其中,subst 為 substitude(v 替代) 的縮寫。
功能:在字符串 text 中,使用 to 替換每一處 from.
返回:替換過後產生的新的字符串。
舉例:$(subst ee,EE,feet on the street)
返回結果:fEEt on the strEET
- $(patsubst pattern,replacement,text)
其中,patsubst 為 pattern 和 substitude 的縮寫。
功能:查找 text 中的單詞(單詞以“空格”、“Tab”或“回車”“換行”分隔)是否符合模式 pattern ,如果匹配的話,則以 replacement 替換。這裏, pattern 可以包括通配符“%”,表示任意長度的字串。如果 replacement 中也包含“%”,那麽, replacement 中的這個“%”將是 pattern 中的那個“%”所代表的字串。(可以用“\”來轉義,以“\%”來表示真實含義的“%”字符)。
返回:替換過後產生的新的字符串。
舉例:$(patsubst %.c,%.o,x.c.c bar.c)
返回結果:x.c.o bar.o
一種更為簡單的批量替換文件後綴的方法--變量的替換引用
$(VAR:PATTERN=REPLACEMENT)
它相當於 $(patsubst PATTERN,REPLACEMENT,$(VAR))
舉例:假設有變量定義為“objects = foo.o bar.o baz.o”。為了得到這些.o文件所對應的.c源文件。我們可以使用以下兩種方式的任意一個:
$(objects:.o=.c)
$(patsubst %.o,%.c,$(objects))
- $(strip string)
strip意為“脫去”
功能:去除 string 中前導和結尾的空格,並將中間的多個空格壓縮為一個空格。
返回:脫掉冗余空格之後的新的字符串。
舉例:$(strip a b c )
返回結果:a b c
- $(findstring find,in)
功能:在字符串 in 中搜尋 find ,如果找到,則返回值是傳入的參數 find, 否則返回值為空。
舉例:$(findstring a,a b c)
返回結果:a
舉例:$(findstring a,b c)
返回結果:
- $(filter pattern…,text)
功能:過濾掉 text 中不符合 pattern 的字符串
舉例:$(filter %.c %.s,foo.c bar.c baz.s ugh.h)
返回結果:foo.c bar.c baz.s
- $(filter-out pattern…,text)
功能:$(filter pattern…,text) 的反函數,過濾掉 text 中符合 pattern 的字符串。
舉例:$(filter %.c %.s,foo.c bar.c baz.s ugh.h)
返回結果:ugh.h
- $(sort list)
功能:將 list 中的單詞以首字母為準進行升序排序,並去掉重復的單詞。
舉例:$(sort foo bar lose foo)
返回結果:bar foo lose
2.2 文件名函數
- $(dir names…)
功能:從文件名序列 names… 中取出各個文件名的目錄部分。文件名的目錄部分就是包含在文件名中的最後一個斜線(“/”)(包括斜線)之前的部分。如果沒有反斜杠,那麽返回./。
舉例:$(dir src/foo.c hacks)
返回結果:src/ ./
註意:以上例子中其實是兩個文件 src/foo.c 和 ./hacks
- $(notdir names…)
功能:從文件名序列 names 中取出非目錄部分。非目錄部分是指最後一個反斜杠(/)之後的部分,即文件名。
舉例:$(notdir src/foo.c hacks)
返回結果:foo.c hacks
- $(basename names…)
功能:抽取 names 中每一個文件名中除後綴外的一切字符。
舉例:$(basename src/foo.c src-1.0/bar hacks)
返回結果:src/foo src-1.0/bar hacks
- $(addsuffix suffix,names…)
功能:添加後綴。
舉例:$(addsuffix .c foo bar)
返回結果:foo.c bar.c
- $(addprefix prefix,names…)
功能:把前綴 prefix 加到 names 中的每個單詞後面
舉例:$(addprefix src/,foo bar)
返回結果:src/foo src/bar
2.3 其他函數
- $(foreach var,list,text)
功能:把參數 list 中的單詞逐一取出放到參數 var 所指定的變量中,然後再執行 text 所包含的表達式。每一次 text 會返回一個字符串,循環過程中, text 的所返回的每個字符串會以空格分隔,最後當整個循環結束時, text 所返回的每個字符串所組成的整個字符串(以空格分隔)將會是foreach函數的返回值。
舉例:names := a b c d
files := $(foreach n,$(names),$(n).o)
返回結果:a.o b.o c.o d.o
- $(if condition,then-part)
或是 $(if condition,then-part,else-part)
功能:if 函數可以包含 else 部分,或是不含。即 if 函數的參數可以是兩個,也可以是三個。 condition 參數是 if 的表達式,如果其返回的為非空字符串,那麽這個表達式就相當於返回真,於是, then-part 會被計算,否則 else-part 會被計算。
而 if 函數的返回值是,如果 condition 為真(非空字符串),那個 then-part 會是整個函數的返回值,如果 condition 為假(空字符串),那麽 else-part 會是整個函數的返回值,此時如果 else-part 沒有被定義,那麽,整個函數返回空字串。
所以, then-part 和 else-part 只會有一個被計算。
- $(origin variable)
功能:origin函數不像其它的函數,他並不操作變量的值,他只是告訴你你的這個變量是哪裏來的?
註意, variable 是變量的名字,不應該是引用。所以你最好不要在 variable 中使用$ 字符。Origin 函數會以其返回值來告訴你這個變量的“出生情況”。
返回值:
undefined 如果 variable 從來沒有定義過,origin 函數返回這個值。
default 如果 variable 是一個默認的定義,比如“CC”這個變量。
environment 如果 variable 是一個環境變量,並且當 Makefile 被執行時, -e 參數沒有
被打開。
file 如果 variable 這個變量被定義在 Makefile 中。
command line 如果 variable 這個變量是被命令行定義的。
override 如果 variable 是被 override 指示符重新定義的。
automatic 如果 variable 是一個命令運行中的自動化變量。
- $(shell command argument)
功能:相當於在 shell 中執行 command argument。
Makefile常用函數