SCons不会清除所有文件

时间:2010-03-18 22:34:47

标签: generator scons

我有一个包含“builds”目录的文件系统,每个目录都包含一个名为“build-info.xml”的文件。然而,一些构建发生在构建脚本生成“build-info.xml”之前,因此在这种情况下,我有一些非常重要的SCons SConstruct,用于生成框架build-info.xml,以便它可以用作进一步规则的依赖。

I.e。:每个目录:

  • 如果build-info.xml已存在,则不执行任何操作。更重要的是,不要在'scons --clean'上删除它。
  • 如果build-info.xml不存在,则生成一个骨架 - 而build-info.xml与任何其他文件没有依赖关系 - 骨架基本上是最小的默认值。
  • 在--clean期间,如果生成,请删除build-info.xml,否则请将其保留。

我的SConstruct看起来像这样:

def generate_actions_BuildInfoXML(source, target, env, for_signature):
    cmd = "python '%s/bin/create-build-info-xml.py' --version $VERSION --path . --output ${TARGET.file}" % (Dir('#').abspath,)
    return cmd

bld = Builder(generator = generate_actions_BuildInfoXML, chdir = 1)
env.Append(BUILDERS = { "BuildInfoXML" : bld })

...

# VERSION = some arbitrary string, not important here
# path = filesystem path, set elsewhere
build_info_xml = "%s/build-info.xml" % (path,)
if not os.path.exists(build_info_xml):
    env.BuildInfoXML(build_info_xml, None, VERSION = build)

我的问题是'scons --clean'不会删除生成的build-info.xml文件。

我在'if'中使用了env.Clean(t,build_info_xml),但我无法使其工作 - 主要是因为我无法确定要分配给't'的内容 - 我想要生成的构建-info.xml无条件地清理,而不是基于另一个目标的清理,我无法使其工作。

如果我在'if'之后尝试了一个简单的env.Clean(无,“build_info_xml”),我发现SCons会清理每个build-info.xml文件,包括那些未生成的文件。也不好。

我想知道的是SCons如何确定应该清理哪些文件以及哪些文件不应该清除。关于我使用生成器函数阻止SCons将此目标记录为Clean候选者的方式,有什么有趣的吗?

1 个答案:

答案 0 :(得分:7)

好吧,我想我已经知道发生了什么 - 我做了一个错误的假设,即SCons记录它创建的那些文件(作为目标),然后在随后的“干净”中使用这个记录的列表。这当然没有意义。

SCons实际做的是重新运行所有依赖关系规则并创建一个新的依赖关系树。它使用它来确定要清理的文件。因为我有os.path.exists()条件,这意味着build-info.xml从未添加到Clean列表中,因为它始终存在 - clean运行。

事实证明env.Clean() 正常工作,因为它会删除所有这些文件,因为第二次运行时没有办法让SCons(使用 - clean)知道生成了一个特定的build-info.xml文件,而不是已经存在。

解决此问题的方法是在生成的文件旁边创建一个sentinel文件。但就目前而言,我对SCons的清洁行为的新理解就足够了。