当前的Makefile有这样的东西:
target1 : lib1.a lib2.a
target2 : lib1.a lib3.a
target3 : lib3.a
lib1.a:
$(MAKE) -C sub_dir all
我想改变这个Makefile,这样无论目标何时依赖于lib1.a
,它总是运行命令“$(MAKE) -C sub_dir all
”。换句话说,在上面的例子中,target1和target2将始终运行“$(MAKE) -C sub_dir all
”。有什么方法可以做到吗?
我知道以下不起作用:
target1 : lib2.a
$(MAKE) -C sub_dir all
target2 : lib3.a
$(MAKE) -C sub_dir all
target3 : lib3.a
因为如果lib2.a没有更新,则该命令不会运行。我有一个限制,我只控制lib1.a,我无法改变lib2.a的构建方式。
任何帮助表示赞赏!
更新:我使用以下解决方案:
target1 : lib1.a lib2.a
target2 : lib1.a lib3.a
target3 : lib3.a
lib1.a: relay
.PHONY: relay
relay:
$(MAKE) -C sub_dir all
GNU Make help说FORCE不如.PHONY效率高,但从你的解释来看,在我看来FORCE更好。我误解了吗?
我认为Force Target
就是你在这里寻找的。
lib1.a: FORCE
$(MAKE) -C sub_dir all
FORCE: ;
与.PHONY
规则(由@MadScientist here建议)相比,这本身并不会强制所有依赖lib1.a
的目标一直重建。只有当lib1.a
实际发生变化时才会这样做。
一个更好的解决方案可能完全摆脱sub-make并实际上有lib1.a
的依赖信息可用于这个makefile(直接或通过sub_dir
中包含的makefile)因为这可以避免这整个“强制这个配方,因为我可以告诉你如何判断目标是否需要更新“问题。