我正在实现一个简单的构建系统,它实际上只是 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