Make - 如何抑制 make 错误消息而不抑制其他输出

Make - 如何抑制 make 错误消息而不抑制其他输出

我正在实现一个简单的构建系统,它实际上只是 Make 的包装。由于此构建系统已经发出自己的错误消息,因此我不希望 Make 产生如下错误消息

make: *** [/cool/makefile:116: /fun/target.o] Error 1

失败时。

我已经使用该-s标志来抑制 Make 的大部分输出。我不希望 Make 忽略错误;我仍然希望它停止并以状态退出。我不能直接杀死所有错误输出,make 2> /dev/null因为我仍然希望看到stderr由正在运行的 Make 任务打印的消息。

有没有办法在不手动解析和清理 Make 输出的情况下做到这一点?我正在使用 GNU Make 4.2.1,并且我不介意特定于 GNU Make 的解决方案。

答案1

由于您的系统是 make 的包装器,因此我认为它会生成 makefile。调整生成器以添加2>&3到 makefile 中的所有 shell 命令,并使程序将文件描述符 3 重定向到标准错误(文件描述符 2),将文件描述符 2 重定向到/dev/null.这样,make 程序本身将打印到其标准错误,该错误将转到/dev/null,并且 build 命令将打印到其标准错误,该错误将转到包装器的标准错误。

如果您使用的是手写的 makefile,则可以对其进行转换以添加这些重定向,前提是该 makefile 的语法不会太混乱(例如,没有生成命令的花哨的 GNU make 宏)。对于以制表符和可选的@或开头的每一行-,并且前一行不以反斜杠结尾,请exec 2>&3;在制表符和可选的 后面添加@-

您可以使用参数调用它,而不是更改 makefile,SHELL=/path/to/shell_wrapper其中shell_wrapper执行其参数并将标准错误重定向到不同的描述符,如下所示:

#!/bin/sh
eval "$2" 2>&3

相关内容