6

我正在使用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 命令上重定向 stderr 流:

scons 2> stderr.txt

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

我已经搜索了这么久,也没有找到任何东西,所以我不知道还有什么可以尝试的。我必须相信我不是第一个想要做这样的事情的人。

4

5 回答 5

5

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

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

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

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

于 2012-06-21T21:42:41.510 回答
3

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

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

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

于 2012-07-18T18:44:06.837 回答
0

代替CCCOMandCXXCOM构造变量,您是否尝试过使用CCandCXX变量?这是SCons 构造变量的完整列表,以防万一。

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

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

于 2012-06-21T13:51:36.663 回答
0

使用如下;

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

于 2015-07-29T10:14:51.100 回答
0

怎么样:

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

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

于 2015-07-29T18:09:31.130 回答