当前位置:   article > 正文

Makefile的函数调用详解_makefile调用makefile

makefile调用makefile

1、Makefile的函数调用语法

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

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

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

2、构建新函数

2.1、多行变量

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

#多行变量的引用
$(two-lines)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

(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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

(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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

(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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

3、常见函数列举

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

4、如何学习Makefile的函数?

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/609538
推荐阅读
相关标签
  

闽ICP备14008679号