我正在实现一个简单的构建系统,该系统实际上只是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宏可以生成命令)。对于以制表符(可选)@
或开头的每行-
,并且前一行不以反斜杠结尾的行,请exec 2>&3;
在制表符和可选的之后添加@-
。
除了更改makefile之外,您还可以使用参数调用它,SHELL=/path/to/shell_wrapper
其中whereshell_wrapper
是将其标准错误重定向到另一个描述符的方式执行其参数,如下所示:
#!/bin/sh
eval "$2" 2>&3
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句