前言
在Makefile中也是存在函数的,在 Makefile 中,可以使用函数调用来处理变量、字符串和路径等操作。那么下面就来看看是如何在makefile中使用函数的吧。
在 Makefile 中,有几种类型的函数可用于执行各种任务和操作。以下是 Makefile 中常见的函数类型:
1.字符串函数:
2.字符串函数用于处理和操作字符串。
3.例如,$ (subst from,to,text) 函数用于将字符串中的某个子串替换为另一个子串。
4.其他常见的字符串函数包括:$ (patsubst pattern,replacement,text)、$ (strip string)、$ (wildcard pattern) 等。
5.文件名函数:
6.文件名函数用于操作文件名和路径。
7.例如,$ (dir names) 函数用于提取文件名中的目录部分。
8.其他常见的文件名函数包括:$ (basename names)、$ (notdir names)、$(suffix names) 等。
9.控制流函数:
10.控制流函数用于实现条件判断和循环控制。
11.例如,( i f c o n d i t i o n , t h e n − p a r t , e l s e − p a r t ) 函数可以根据条件来选择执行不同的代码。 12. 其他常见的控制流函数包括: (if condition,then-part,else-part) 函数可以根据条件来选择执行不同的代码。 12.其他常见的控制流函数包括:(ifcondition,then−part,else−part)函数可以根据条件来选择执行不同的代码。12.其他常见的控制流函数包括: (foreach var,list,text)、$ (shell command)、$(error message) 等。
13.数学函数:
14.数学函数用于执行数值计算和操作。
15.例如,( a d d a , b ) 函数用于将两个数字相加。 16. 其他常见的数学函数包括: (add a,b) 函数用于将两个数字相加。 16.其他常见的数学函数包括:(adda,b)函数用于将两个数字相加。16.其他常见的数学函数包括: (sub a,b)、$ (mul a,b)、$ (div a,b)、$(mod a,b) 等。
17.文件操作函数:
18.文件操作函数用于执行文件相关的操作,如创建目录、复制文件等。
19.例如,$ (wildcard pattern) 函数用于匹配文件名模式,返回匹配的文件列表。
20.其他常见的文件操作函数包括:$ (shell command)、$ (file names…)、$(eval text) 等。
这些函数类型提供了许多有用的功能和计算能力,您可以根据需要选择并结合使用这些函数来构建强大而灵活的 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)。
自定义函数传递参数时并不需要显式声明参数类型,如何使用这些参数完全由函数实现者定义。
因此,在使用自定义函数时需要先进行定义,随后才能调用。而预定义函数则可以直接调用。