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

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

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


相关文章
|
存储
File操作 - list()/listFiles()与目录过滤器
File操作 - list()/listFiles()与目录过滤器
343 0
|
人工智能 缓存 安全
LangChain开发环境准备-实现私有大模型OpenAI标准接口封装
今天这节课我就将带领小伙伴们将这未完成的一步补全,实现私有大模型OpenAI标准接口封装,并完成LangChain对大模型的调用与测试
2750 0
|
算法 Java 编译器
【C++ 关键字 virtual 】C++ virtual 关键字(将成员函数声明为虚函数实现多态
【C++ 关键字 virtual 】C++ virtual 关键字(将成员函数声明为虚函数实现多态
242 0
|
运维 负载均衡 监控
中间件故障转移(Failover)
【7月更文挑战第24天】
382 59
|
网络协议 算法 程序员
网络必修课:以太网报文格式详解
嗨,大家好!今天,我要带大家深入了解以太网报文格式,这是现代网络通信的重要基础。无论你是网络工程师、开发者,还是对技术感兴趣的朋友,这篇文章都将为你揭开以太网的神秘面纱,让你更好地理解和应用这一关键技术。准备好了吗?让我们开始吧!
537 4
|
11月前
|
NoSQL 关系型数据库 MySQL
百万数据量优化实战
在现代互联网业务中,处理百万级别的数据量是家常便饭。传统的单体数据库架构在面对如此庞大的数据量时,往往显得力不从心。本文将分享一次实际的优化案例,探讨如何利用MySQL和Redis共同实现百万级数据统计的优化。
606 4
|
供应链 监控 调度
ERP系统中的销售订单处理与交付跟踪解析
【7月更文挑战第25天】 ERP系统中的销售订单处理与交付跟踪解析
895 0
ERP系统中的销售订单处理与交付跟踪解析
|
算法 SDN C++
以太网帧FCS校验:CRC32的三种实现
这篇文章讨论了CRC32校验码的三种实现方法,用于检测网络通信中的数据错误。首先介绍了基础的按位计算方法,虽然直观但效率低。接着,文章提出了使用非翻转查找表和翻转查找表的快速计算方法,后者在性能上更优。文中提供了C++代码示例,展示如何生成和使用这些查找表。最后,指出在实际应用中,应根据性能需求选择合适的方法。
|
存储 监控 Linux
|
分布式计算 DataWorks 调度
DataWorks操作报错合集之DataWorks配置参数在开发环境进行调度,参数解析不出来,收到了 "Table does not exist" 的错误,该怎么处理
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
226 0