我需要将a user-defined GNU make function(即a recursively expanded makefile variable)导出到子品牌。然而,make似乎将所有这些变量扩展为简单的扩展变量,这使得它们变得毫无用处。
以下是一个例子:
“parent.make”的内容:
export myfunc = my arg is $1
$(info parent testing myfunc: $(call myfunc,parent))
all: ; $(MAKE) -f child.make
“child.make”的内容:
$(info child testing myfunc: $(call myfunc,child))
nullrule: ; @true
运行“make -f parent.make”会产生以下输出:
parent testing myfunc: my arg is parent
make -f child.make
child testing myfunc: my arg is
父将myfunc导出为包含“my arg is”的简单扩展变量到sub-make,使其无法用作函数。
答案 0 :(得分:3)
是否有一个原因导致公共变量和函数无法放入父和子makefile包含的单独makefile中?
答案 1 :(得分:1)
我不确定这是否能满足您的要求,但请注意:
parent.make:
export myfunc1 = my arg is $1
export myfunc2 = $(value myfunc1)
$(info parent testing myfunc1: $(call myfunc1,parent))
all: ; $(MAKE) -f child.make
child.make:
$(info child testing myfunc2: $(call myfunc2,child))
nullrule: ; @true
修改:
好吧,怎么样:
child.make:
myfunc1=$(myfunc2)
$(info child testing myfunc1: $(call myfunc1,child))
nullrule: ; @true
修改:
没那么快。看看这个:
parent.make:
myfunc_base = my arg is $1
export myfunc = $(value myfunc_base)
$(info parent testing myfunc: $(call myfunc_base,parent))
all: ; @$(MAKE) -f child.make
child.make:
$(info child testing myfunc: $(call myfunc,child))
nullrule: ; @$(MAKE) -f grandchild.make
grandchild.make:
$(info grandchild testing myfunc: $(call myfunc,grandchild))
nullrule: ; @true
这对child.make
或grandchild.make
完全没有任何修改。它需要parent.make
调用myfunc_base
而不是myfunc
;如果那是一个问题,那就有办法绕过它,也许不止一个。
一种可能性,我们将定义移动到任何调用parent
,在那里它根本不会被调用:
grandparent.make:
myfunc_base = my arg is $1
export myfunc = $(value myfunc_base)
all: ; @$(MAKE) -f child.make
parent.make:
$(info parent testing myfunc: $(call myfunc,parent))
all: ; @$(MAKE) -f child.make
我意识到这可能不可行,因为myfunc
的定义可能需要parent.make
中定义的其他内容。看看这是否适合你的情况;可能有另一种方式...