如何强制Make一直执行配方

时间:2014-10-06 22:54:27

标签: makefile gnu-make

当前的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更好。我误解了吗?

1 个答案:

答案 0 :(得分:6)

我认为Force Target就是你在这里寻找的。

lib1.a: FORCE
        $(MAKE) -C sub_dir all

FORCE: ;

.PHONY规则(由@MadScientist here建议)相比,这本身并不会强制所有依赖lib1.a的目标重建所有目标时间。只有在lib1.a实际发生变化时才会这样做。

虽然更好的解决方案可能完全摆脱sub-make,但实际上可以为此makefile提供lib1.a的依赖关系信息(直接或通过sub_dir中包含的makefile)这避免了整个“强制这个配方,因为我无法告诉你如何判断目标是否需要更新”问题。