子makefile和向上传递变量

问题描述 投票:6回答:3

我有一个包含子目录和子Makefile的项目。我知道我可以使用export命令通过环境将变量从父makefile传递到子makefile。有没有办法将变量从子makefile传递到其调用的makefile?即可以反向导出工作吗?我尝试此操作没有成功。我猜一旦子制造商完成其外壳及其环境变量将被销毁。还有另一种向上传递变量的标准方法吗?

makefile gnu-make
3个回答
2
投票
[对于递归构建(对于非递归构建,请参见下文)。

与其他命令一样,Make作为配方行执行子制作过程。它的stdout / stderr像其他任何进程一样被打印到终端。通常,子流程不会影响父流程的环境(很显然,这里我们不是在讨论环境,但是适用相同的原理)-除非您有意在父流程中构建类似的东西,但是您将使用IPC机制将其实现。

我可以想出多种方法来实现这一目标,所有这些听起来都是一件可怕的事情。例如,您可以写入文件并在include内使用eval指令(注:未测试)将其来源:

some_target: ${MAKE} ${MFLAGS} -f /path/to/makefile some_other_target : some_target $(eval include /path/to/new/file)

...尽管如上所述,它必须位于一个单独的目标中,因为所有$(macro statements)都是在配方开始执行之前进行评估的,即使宏位于配方的后一行。

gmake v4.x具有一项新功能,可让您直接从makefile指令进行write out to a file。文档中的示例:

如果命令要求每个参数都在输入文件,您可以这样编写食谱:

program: $(OBJECTS) $(file >$@.in) $(foreach O,$^,$(file >>$@.in,$O)) $(CMD) $(CMDFLAGS) @$@.in @rm $@.in

((gnu.org)

...但您仍需要在单独的配方中使用$(eval include ...)宏来使用文件内容。

我非常反对在食谱中使用$(eval include ...);在并行构建中,包含的文件可能会影响make变量,并且包含发生的时间可能不确定(与其他并行构建的目标有关)。

找到更好的解决方案自然会更好。我首先要退后一步,问自己“我想解决什么问题,其他人如何解决了这个问题?”如果您没有找到尝试解决该问题的人,那么很有可能是因为他们没有沿着您所走的路开始。


edit您

可以

进行非递归构建所需的操作。例如:# makefile1 include makefile2 my_tool: ${OBJS} # makefile2 OBJS := some.o list.o of.o objects.o ...尽管我警告您在此方面要非常小心。我维护的构建非常大(大约250个makefile)。每个级别都包含如下语句:
include ${SOME_DIRECTORY}/*/makefile

这里的危险是,您不希望一棵树上的人依赖于另一棵树上的变量。在短期内,有一些地方我需要做一些您想要的事情:将子makefile文件追加到变量中,然后将该变量用于父makefile文件中。从长远来看,它会变脆,因为它很脆/不安全,但是暂时我不得不使用它。

我建议您阅读论文Recursive Make Considered Harmful(如果该链接不起作用,则只需google the name of the paper)。

0
投票
None

0
投票
None

推荐问答