当前的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
嗨Etan,您指出的GNU帮助说FORCE不如.PHONY效率高,但从您的解释来看,在我看来FORCE更好.我误解了吗?你能评论我的解决方案吗?
我认为这Force Target
就是你在这里寻找的东西.
lib1.a: FORCE $(MAKE) -C sub_dir all FORCE: ;
与.PHONY
规则相比(正如@MadScientist 在这里所建议的那样),这本身并不会强制所有依赖于lib1.a
重建的目标.只有lib1.a
实际改变才会这样做.
一个更好的解决方案虽然可能完全摆脱子make,实际上有lib1.a
这个makefile可用的依赖信息(直接或通过包含的makefile sub_dir
),因为这避免了这整个"强制这个配方,因为我不能告诉你如何判断目标是否需要更新"问题.