SCons不会清除所有文件

dav*_*idA 3 generator scons

我有一个包含"builds"目录的文件系统,每个目录都包含一个名为"build-info.xml"的文件.然而一些构建脚本生成的"集结info.xml"所以在这种情况下,我有一个有点不平凡SCons的SConstruct用来生成一个骨架集结info.xml,以便它可以被用作建立之前发生对进一步规则的依赖.

即:对于每个目录:

  • 如果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)
Run Code Online (Sandbox Code Playgroud)

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

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

如果我之后,但外尝试了简单的env.Clean(无,"build_info_xml")的"如果"我发现,使用SCons将清理每一个集结info.xml文件,包括那些未生成.也不好.

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

dav*_*idA 7

好吧,我想我已经制定了这是怎么回事 - 我做了SCons的记录它会创建这些文件(如目标),然后在随后的"干净"使用此记录列表中的不正确的假设.这当然没有意义.

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

事实证明,在env.Clean()正常的,因为它会删除所有此类文件,仅仅是因为没有办法运行,第二次(含--clean)SCons的时候就知道一个特定的构建,信息生成.xml文件而不是已存在.

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