文章目录
- 前言
- 一、自定义函数
- 1.使用示例
- 2.注意事项
- 二、预定义函数
- 1.call函数
- 2.abspath函数
- 总结
前言
在Makefile中也是存在函数的,在 Makefile 中,可以使用函数调用来处理变量、字符串和路径等操作。那么下面就来看看是如何在makefile中使用函数的吧。
一、自定义函数
1.使用示例
在 Makefile 中,可以使用自定义函数来完成一些特定的操作。自定义函数一般使用 define 和 endef 命令来实现,在 define 和 endef 之间是函数体。自定义函数在使用 call 函数进行调用,在调用时传递参数。自定义函数可以使用 Makefile 内置的命令和变量,也可以使用自定义变量和命令。
下面是一个自定义函数的例子:
define myfunc
$(if $(filter $(1), yes), \
@echo "My function param is Yes", \
@echo "My function param is Not Yes" \
)
endef
test:
$(call myfunc,yes) # 调用 myfunc 函数,输出 "My function param is Yes"
$(call myfunc,no) # 调用 myfunc 函数,输出 "My function param is Not Yes"
在这个例子中,使用 define 定义了一个名为 myfunc 的自定义函数,该函数接收一个参数。函数体使用了 if 和 filter 命令,判断传入的参数是否为 “yes”。调用 myfunc 函数时,使用 call 函数进行调用,并传递一个参数。
执行结果:
2.注意事项
1.自定义函数是一个多行变量,无法直接调用,需要使用call函数调用。
2.自定义函数用于定义命令集合,并应用于规则中。
二、预定义函数
1.call函数
在 Makefile 中,call 函数用于调用一个自定义函数,并返回其结果。其语法为:
$(call function-name,param1,param2,...)
其中,function-name 为自定义函数的名称,param1、param2等为传递给函数的参数值,多个参数用逗号分隔。
call 函数的返回值为自定义函数的输出结果,可以使用变量来接收它。例如:
define my-func
# some operations
@echo "hello world"
endef
result := $(call my-func)
在上述例子中,我们定义了一个名为 my-func 的自定义函数,其中输出了一行 “hello world”。然后,使用 call 函数来调用这个函数,并将结果赋值给 result 变量。
需要注意的是,在自定义函数中使用 $(result) 就可以使函数的结果返回给调用者。而在调用 call 函数时,需要将其结果存储到一个变量中以便之后的使用。
2.abspath函数
abspath 函数用于将路径转换为绝对路径。其语法为:
$(abspath names...)
其中,names 可以是一个或多个路径名,路径名之间用空格分隔。
abspath 函数将路径名解释为相对于当前工作目录的相对路径,并将其转换为绝对路径。如果路径名已经是绝对路径,那么 abspath 函数将原样返回该路径名。使用 abspath 函数可以避免在 Makefile 中出现因相对路径引发的错误。
代码例子:
define func1
@echo "I am $(0)"
endef
var := $(call func1)
var1 := $(func1)
var2 := $(abspath ./)
var3 := $(abspath test.cpp)
test:
$(call func1)
@echo "var = $(var)"
@echo "var1 = $(var1)"
@echo "var2 = $(var2)"
@echo "var3 = $(var3)"
运行结果:
总结
这里有一些需要注意的地方我给大家例举出来:
自定义函数的名称需与定义时一致。
在自定义函数中返回值需要使用 $(var) 形式进行返回,例如:$(call my-func)。
自定义函数传递参数时并不需要显式声明参数类型,如何使用这些参数完全由函数实现者定义。
因此,在使用自定义函数时需要先进行定义,随后才能调用。而预定义函数则可以直接调用。