Makefile的函数调用详解

1、Makefile的函数调用语法

# Makefile的函数调用格式
$(<function> <arguments>) 或是 ${<function> <arguments>}

示例:其中subst是Makefile默认支持的函数
	$(subst a,b,${x})

(1)函数调用以“$”开头,以圆括号或花括号把函数名和参数括起;
(2)就是函数名;
(3)是函数的参数,参数间以逗号“,”分隔,而函数名和参数之间以“空格”分隔;
重点:我们需要关注的是Makefile中函数的格式,当我们看到这种格式的代码就知道这是Makefile中的函数,但是函数可能是Makefile自带的,也可能是我们自己定义的函数

2、构建新函数

2.1、多行变量

#多行变量的定义
define two-lines
	echo foo
	echo $(bar)
endef

#多行变量的引用
$(two-lines)

(1)多行变量就是把多行命令封装成一个变量,将来引用一个变量就相当于引用好几条命令,当多条命令会在Makefile文件中重复出现时,可以考虑将多行命令封装成一个多行变量;
(2)多行变量使用define和endef关键字进行定义,两个关键字之间就是多行变量包含的命令;
(3)上面的定义中,多行变量名是two-lines,当引用two-lines变量时,就相当于引用echo foo和echo $(bar)命令;
(4)define指示符后面跟的是变量的名字,要重起一行定义变量的值,定义以endef关键字结束;
(5)多行变量的值可以包含函数、命令、文字,或是其它变量,但是要注意命令必须是tab开头,这是Makefile的规定

2.2、命令包

# 下面的代码是个可运行的Makefile代码,会在当前目录创建1.txt文件并写入111,然后再拷贝一份成2.txt

#命令包的名字叫run-yacc
define run-yacc
        touch 1.txt
        echo 111 > 1.txt 
        cp 1.txt $(PWD)/2.txt 
endef

all:
        $(run-yacc) #引用命令包

(1)在Makefile中当多次出现相同命令序列,我们可以将这些命令序列定义成一个多行变量;
(2)命令包就是特殊情况的多行变量,因为多行变量的每一行都是命令,所以每一行都必须是tab开头;

2.3、call函数

//call函数调用格式
$(call <expression>,<parm1>,<parm2>,<parm3>...)

#示例Makefile代码

reverse=$(2)_$(1)

all:
        var=$(call reverse,aa,bb)
        @echo $(var)

#Makefile执行结果
var=bb_aa

(1)call 函数是唯一一个可以用来创建新的参数化的函数;
(2):这是call要调用的表达式,可以是个复杂的命令包,命令包里带参数,通过call函数来向这个表达式传递参数;
(3)当 make 执行这个函数时,参数中的变量,如 ( 1 ) , (1), (1)(2), ( 3 ) 等,会被参数 < p a r m 1 > , < p a r m 2 > , < p a r m 3 > 依次取代。而 < e x p r e s s i o n > 的返回值就是 c a l l 函数的返回值 ; 重点: < e x p r e s s i o n > 表达式一般是个特殊情况的命令包,就是命令包中含有 (3)等,会被参数<parm1>,<parm2>,<parm3>依次取代。而<expression>的返回值就是 call 函数的返回值; 重点:<expression>表达式一般是个特殊情况的命令包,就是命令包中含有 (3)等,会被参数<parm1><parm2><parm3>依次取代。而<expression>的返回值就是call函数的返回值;重点:<expression>表达式一般是个特殊情况的命令包,就是命令包中含有(1),$(2)这样的变量,将来call函数调用表达式时会传参进来;

2.4、构建新函数以及调用

# 可以运行的示例Makefile

#function函数功能:把传递进来的两个参数打印出来
define function
	@echo "$(1) $(2)"
endef

all:
        $(call function,aa,bb)

#输出结果
aa bb

(1)我们定义函数其实是定义一个命令包,命令包里可以接收参数,然后借助call函数来调用定义的命令包并传递参数进来;
(2)上面定义了一个简单的function函数并调用,结合上面将的多行变量、命令包、call函数不难理解;

3、常见函数列举

Makefile默认支持的函数在《跟我一起写Makefile》中介绍的很详细了,需要的可以去我的资源里下载PDF版本;

4、如何学习Makefile的函数?

(1)重点是能分清Makefile中函数的格式,将来在看到代码时知道这是调用的函数,不至于茫然;
(2)知道怎么构建函数,能看懂别人写的函数;
(3)Makefile自带不少函数,除非你很闲,否则没必要每个函数都去看和测试,用到的时候会查就行;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

正在起飞的蜗牛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值