代码之家  ›  专栏  ›  技术社区  ›  davidA

SCons不会清除所有文件

  •  3
  • davidA  · 技术社区  · 16 年前

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

    即:对于每个目录:

    • 如果build-info.xml已经存在,则不执行任何操作。更重要的是,不要把它放在“烤饼——干净”上。
    • 如果build-info.xml不存在, 生成
    • 在--clean期间,删除build-info.xml(如果是) 生成

    我的结构如下所示:

    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\u info\u xml),但我无法实现这一点-主要是因为我无法确定要分配给“t”的内容-我希望生成的build-info.xml无条件地被清除,而不是基于对另一个目标的清除,我无法实现这一点。

    我想知道的是SCons是如何决定哪些文件应该清理哪些文件不应该清理的。我使用生成器函数阻止SCons将这个目标记录为一个干净的候选对象的方式有什么可笑的地方吗?

    1 回复  |  直到 12 年前
        1
  •  8
  •   davidA    16 年前

    好的,我想我已经搞清楚了发生了什么-我错误地假设SCons记录它创建的那些文件(作为目标),然后在随后的“清理”过程中使用这个记录的列表。这当然没有道理。

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

    原来env.Clean() 正常工作,因为它将删除所有这样的文件,这仅仅是因为SCons在第二次运行(使用--clean)时无法知道特定的build-info.xml文件已经生成而不是已经存在。

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