makefile - 与现有目标建立依赖关系并缺少依赖关系

标签 makefile gnu-make

我有一个 makefile,例如:

A : B
    echo "made A"
B : D
    echo "made B"

在这里,B存在但D不存在(有时存在,有时不存在)

现在如果我执行 make,它会对我大喊:

make: *** No rule to make target 'D', needed by 'B'.  Stop.

有什么方法可以正确运行,即:

  • B 和 D 不存在:失败
  • B 存在,D 存在并且比 B 更新,应用配方
  • B 存在,D 存在但更老:什么都不做
  • 如果 B 存在而 D 不存在:不要重建 B(你不能)但你可以使用 B 来构建 A

使用以 D 作为目标的空行将始终执行构建 B 的配方,但没有 D 则不能,因此不需要!

有什么办法吗?

我找到了使用空规则的解决方案

D : 

最后,这样缺D也不会失败。所以现在一切正常,除了如果缺少 D 会重做 B,这可以在 B 配方中进行测试:

B : D
    if [ D ] ; then echo "doing B with D"; fi

但它真的看起来很老套......

最佳答案

您可以通过将 B 标记为中间体来绕过从旧 D 重新生成 B:

 .INTERMEDIATE : B

然后您可以删除 D 的空规则,并且符合“正确”行为的四个条件。

关于makefile - 与现有目标建立依赖关系并缺少依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8169512/

相关文章:

gnu-make - 为什么 GNU Make jar 头食谱不起作用?

ubuntu - 在ubuntu中编译opencv程序

c - lex yacc 和 C 的简单 makefile

linux - 我如何初始化然后在 linux makefile 中迭代数组?

c++ - 构建后Eclipse将头文件复制到特定位置

makefile - 模式规则中的通配符

linux - 在 poky 构建中运行自定义 bitbake 时出现 do_install 错误

bash - GNU Make 如何为不在同一目录中的文件制定静态模式规则?

c++ - mingw32-make : *** No targets. 停止

makefile - 无法在配方中分配变量