如何强制Make一直执行配方

问题描述 投票:3回答:1

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

makefile gnu-make
1个回答
6
投票

我认为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)因为这可以避免这整个“强制这个配方,因为我可以告诉你如何判断目标是否需要更新“问题。

© www.soinside.com 2019 - 2024. All rights reserved.