gnu make項目管理(4)函數

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)

返回text中第n個單詞,第一個單詞編號是1
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章