我想在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
来创建文件
答案 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.