【问题标题】:How can I force a rebuild of a PHONY target more than once in the same makefile?如何在同一个 makefile 中多次强制重建 PHONY 目标?
【发布时间】:2020-12-10 00:36:41
【问题描述】:

我有一个应用程序,我需要在其中创建目标组,其中给定目标可能作为依赖项出现在多个组中。如果包含一个共同目标的多个组在同一个调用中构建,我希望每次都重新构建共同的先决条件,而不是只为所有组重新构建一次。

例如:

   # Makefile.test_group_overrides

   GROUPS=group1 group2
   
   all: $(GROUPS)
   
   one:
           @echo $@ is $(NUM)
   
   two:
           @echo $@ is $(NUM)
   
   three:
           @echo $@ is $(NUM)
   
   group1: NUM=2
   group1: one two
   
   group2: NUM=3
   group2: two three

如果我执行:

$ make -f Makefile.test_group_overrides group1
one is 2
two is 2
   
$ make -f Makefile.test_group_overrides group2
two is 3
three is 3

这是我对独立执行的每个组目标的期望。

但是,如果我尝试在同一个调用中构建 两个 组,则如下:

$ make -f Makefile.test_group_overrides all
one is 2
two is 2
three is 3 

Make 似乎注册了它已经为 group1 设置了目标“two”,因此不会将“two”重建为 group2 的依赖项。

我尝试了使用 .PHONY/FORCE 目标组合和 -B 开关强制重建“两个”的变体,但没有任何运气。

有解决办法吗?如果可能的话,我宁愿不创建临时文件来解决。

谢谢!!

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    如果在同一个调用 make 中构建了多个包含共同目标的组,我希望每次都重新构建共同的先决条件,而不是只为所有组重新构建一次。

    我知道的任何make 实现都无法做到这一点。每个目标最多构建一次是make 设计的基本特征。虚假目标也不例外。

    如果事实上您的目标在与一个组关联时的构建方式与在与不同组关联时的构建方式不同,那么您已经在紧张make 的构建模型。在这种情况下,您应该为每个组将目标拆分为单独的目标,因为无论如何这就是您所拥有的。如果您需要以两种方式构建目标,则可以确认您确实有不同的目标,并且您正在尝试将它们建模为一个。

    【讨论】:

    • 感谢您的及时回复!