在Makefile中导出函数

时间:2018-07-13 07:35:34

标签: function makefile export

我想在make的递归调用中使用一个函数。

我的主要Makefile中包含以下内容:

define my_func
Hello $(1) from $(2)
endef
export my_func

此外,在另一个稍后的版本中,我有:

$(error my_func is $(call my_func,StackOverFlow,Me))

它给了我这个输出Makefile_rec.mk:1: *** my_func is Hello from . Stop.

但是我想要的是Makefile_rec.mk:1: *** my_func is Hello StackOverFlow from Me. Stop.

有没有一种方法可以使用make导出这样的变量/函数,并在使用call函数时使其工作?

谢谢!

-编辑-

正如@Renaud Pacalet here所指出的,我也想在当前的Makefile和子Make中使用这种宏。

如果可能的话,每次需要宏时都不要including来创建文件

1 个答案:

答案 0 :(得分:1)

如果您希望此操作有效,则必须在定义中将$符号加倍:

define my_func
Hello $$(1) from $$(2)
endef
export my_func

从手册:

  

要传递或导出变量,make会添加该变量及其变量   运行配方每一行的环境的价值。的   反过来,sub-make使用环境初始化其表   变量值。

您必须保护$不受其扩展影响。

当然,您不能在顶部的Makefile中使用相同的宏。如果有问题,则必须为顶部Makefile定义一个宏,为子Make Makefile定义另一个:

host> cat Makefile
define my_func
Hello $(1) from $(2)
endef
my_func_1 := $(call my_func,$$(1),$$(2))
export my_func_1

all:
    $(MAKE) -f Makefile_rec.mk
    $(info TOP: $(call my_func,StackOverFlow,Me))

host> cat Makefile_rec.mk
all:
    $(info BOT: $(call my_func_1,StackOverFlow,Me))

host> make --no-print-directory 
TOP: Hello StackOverFlow from Me
make -f Makefile_rec.mk
BOT: Hello StackOverFlow from Me
make[1]: 'all' is up to date.