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的函数调用详解的主要内容,如果未能解决你的问题,请参考以下文章

python函数详解

Makefile 中的括号 $() 和大括号 $ 语法有啥区别?

qt中.pro文件调用多个makefile文件

python所有内置函数的定义详解

Jmeter之函数的应用

python 详解函数