我正在实现一个简单的构建系统,它实际上只是 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 特定的解决方案。
由于您的系统是 make 的包装器,因此我认为它会生成 makefile。调整您的生成器以添加
2>&3
到 makefile 中的所有 shell 命令,并使您的程序将文件描述符 3 重定向到标准错误(文件描述符 2)和文件描述符 2 到/dev/null
. 这样,make 程序本身将打印到其标准错误,该错误转到/dev/null
,而构建命令将打印到其标准错误,该标准错误转到包装器的标准错误。如果您使用的是手写的makefile,您可以对其进行转换以添加这些重定向,假设makefile 的语法不会太疯狂(例如,没有生成命令的花哨的GNU make 宏)。
@
对于以制表符和可选的or开头的每一行,-
并且前一行不以反斜杠结尾,exec 2>&3;
在制表符和可选的之后添加@-
。您可以使用参数调用它,而不是更改 makefile,
SHELL=/path/to/shell_wrapper
其中shell_wrapper
is 执行其参数并将标准错误重定向到不同的描述符,如下所示: