1. 程式人生 > >Makefile常用函數

Makefile常用函數

over ont each函數 包括 line environ man 常用 tdi

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常用函數