首页 > 代码库 > 第9课 - 函数定义及调用

第9课 - 函数定义及调用

第9课 - 函数定义及调用

1. makefile中的函数

  (1)make 解释器提供了一系列的函数供 makefile 调用

  (2)在 makefile 中支持自定义函数实现,并调用执行

  (3)通过 define 关键字实现自定义函数

2. 在makefile中自定义函数

  (1)自定义函数的语法

    技术分享

    其中,$(0) 代表被调用的函数名,$(1) , $(2) , $(3) ... 代表调用函数时后面的传参

  (2)深入理解自定义函数

    — 自定义函数是一个多行变量,无法直接调用

    — 自定义函数是一种过程调用,没有任何的返回值。函数和过程是两种东西,C语言中进行了统一,加return是函数,不加return是过程。

    — 自定义函数用于定义命令集合,并应用于规则中

 1 # 演示自定义函数的使用
 2 
 3 .PHONY : test
 4 
 5 define func1
 6     @echo "My name is $(0)"
 7 endef
 8 
 9 define func2
10     @echo "my name is $(0)"
11     @echo "param 1 => $(1)"
12     @echo "param 2 => $(2)"
13 endef
14 
15 test :
16     $(call func1)
17     $(call func2, swj, cool)
18 
19 # 输出结果
20 My name is func1
21 my name is func2
22 param 1 =>  swj
23 param 2 =>  cool

    自定义函数的本质就是多行变量,只不过加上了call关键字。 $(call func , param1, param2, ...)  首先将参数传递到多行变量里的命令中,然后将命令原地展开。

 1 .PHONY : test
 2 
 3 define func1
 4     @echo "My name is $(0)"
 5 endef
 6 
 7 test :
 8     $(call func1)
 9     $(func1)
10 
11 # 输出结果:注意两者的区别,call会传参后原地展开,多行变量不会传参直接原地展开
12 My name is func1
13 My name is 

3. make解释器中的预定义函数

  (1)预定义函数的概念

    — make 的函数提供了处理文件名,变量和命令的函数

    — 可以在需要的地方调用函数来处理指定的参数

    — 函数在调用的地方被替换为处理结果

  (2)预定义函数的调用

  技术分享

  (3)为什么自定义函数预定义函数的调用形式完全不同?

    — makefile 中不支持真正意义上的自定义函数

    — 自定义函数的本质是多行变量

    — 预定义的 call 函数在调用时将参数传递给多行变量(call 的对象必须为多行变量,否则不起作用,不会传递参数)

    — 自定义函数是 call 函数的实参,并在 call 中被执行

 1 .PHONY : test
 2 
 3 define func1
 4     @echo "My name is $(0)"
 5 endef
 6 
 7 define func2
 8     @echo "My name is $(0)"
 9 endef
10 
11 var1 := $(call func1)
12 var2 := $(call func2)
13 var3 := $(abspath ./)
14 
15 test :
16     @echo "var1 => $(var1)"
17     @echo "var2 => $(var2)"
18     @echo "var3 => $(var3)"
19 
20 # 输出结果
21 var1 =>     @echo My name is func1
22 var2 =>     @echo My name is func2
23 var3 => /home/swj/12-plan/makefile/lesson-9

 

 注:本文整理于《狄泰12月提升计划》课程内容

第9课 - 函数定义及调用