将递归makefile变量导出到submakes

时间:2011-10-17 04:29:49

标签: recursion makefile export gnu-make user-defined-functions

我需要将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,使其无法用作函数。

2 个答案:

答案 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.makegrandchild.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中定义的其他内容。看看这是否适合你的情况;可能有另一种方式...