如何获取将在SCons中重建后编译的File对象?

时间:2016-09-13 08:28:16

标签: scons

我必须处理编译期间生成的一些日志文件。

由于某些编译器会将错误附加到以前版本中创建的日志中,因此我必须删除先前版本中生成的错误日志文件,如果这些文件将再次编译。

我需要一个在重建期间编译的File对象列表。目前,构建器返回所有要编译的文件。

这可以通过SCons实现吗?

1 个答案:

答案 0 :(得分:2)

你正在从一个角度接近这个问题,这个角度会让你很快进入SCons内部的“兔子洞”。

这里的要点是:SCons不知道你的日志文件,所以你必须教它。在某种程度上,您必须将这些构建步骤标记(或标记)为特殊,以便SCons知道:“啊哈,当我执行此操作以从foo.o创建foo.cpp时...也有事后foo.log,我需要了解它。“

这是方法SideEffect()Clean()的用途(参见UserGuideMAN page)。前者专门针对多个构建步骤写入额外(日志)文件的情况而设计,但它们都使用相同的文件名。因此,即使使用“-j”选项调用SCons,单个构建步骤也需要按顺序运行。 您还没有进一步了解目前是否属于您的情况,但我认为不是......因此根本不需要SideEffect来解决您的问题:

./runme.sh
==========
#!/bin/sh

cp $1 $2
echo "Hi there" >> out.log

./SConstruct
============
env = Environment()
t = env.Command('out.txt', 'in.txt', './runme.sh $SOURCE $TARGET')
env.Clean(t, 'out.log')

通过添加Clean()规范,SCons知道当实际目标out.log清理时,它也必须删除文件out.txt。 如果为每个编译命令执行此操作证明太麻烦,可以为它编写一个小的Python包装器方法,或者甚至编写自己的“伪构建器”。您可以在ToolsForFools Guide中找到有关后者的更多信息和指南。 是的,您必须显式调用“scons -c”来清理日志文件和所有目标...... SCons不会自动删除每次重建时的日志文件,因为它无法知道这一点是你想要的。您(或其他一些用户)可能希望连接多个构建的日志输出,那么SCons将如何知道?

详细阐述了您实际提出的问题,SCons知道的所有内容都是目标和源文件。如果源文件已更改(不是最新)或目标尚不存在,则它知道可以执行以构建目标的操作列表。这可以是单个字符串,也可以是Python函数,也可以是这些函数的混合列表。但是没有进行语义分析,SCons试图找出那些单独的行动意味着什么。试图“猜测”,因为涉及可执行文件“gcc”它必须是一个编译步骤,这是一个太简单的方法。如果有人使用任意命名的链接到他的编译器怎么办?那么为了所有不同的目的,交叉编译,跨越一个巨大的不同编译器名称树呢?那么性能分析和内存检查工具如Insure ++,你需要调用“insure gcc”呢? 最后,当你只能查看我给你的命令行时,你将如何定义“编译”? ;)