makefile--函式定義與呼叫

sun_shine發表於2018-10-04

函式定義與呼叫


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中被執行

相關文章