我在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_1
和target_2
,请使用makefile示例中的第一个配方,因为它比运行同时创建两者的配方更快。我有办法实现这个目标吗?我知道双冒号规则,他们会运行两个配方,而不是只有其中一个。
请注意,我需要一个支持使用-j
参数make的解决方案(但没有递归make)。
以下文字仅为了完整起见,并且由于评论询问这里的实际情况,它描述了target_1
和target_2
的内容:
我正在编译依赖它的共享库和可执行文件。如果我完成了对共享库的编译,我想确保exe仍然可以看到它所需的所有符号。有两种方法可以做到:
ldd -r
)。问题是exe链接已经意味着缺少符号检查,因此缺少符号检查基本上是target_1
,并且链接同时执行target_1
和target_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设计器的分解工作还没有完成。
根据我的理解:
target_1
,则makefile中存在一个现有目标target_1
。所以,你只需要使用它。target_2
,则没有这种可能性。为什么?target_1
加上整个target_2
更快的特殊配方,可能是因为target_2
冗余地构建了target_1
{1}}(我是对的吗?)。所以,感觉你需要类似的东西:
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
你的系统是否可行?