GNU make - 具有多个配方的目标,其中只需要一个配方

时间:2015-06-14 18:42:21

标签: build makefile dependencies gnu-make

摘要说明

我在Makefile中有以下情况:

target_1 target_2 :
    some_recipe_that_creates_both

target_1 :
    some_recipe_that_creates_only_target_1

请注意,如果没有target_2有效建立target_1的配方是不可能的。因此,如果我已经需要构建target_2,我希望避免运行target_1 - 唯一的配方。理想情况下,这意味着make将按如下方式工作:

  • 如果有人试图在没有target_1的情况下生成target_2,那么请使用makefile示例中的第二个配方,因为它更快。
  • 如果有人试图制作target_1target_2,请使用makefile示例中的第一个配方,因为它比运行同时创建两者的配方更快。

我有办法实现这个目标吗?我知道双冒号规则,他们会运行两个配方,而不是只有其中一个。

请注意,我需要一个支持使用-j参数make的解决方案(但没有递归make)。

真实场景

以下文字仅为了完整起见,并且由于评论询问这里的实际情况,它描述了target_1target_2的内容:

我正在编译依赖它的共享库和可执行文件。如果我完成了对共享库的编译,我想确保exe仍然可以看到它所需的所有符号。有两种方法可以做到:

  • 让exe链接取决于共享对象。
  • 将exe链接分为两个步骤(以空标记文件作为目标),exe链接和缺少符号检查(ldd -r)。问题是exe链接已经意味着缺少符号检查,因此缺少符号检查基本上是target_1,并且链接同时执行target_1target_2)。

2 个答案:

答案 0 :(得分:1)

这有点像黑客,但以下内容可能会起作用

ifneq ($(filter target_1,$(if $(filter target_2,$(MAKECMDGOALS)),,$(MAKECMDGOALS))),)
target_1 :
    some_recipe_that_creates_only_target_1
else
target_1 : target_2
endif

target_2 :
    some_recipe_that_creates_both

答案 1 :(得分:0)

我真的没有看到你提供的样本背后,我有可能在所有细节中都没有发现问题。但是,只是觉得makefile设计器的分解工作还没有完成。

根据我的理解:

  1. 如果您只需要target_1,则makefile中存在一个现有目标target_1。所以,你只需要使用它。
  2. 如果您只需要target_2,则没有这种可能性。为什么?
  3. 如果您需要制作两个目标,则使用比构建整个target_1加上整个target_2更快的特殊配方,可能是因为target_2冗余地构建了target_1 {1}}(我是对的吗?)。
  4. 所以,感觉你需要类似的东西:

    target12_common:
        common_piece_absolutely_needed_by_target1_and_by_target2
    
    target2: target12_common
        some_recipe_that_creates_target2_only
    
    target1: target12_common
        some_recipe_that_creates_target1_only
    
    all: target1 target2
    

    你的系统是否可行?