SCons:保存/重定向 gcc 文本输出(警告)



我正在使用SCons在工作中构建一个项目,并且我正在尝试解析GCC的文本输出,以为每个目标制作所有编译器警告的摘要报告,因为我们的构建脚本很长,并且有很多文本输出到控制台。

我已经搜索了Google和这个网站很长一段时间,但我找不到内置于SCons的方法来实现这一点。我尝试根据此示例将整个 stdout 和 stderr 流重定向到文件,但只捕获 SCons 本身的输出,而不是它调用的任何工具的输出。

我的下一个想法是找到SCons在哪里编译要发送到GCC的参数,并将重定向添加到参数字符串的末尾。阅读文档后,似乎构造变量CCCOMCXXCOM包含用于编译的命令行。但是,当我将下面的行添加到我的 SConstruct 时,命令行 SCons 正在执行任何更改。

baseEnv['CCCOM'] += " 2> gcc-c-output.txt"
baseEnv['CXXCOM'] += " 2> gcc-cxx-output.txt"

确实有效的一件事是在整个SCons命令上重定向stdrr流:

scons 2> stderr.txt

但是,我想避免这种情况,并在可能的情况下将所有内容包含在 SCons 中。输出也不一定必须转到文件。只要我可以访问它以解析并在构建结束时保存到文件中,它就可以保存在任何地方。

我找了这么久,什么也没找到,所以我不知道还能尝试什么。我必须相信,我不是第一个想做这样的事情的人。

我将在这里回答我自己的问题,因为我弄清楚我做错了什么。CCCOMCXXCOM 变量是要修改的正确变量,但问题是我正在创建共享库对象,因此没有使用这些变量。我应该修改的是SHCCCOMSHCXXCOM.

以下代码完成了重定向 GCC 警告输出的工作(警告和错误仅写入 stderr):

baseEnv['SHCCCOM'] += " 2> gcc-c-output.txt"
baseEnv['SHCXXCOM'] += " 2> gcc-cxx-output.txt"

希望这个答案能帮助其他人,因为我在搜索时找不到太多关于这个主题的信息。

为了完全控制,您可以覆盖env['SPAWN']构造变量。然后,您将提供一个 Python 方法,该方法将负责执行通过参数提供给它的命令行。通常,你会接受这个参数并生成一个子进程(使用某种形式的subprocess.Popen)。这将对默认env['SPAWN']进行传递替换。

但是现在,您可以完全控制subprocess.Popen调用。您可以自由地将STDOUTSTDERR或两者重定向到任何缓冲区/文件。您还可以在将该输出打印到控制台和/或将其保存到文件之前对该输出进行后处理。例如,我用它来为黄色警告着色,将错误着色为红色。

有关如何覆盖env['SPAWN']的示例代码,请查看SCons Wiki上的此页面。

您是否尝试过使用 CCCXX 变量,而不是 CCCOMCXXCOM 构造变量?以下是SCons构造变量的完整列表,以防万一。

您甚至可以考虑将CCCXX设置为系统上在内部执行重定向的脚本。

编辑:我忘了提到CCCOMCXXCOM变量是用于实际编译源文件的命令,以及所有的CFlags等。 我很惊讶你能够设置它们,因为我认为它们是只读变量。

按如下方式使用;

baseEnv['CCCOM'][0] += " 2> gcc-c-output.txt"

怎么样:

baseEnv['SHCCCOM'] += " 2> ${SOURCE}gcc-c-output.txt"
baseEnv['SHCXXCOM'] += " 2> ${SOURCE}gcc-cxx-output.txt"

这应该为每个源文件提供一个单独的文件。

最新更新