使用 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 知道,而不是制作。
当在包含多个目标的文件上使用 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 知道,而不是制作。