makefile 自定义,预定义函数

前言

makefile 中 支持函数的概念。


一、自定义函数

1. 自定义函数介绍

makefile支持自定义函数实现,并调用执行。通过 define 关键字实现自定义函数。

  • 自定义函数是一个多行变量,无法直接调用。
  • 自定义函数是一种过程调用,没有任何的返回值。
  • 自定义函数用于定义命令集合,并应用于规则中。

2. 自定义函数的语法:

define  函数名
    # 函数内容
endef

示例: 可以定义单 多行命令。
在这里插入图片描述
对于 func2 ,函数体是 @echo “My name is $(0) .” @echo “Param => $(1)”。
$(0) 表示函数名称,在函数体中会被替换为 func2.
$(1) 表示第一个参数,在 下面函数调用时,可得参数。

3. 函数的调用:

test :

	$(call func1)
	$(call func2, 参数 1, 参数 2)	

可以在 Makefile 中通过 $(call …) 来调用函数。

在上面的代码中,call 的作用是调用自定义函数 func1,func2 并将其返回值赋给变量 var。

call
是 预定义函数,关于预定义函数下面会详细介绍。
语法 : $(call function-name,arg1,arg2,…)
其中,function-name 是函数的名称,arg1、arg2 等是函数的参数。

代码示例:
.PHONY : test				# 声明伪目标

define func1					# 创建 自定义函数
	@echo "My name is $(0)"
endef

define func2					
	@echo "My name is $(0)"			# $(0) 为函数名
	@echo "Parm 1 => $(1)"			# $(1) 为参数1
	@echo "Parm 2 => $(2)"			# $(2) 为参数2
endef

var := $(func1)						# 没有调用 call 函数,则不会将 $(0) 替换为func1
new := $(call fun1)					# $(call func1) 表示调用函数 func1,并将其返回值赋给变量 new

test :
	@echo " var => $(var)"
	@echo " new => $(new)"
	$(call func1)
	$(call func2,hello,world)		# func1 为函数名,hello 为参数1,world 为参数2

在这里插入图片描述

二、预定义函数

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

make 及解析器提供一系列预定义函数供 makefile 调用。预定义函数在 Makefile 中内置,可以直接使用。

  • make 的函数提供了处理文件名,变量 和 命令 的函数。
  • 可以在需要的地方 调用函数来处理指定的参数
  • 函数在 调用的地方被替换为处理结果

2. 预定义函数的调用:

这里的 函数名 是 预定义函数名
在这里插入图片描述
示例:

.PHONY : test

var := $(abspath ./)			# 使用 abspath 函数获取当前目录的绝对路径
new := $(abspath test.cpp)		#  使用 abspath 获取当前目录下 test.cpp 文件的绝对路径

test :
	@echo " var => $(var)"
	@echo " new => $(new)"

在这里插入图片描述

abspath 函数:
是 Makefile 中的一个预定义函数,用于获取路径的绝对路径。
语法 : $(abspath names…)
names 表示一个或多个文件名或目录名。abspath 函数会将每个参数转换为绝对路径

. / 表示当前目录。

3. 常见的预定义函数:

  • $(call func,arg1,…):调用函数函数,调用自定义或预定义函数并返回函数的值。
  • $(wildcard pattern):查找文件名函数,返回匹配 pattern 模式的所有文件名。
  • $(patsubst pattern,replacement,text):模式字符串替换函数,将 text 中所有匹配模式 pattern 的字符串替换为 replacement。
  • $(shell command):执行 shell 命令函数,执行 command 命令并返回其输出结果。
  • $(subst from,to,text):字符串替换函数,将 text 中所有的 from 替换为 to。
  • $(patsubst pattern,replacement,text):模式字符串替换函数,将 text 中所有匹配模式 pattern 的字符串替换为 replacement。

总结

下一节介绍 自动生成依赖关系

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

糖果罐子♡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值