使用 make -j 时如何识别失败的命令

How can I identify the failed command, when using make -j

当在包含多个目标的文件上使用 make -j 而其中一个失败时,识别引发错误的特定命令可能会有点麻烦。特别是当有很多输出时。

我可以说服 gnu make 打印这样的东西吗(最好在输出结束时):

This particular command failed: "frobniz -foo" with output "frobniz only takes -foo options on a thursday"? 

现在,我在 tmux 中使用 make -j -Otarget 及其可搜索的历史记录,这样我就可以找到 "failed" 输出:

Makefile:41: recipe for target 't4' failed

唉,'t4' 目标有大约 40 个命令,输出很多,所以我必须进行更多搜索才能找到实际失败的命令。它易于管理,但确实感觉笨拙。 我也试过remake,但它似乎没有任何选项。

编辑:显然,我应该在这里放一些代码,让我修改一下;这是 16 个目标中的一个,每个目标有大约 40 个命令。下面的示例已被削减为 4 个命令。

t4:
  sso -dump FAIL:B -path /instadm-bin/ktkopdat.start -ttarget "AA" ht1
  sso -dump FAIL:B -path /instadm-bin/ktknyadm -ttarget "BB" ht1
  sso -dump FAIL:B -path /instadm-bin/multiadm -ttarget "CC" ht1
  sso -dump FAIL:B -path /instadm-bin/ktkslet.start -ttarge "DD" ht1

假设我 运行 make -j 上面的第二行失败了。失败和命令在 make 的输出中可见,但与许多其他输出混合在一起。

生成错误的 make 执行的是:sso -dump FAIL:B -path /instadm-bin/ktknyadm -ttarget "BB" ht1 - 它失败,状态为 -1。

现在,make 必须知道哪个命令失败了,因为此时它可以中止进程。这些信息对我来说非常有价值,但它仍然隐藏在许多并行进程的混乱输出中。请注意,我当然可以在没有 -j 选项的情况下重新 运行 make,从而确保所需的信息显示在输出的底部,但我不想重复冗长的构建更多次不必要的。

我不确定您所说的 40 条具有大量输出的命令 是什么意思。如果您提供示例,将会很有帮助。

如果你的意思是,你有 40 个逻辑配方行(不使用反斜杠将 40 个物理行组合成一个逻辑行),那么一旦其中一个命令失败,make 将停止构建该配方并且不会运行 任何更多的命令,所以失败的命令将永远是最后一个。

如果你的意思是,你有一个很长的 shell 脚本,它由 40 条物理行组成,使用分号和反斜杠组合成一个逻辑行,那么 make 无法帮助你,因为 make 不知道什么命令失败了.

Make 将调用 shell 的一个实例并将每个完整的逻辑配方行传递给 shell,并等待 shell 以退出代码 0 或非 0。如果退出代码为 0,则 make 假定配方成功;如果退出代码非 0,则 make 假定配方失败。 Make 无法知道调用了多个命令、调用了哪些命令、哪些命令可能失败了、哪些命令发出了哪些输出等等。所有这些信息只有 shell 知道,而不是制作。