函式定義與呼叫
1. makefile中支援函式的概念
- make直譯器提供了一系列的函式供makefile呼叫
- 在makefile中支援自定義函式實現,並呼叫執行
- 通過define關鍵字實現自定義函式
示例1--函式定義
define func1
@echo "my name is $(0)"
endef
複製程式碼
define func2
@echo "my name is $(0)"
@echo "param1 => $(1)"
@echo "param2 => $(2)"
endef
複製程式碼
示例1--函式呼叫
test :
$(call func1)
$(call func2, value1)
複製程式碼
2. 深入理解自定義函式
- 自定義函式是一個多行變數,無法直接呼叫,需要使用call進行呼叫
- 自定義函式是一種過程呼叫,沒有任何的返回值
- 自定義函式用於定義命令集合,並應用於規則中 示例2--自定義函式的應用
define func1
@echo "my name is $(0)"
endef
var1 := $(call func1)
var11 := $(func1)
test :
@echo "var1 => $(var1)"
@echo "var11 => $(var11)"
複製程式碼
3. make直譯器中的預定義函式
- make的函式提供了處理檔名,變數和命令的函式
- 可以在需要的地方呼叫函式來處理指定的引數
- 函式在呼叫的地方被替換為處理結果
預定義函式的呼叫方法:
var := $(func_name arg1,arg2,...)
複製程式碼
說明: var表示返回值,func_name表示函式名,arg1,arg2表示函式實參
示例3--預定義函式呼叫
var := $(abspath ./)
test :
@echo "var => $(var)"
複製程式碼
自定義函式和預定義函式的本質區別:
- makefile中不支援真正意義上的自定義函式
- 自定義函式的本質是多行變數
- 預定義的call函式在呼叫時將引數傳遞給多行變數
- 自定義函式是call引數的實參,並在call中被執行 示例4--call呼叫多行變數(call無法呼叫變數)
.PHONY : test
define func1
@echo "my name is $(0)"
endef
func2 := @echo "my name is $(0)"
test :
$(call func1)
$(call func2)
複製程式碼
示例5--call呼叫多行變數
.PHONY : test
define func1
@echo "my name is $(0)"
endef
define func2
@echo "my name is $(0)"
endef
test :
$(call func1)
$(call func2)
複製程式碼
示例6--自定義函式與預定義函式區別
.PHONY : test
define func1
@echo "my name is $(0)"
endef
define func2
@echo "my name is $(0)"
endef
var1 := $(call func1)
var2 := $(call func2)
var3 := $(abspath ./)
var4 := $(abspath test.app)
test :
@echo "var1 => $(var1)"
@echo "var2 => $(var2)"
@echo "var3 => $(var3)"
@echo "var4 => $(var4)"
複製程式碼
小結
- make直譯器提供了一系列的函式供makefile呼叫
- 自定義函式是一個多行變數,無法直接呼叫,只能藉助於call進行間接呼叫
- 自定義函式用於定義命令集合,並應用於規則中
- 預定義的call函式在呼叫時將引數傳遞給多行變數
- 自定義函式是call函式的實參,並在call中被執行