make函數可以分成如下幾類
- 字符串操作
- 文件名操作
- 流程控制
- 若干重要的雜項函數
- 較不重要的雜項函數
- 用戶自定義函數
所有函數都具有如下形式
$(function-name arg1[,argn])
function-name是函數名,接着是函數的參數,以逗號爲分隔符,第一個參數的前導空格會被刪除,但是後續的任何參數包括前導空格都會被保留下來。
字符串函數
filter
$(filter pattern ...,text)
可以看到
1.第一個模式只會匹配單詞he
2.模式中只能包含一個%字符,如果還有額外的%,那麼額外的%都被視作文字字符
3.filter無法匹配子字符串且只能接受一個通配符
filter-out
$(filter-out pattern ...,text)
與filter結果相反
subst
$(subst search-string,replace-string,text)
這是一個不具備通配符能力的搜索替換函數,例如
patsubst
$(patsubst search-string,replace-string,text)
這是一個具備通配符能力的搜索替換函數,注意這裏只能包含一個通配符,例如下面是刪除text結尾處的斜線
words
$(words text)
返回text中單詞數量,如
word
$(word n,text)
firstword
$(firstword text)
等同於$(word 1,text)
,如
wordlist
$(wordlist start,end,text)
重要雜項函數
sort
$(sort list)
對list進行排序並刪除重複的項目
shell
$(shell command)
command被丟給subshell執行,make把執行結果當做函數返回值,結果中出現的換行符會被縮成單一空格,標準錯誤和任何程序狀態不會被返回
下面可以測試word-list變量是否包含重複內容
文件名函數
wildcard
$(wildcard pattern...)
下面sources就保存了是.c和.h文件名列表,如果沒有從.c、.h則返回空
dir
$(dir list...)
notdir
$(notdir name...)
suffix
$(suffix name...)
basename
$(basename name...)
addsuffix
$(addsuffix suffix,name...)
給name添加suffix後綴
addprefix
$(addprefix prefix,name...)
給name添加prefix前綴
join
$(join prefix-list,suffix-lis)
流程控制
if
$(if condition,then-part,else-part)
if函數(注意不要和條件指令ifeq、ifne、ifdef、ifndef搞混了),如果condition擴展之後包涵任何字符(空格也算),則爲真,會對then-part進行擴展動作,否則condition爲假,對else-part進行擴展。
如想要判斷makefile是否在windows上運行,查看COMSPEC,只有windows會定義次變量
要求make版本要在3.80之後
error
$(error text)
輸出“無法挽回的”錯誤信息,上面if函數檢查MAKE_VERSION版本例子中,如果condition爲假,則error會當當前make停止執行並輸出後面錯誤信息
**foreach **
$(foreach variable,list,body)
讓variable依次等於list列表中的值,讓後variable代入body展開作爲返回值
下面這個例子可用來判斷測試一組變量是否定義過
如果把strerr去掉
較不重要的雜項函數
strip
$(strip text)
去掉text前後導空格
**origin **
$(origin variable)
返回描述變量來自何處的字符串,
**warning **
$(warning text)
類似於error函數,但是不會導致make結束運行
自定義函數
下面是一個簡單的調試跟蹤函數來打印函數調用情況和入口參數,$0
用來表示訪問當前所執行的函數名稱
foreach的body加上了''
,所以foreach返回結果是每個參數帶上單引號的以空格爲分隔符的列表串,再用subst把參數之間的單引號空格單引號
替換成單引號$(coma)單引號
,上面這個追蹤最多隻能列出9個參數,因爲foreach的list是1~9
eval
eval函數是將文本直接放入make解析,下面我是參考下面2篇文章
https://blog.csdn.net/xiaoyink/article/details/89671428
https://blog.csdn.net/k7arm/article/details/67637340
https://www.cnblogs.com/merlindu/p/6542805.html