首页 > 解决方案 > 如何在同一个 makefile 中多次强制重建 PHONY 目标?

问题描述

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

例如:

   # 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 设置了目标“二”,因此不会将“二”重建为 group2 的依赖项。

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

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

谢谢!!

标签: makefilegnu-make

解决方案


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

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

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


推荐阅读