Makefile依赖性重用现有工件来重制共同目标

时间:2014-12-11 14:22:41

标签: makefile dependencies gnu-make

这可能很简单,但我找不到答案。我正在为嵌入式平台开发一个gmake系统,它有两个处理元素,每个处理元素都有自己的固件,称之为CoreA.bin和CoreB,每个处理元素都有自己的依赖树。 CoreB的制作系统来自第三方,必须被视为黑匣子PHONY目标。引导加载程序从单个二进制文件更新它们,称之为BinFile.bin,它包含一起滚动的CoreA.bin和CoreB二进制文件。

因此make依赖项看起来像这样:

.PHONY CoreB
CoreA.bin: Some Targets
CoreB    : Yet More
BinFile.bin: CoreA.bin CoreB
all: BinFile.bin

美好而简单。然而,构建需要很长时间,并且在CoreA上工作的人一次构建'all'以获得CoreB二进制文件然后获得BinFile,然后只需要重建CoreA。 make依赖关系需要很长时间才能解决,因此他们不想重新制作CoreB,但他们确实需要重新制作BinFile。

这看起来像这样:

BinFileSubsequent : CoreA
BinFileSubsequent :
     # Remake CoreA
     # Remake the BinFile rollup without duplicating the makefile code

问题在于抖动CoreB依赖,但仍然使用现有工件重新构建BinFile。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

真实目标不应取决于.PHONY目标。这导致了你遇到的问题。

来自4.6 Phony Targets

  

伪目标不应该是真实目标文件的先决条件;如果是,每次make更新该文件时都会运行其配方。只要虚假目标永远不是真实目标的先决条件,只有当虚假目标是指定目标时才会执行虚假目标配方(请参阅指定目标的参数)。

CoreB构建系统是否有办法告诉您它是否有工作要做?如果确实如此,那么使用图章文件而不是虚假目标可能是最简单的解决方案。

如果没有,并且手动“解决方案”是可以接受的,那么这样的事情可能会有效。

.PHONY CoreB
CoreA.bin: Some Targets
CoreB    : Yet More
ifeq (,$(PARTIAL_BUILD))
BinFile.bin: CoreB
endif
BinFile.bin: CoreA.bin
all: BinFile.bin

然后运行make将执行完整版本,并且正在运行make PARTIAL_BUILD=1而不会列出CoreB作为BinFile.bin的先决条件。

当然,这假设BinFile.bin规则知道如何在不使用CoreB先决条件的情况下查找CoreB的构建输出。