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

6
我在工作中使用SCons构建项目,尝试解析来自GCC的文本输出,以便为每个目标制作所有编译器警告的汇总报告。因为我们的构建脚本非常长,控制台上有很多文本输出。我已经在谷歌和这个网站上搜索了很长时间,但我找不到SCons内置的方法来完成这个任务。我尝试按照这个示例将整个stdout和stderr流重定向到文件,但只捕获了SCons本身的输出,而没有任何调用的工具的输出。我的下一个想法是找到SCons编译要发送给GCC的参数的位置,并在参数字符串的末尾添加重定向。阅读文档后,我发现构造变量CCCOMCXXCOM包含用于编译的命令行。然而,当我在SConstruct中添加下面的行时,SCons执行的命令行没有任何变化。
baseEnv['CCCOM'] += " 2> gcc-c-output.txt"
baseEnv['CXXCOM'] += " 2> gcc-cxx-output.txt"

有一个可行的方法是将整个SCons命令的stderr流重定向:

scons 2> stderr.txt

我希望能够避免这种情况,并尽可能地将所有内容包含在SCons中。输出也不一定要输出到文件中,只要我可以访问并解析并在构建结束时保存到文件中即可保存在任何地方。我已经搜寻了很久但没有找到任何有用的信息,所以我不知道还该怎么试。我相信我不是第一个想做这种事情的人。
5个回答

5
我将自己的问题回答在这里,因为我发现了我的错误。变量CCCOMCXXCOM是正确的修改对象,但问题是我正在创建共享库对象,因此这些变量未被使用。我应该修改的是SHCCCOMSHCXXCOM
以下代码可用于重定向GCC警告输出(警告和错误仅写入stderr):
baseEnv['SHCCCOM'] += " 2> gcc-c-output.txt"
baseEnv['SHCXXCOM'] += " 2> gcc-cxx-output.txt"

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


3
为了完全控制,您可以覆盖env['SPAWN']构造变量。然后,您将提供一个Python方法,该方法将负责执行通过参数给出的命令行。通常,您会采用此参数并生成子进程(使用某种形式的subprocess.Popen)。这将为默认的env['SPAWN']进行透传替换。
但是现在,您完全掌握了subprocess.Popen调用。您可以自由地将STDOUTSTDERR或二者都重定向到任何缓冲区/文件中。您还可以在打印到控制台和/或保存到文件之前对输出进行后处理。例如,我使用它在黄色中着色警告,在红色中着色错误。
有关如何覆盖env['SPAWN']的示例代码,请查看SCons Wiki上的此页面

当命令行过长时,使用SPAWN方法会在Windows上出现错误,并且scons使用tempfile执行链接步骤。 :( - Nick

0
使用方法如下: baseEnv['CCCOM'][0] += " 2> gcc-c-output.txt"

0

你试过使用 CCCXX 变量替代 CCCOMCXXCOM 构建变量吗?这里是所有 SCons 构建变量的完整列表(链接)

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

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


我知道这些变量实际上是用于编译的命令,所以我认为它们是修改的好候选者,但是SCons似乎忽略了我的修改。我甚至尝试将它们的值设置为空字符串,但它仍然可以编译。我觉得有些不对劲,因为在寻找解决方案时,我看到了修改这些变量的提及。不过,我没有考虑包装GCC可执行文件。在等待可能更适合SCons的答案时,我会探索这个选项。 - EarlCrapstone
@EarlCrapstone,我非常确定这两个变量的值在每个cc文件编译时都会改变(被覆盖),所以你的修改并没有起到任何作用。尝试使用CC和CXX替代它们,这样可以发挥作用。我已经将它们修改为指定不同的编译器,那确实是有效的。 - Brady
我弄清楚了我的错误,但由于我是新手,需要再等四个小时才能回答自己的问题。@Brady 那些变量在构建过程中实际上并没有被更改。我的问题在于我正在构建共享库对象,因此它使用的是SHCCCOMSHCXXCOM - EarlCrapstone

0

这样怎么样:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接