Makefile的函数调用详解
Posted 正在起飞的蜗牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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自带不少函数,除非你很闲,否则没必要每个函数都去看和测试,用到的时候会查就行;
以上是关于Makefile的函数调用详解的主要内容,如果未能解决你的问题,请参考以下文章