【发布时间】:2015-08-30 05:45:14
【问题描述】:
摘要说明
我在 Makefile 中有以下情况:
target_1 target_2 :
some_recipe_that_creates_both
target_1 :
some_recipe_that_creates_only_target_1
请注意,如果没有target_1,就不可能有一个有效地构建target_2 的配方。因此,如果我已经需要构建target_2,我想避免运行target_1-only 配方。理想情况下,这意味着 make 的工作方式如下:
- 如果有人尝试在不使用
target_2的情况下创建target_1,则使用 makefile 示例中的第二个配方,因为它更快。 - 如果有人尝试创建
target_1和target_2,请使用 makefile 示例中的第一个配方,因为它比运行创建两者的配方要快。
有什么方法可以实现吗?我知道双冒号规则,但他们会同时运行两种配方,而不是只运行其中一种。
请注意,我需要一个支持使用 -j 参数进行 make 的解决方案(但没有递归 make)。
真实场景
以下文字仅出于完整性考虑,并且由于 cmets 询问此处的真实场景是什么,它描述了 target_1 和 target_2 是什么:
我正在编译一个共享库和依赖它的可执行文件。如果我完成了共享库的编译,我想确保 exe 仍然可以看到它需要的所有符号。有两种方法可以做到:
- 让 exe 链接依赖于共享对象。
- 将 exe 链接拆分为两个步骤(以空标记文件作为目标)、exe 链接和缺少符号检查 (
ldd -r)。问题是exe链接已经意味着缺少符号检查,所以缺少符号检查本质上是target_1,而链接是target_1和target_2)。
【问题讨论】:
-
问题:当您在
If someone tries to make target_1 without target_2, then use the SECOND recipe since it is faster中说second时,您指的是代码示例中的第二个秘诀还是您语句中的第二个秘诀?第二个子弹也是如此。考虑代码示例更有意义,但我只是想确认一下。 -
@chatraed - 谢谢,我已将我的问题修正为不那么模棱两可。
标签: build makefile dependencies gnu-make