当前的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更好。我误解了吗?
答案 0 :(得分:6)
我认为Force Target
就是你在这里寻找的。 p>
lib1.a: FORCE
$(MAKE) -C sub_dir all
FORCE: ;
与.PHONY
规则(由@MadScientist here建议)相比,这本身并不会强制所有依赖lib1.a
的目标重建所有目标时间。只有在lib1.a
实际发生变化时才会这样做。
虽然更好的解决方案可能完全摆脱sub-make,但实际上可以为此makefile提供lib1.a
的依赖关系信息(直接或通过sub_dir
中包含的makefile)这避免了整个“强制这个配方,因为我无法告诉你如何判断目标是否需要更新”问题。