makefile - GNU Makefile 等效于 shell 'TRAP' 命令,用于在退出时简明识别构建失败

标签 makefile gnu gnu-make

标准:Makefile 是一个 GNU Make Makefile - 我对 makepp、qmake、cmake 等不感兴趣。它们都很好(尤其是 cmake),但这是为了工作,我们在工作中使用 GNU Make。最佳解决方案是纯 Makefile 解决方案,而不是为您解析 make 的 shell 脚本。

我也不想做一个“继续失败”的解决方案——如果它坏了,它就坏了,需要修复。

情况是这样的,我有一个 makefile 并行构建多个目录 - 如果其中一个失败,当然整个构建失败,但直到所有正在运行的 make 运行完成(或失败)。这意味着 make 实际上失败的原因埋藏在距离 make 输出结束的任意远处。

这是我所拥有的一个例子:

all: $(SUBDIRS)

SUBDIRS = \
  apple \
  orange \
  banana \
  pineapple \
  lemon \
  watermelon \
  grapefruit

$(SUBDIRS):
  cd $@ && $(MAKE) $(MFLAGS) 2>&1 | sed -e "s/^/$(notdir $(@)): /g"

如果我运行 'make -j 5' 并且 'orange' 碰巧失败了 - 我想在最后看到这样的表格
制作过程
  apple     - passed
  orange    - FAILED
  banana    - passed
  pineapple - passed
  lemon     - passed

我已经考虑过 && 回声“通过” >.result || echo "FAILED">.result, 但 make 仍然需要某种 TRAP 或 __onexit() 清理命令在退出时打印它们。

任何 Makefile ninjas 有一个纯 makefile 解决方案吗?

取消编辑 - 我的解决方案实际上并没有像我希望的那样工作......受阻!

最佳答案

当您希望 make 在第一次失败时中止,立即结束并终止所有正在进行的作业而不是等待它们完成,您需要像这样修补 GNU Make
http://lists.gnu.org/archive/html/bug-make/2009-01/msg00035.html

然后,您需要为每个进行调用的 shell 设置一个陷阱(以及 set -o pipefail,如果您使用管道),如这篇文章 http://lists.gnu.org/archive/html/help-make/2009-02/msg00011.html 中所述。

简而言之:

target1:
    trap 'kill $$(jobs -p)'; command && something || something-else
target2:
    trap 'kill $$(jobs -p)'; set -o pipefail; command | sed '...'

关于makefile - GNU Makefile 等效于 shell 'TRAP' 命令,用于在退出时简明识别构建失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6416180/

相关文章:

C++:修改函数,尝试重新编译,得到对该函数的 undefined reference

python-3.x - 在 macOS 上为 Python 3.6.3 使用 dbm.gnu

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

c++ - 在 R 包中强制重建源代码

makefile - 你能优先考虑 makefile 目标吗?

linux - 编写一个 Makefile 以自动获取文件名并创建具有相同名称的相应可执行文件

linux - 防止 objdump 截断十六进制输出

gcc - GNU LD 链接描述文件 - 堆栈放置

android - 如何设置 GNUMAKE 变量以使 ndk-build 正常工作

c++ - Make 无法匹配目标