Makefile call函数

引用变量的格式为$(变量名),函数调用的格式如下:

$(<function> <arguments>)    或者是     ${<function> <arguments>}

其中,function 是函数名,arguments 是函数的参数,参数之间要用逗号分隔开。而参数和函数名之间使用空格分开。调用函数的时候要使用字符“$”,后面可以跟小括号也可以使用花括号。

$(call <expression>,<parm1>,<parm2>,<parm3>,...)

call 函数是唯一一个可以用来创建新的参数化的函数。我们可以用来写一个非常复杂的表达式,这个表达式中,我们可以定义很多的参数,然后你可以用 call 函数来向这个表达式传递参数。

当 make 执行这个函数的时候,expression参数中的变量$(1)、$(2)、$(3)等,会被参数parm1parm2parm3依次取代。而expression的返回值就是 call 函数的返回值。

实例 1:

reverse = $(1) $(2)
foo = $(call reverse,a,b)
all:
@echo $(foo)

那么,foo 的值就是“a b”。当然,参数的次序可以是自定义的,不一定是顺序的,

实例 2:

reverse = $(2) $(1)
foo = $(call reverse,a,b)
all:
      @echo $(foo)

此时的 foo 的值就是“b a”。

1. 变量的引用

1.1 变量定义为直接展开式

如果这里将VARIABLE1定义为直接展开式,最终调用call函数后,返回值为空
我的理解是,直接展开式在定义时将(1)和(1)和(2)展开,而此时它们的值为空,所以变量的值为空.当执行到call函数时,尽管带上了需要传递的参数,但PARAM((1)和(1)和(2))之前已经被展开了,故此时已经取不到传递进来的参数值.

VARIABLE1 := $(2) $(1)

$(info 1-$(VARIABLE1))

aa=$(call VARIABLE1,hello,world)

$(info 1-$(aa))
all:
	@echo Done

1.2 变量定义为递归展开式

VARIABLE1 = $(2) $(1)

$(info 2-$(VARIABLE1))

aa=$(call VARIABLE1,hello,world)

$(info 2-$(aa))
all:
	@echo Done

这里变量类型的定义再罗嗦一下,所谓的直接展开式,即在定义的时候立即展开;递归展开式,在定义的时候其实相当于声明,只有在实际引用时才展开.

2. 函数的引用

2.1 不带参数的函数引用

define FUNC1
$(info echo 3-"hello")
endef
$(call FUNC1)
all:
	@echo Done

2.2 带参数的函数引用

define FUNC1
$(info echo 4-$(1) $(2))
endef

$(call FUNC1,hello,wolrd)

all:
	@echo Done

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值