【问题标题】:How can I force Make to execute a recipe all the time如何强制 Make 一直执行一个配方
【发布时间】:2014-10-06 22:54:27
【问题描述】:

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

【问题讨论】:

  • 您可以添加.PHONY: lib1.a,但这会导致所有目标一直重新链接。
  • 使目标依赖于某些东西(sub_dir?),而后者又依赖于 lib1.a

标签: makefile gnu-make


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 2011-01-18
    • 2021-01-06
    相关资源
    最近更新 更多