这可能很简单,但我找不到答案。我正在为嵌入式平台开发一个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。有什么想法吗?
答案 0 :(得分:1)
真实目标不应取决于.PHONY
目标。这导致了你遇到的问题。
伪目标不应该是真实目标文件的先决条件;如果是,每次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
的构建输出。