Makefile基础教程(函数的使用)

简介: Makefile基础教程(函数的使用)

前言

在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)。

自定义函数传递参数时并不需要显式声明参数类型,如何使用这些参数完全由函数实现者定义。

因此,在使用自定义函数时需要先进行定义,随后才能调用。而预定义函数则可以直接调用。


相关文章
|
19天前
|
编译器 Shell Linux
Makefile(3)进阶
Makefile(3)进阶
25 0
|
8月前
|
开发者
Makefile基础教程(伪目标)
Makefile基础教程(伪目标)
53 0
|
8月前
|
Java 编译器 Linux
Makefile教程(入门介绍)
Makefile教程(入门介绍)
79 0
|
8月前
|
存储 编译器 C语言
Makefile基础教程(变量的介绍和使用)
Makefile基础教程(变量的介绍和使用)
78 0
|
19天前
Makefile(1)入门
Makefile(1)入门
20 0
|
19天前
|
存储 编译器 Shell
Makefile语法基础
Makefile语法基础
10 0
|
19天前
|
编译器 Shell C语言
Makefile快速入门
Makefile快速入门
31 0
|
7月前
|
Shell
如何使用makefile
如何使用makefile
|
8月前
|
编译器
Makefile基础教程(路径搜索)
Makefile基础教程(路径搜索)
85 0
|
编译器 Shell C语言
Makefile文件 | 进阶指南
Makefile文件 | 进阶指南
313 0