【轉】Makefile的內嵌函數
摘自《GNU+Makefile中文手冊》整理翻譯:徐海兵
GNU make 的函數提供了處理文件名、變量、文本和命令的方法。使用函數我們的 Makefile 可以書寫的更加靈活和健壯。可以在需要的地方地調用函數來處理指定的文本(需要處理的文本作爲函數的參數),函數的在調用它的地方被替換爲它的處理結果。函數調用(引用)的展開和變量引用的展開方式相同。
1. 函數的調用語法
GNU make 函數的調用格式類似於變量的引用,以“ $”開始表示一個引用。語法格式如下:
$(FUNCTION ARGUMENTS)
或者:
${FUNCTION ARGUMENTS}
對於函數調用的格式有以下幾點說明:
調用語法格式中“ FUNCTION”是需要調用的函數名,它應該是 make 內嵌的函數名。對於用戶自己的函數需要通過 make 的“ call”函數來間接調用。
“ ARGUMENTS”是函數的參數,參數和函數名之間使用若干個空格或者[tab]字符分割(建議使用一個空格,這樣不僅使在書寫上比較直觀,更重要的是當你不能確定是否可以使用[Tab]的時候,避免不必要的麻煩);如果存在多個參數時,參數之間使用逗號“ ,”分開。
以“
”開頭,使用成對的圓括號或花括號把函數名和參數括起(在Makefile中,圓括號和花括號在任何地方必須成對出現)。參數中存在變量或者函數的引用時,對它們所使用的分界符(圓括號或者花括號)建議和引用函數的相同,不使用兩種不同的括號。推薦在變量引用和函數引用中統一使用圓括號;這樣在使用“vim”編輯器書寫Makefile時,使用圓括它可以亮度顯式make的內嵌函數名,避免函數名的拼寫錯誤。在Makefile中應該這樣來書寫“ (sort(x))”;而不是“ (sort ${x})”和其它幾種。函數處理參數時,參數中如果存在對其它變量或者函數的引用,首先對這些引用進行展開得到參數的實際內容。而後纔對它們進行處理。參數的展開順序是按照參數的先後順序來進行的。
書寫時,函數的參數不能出現逗號“ ,”和空格。這是因爲逗號被作爲多個參數的分隔符,前導空格會被忽略。在實際書寫 Makefile 時,當有逗號或者空格作爲函數的參數時,需要把它們賦值給一個變量,在函數的參數中引用這個變量來實現。我們來看一個這樣的例子:
comma:= ,
empty:=
space:= $(empty) $(empty)
foo:= a b c
bar:= $(subst $(space),$(comma),$(foo))
這樣我們就實現了“ bar”的值是“ a,b,c”。