gpt4 book ai didi

generator - SCons 不会清除所有文件

转载 作者:行者123 更新时间:2023-12-02 22:18:18 26 4
gpt4 key购买 nike

我有一个包含“builds”目录的文件系统,每个目录都包含一个名为“build-info.xml”的文件。然而,一些构建发生在构建脚本生成“build-info.xml”之前,因此在这种情况下,我有一个有点不平凡的 SCons SConstruct,用于生成骨架 build-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)

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

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

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

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

最佳答案

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

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

事实证明 env.Clean() 工作正常,因为它会删除所有此类文件,仅仅是因为第二次运行时 SCons 无法使用(使用 -- clean)以了解特定的 build-info.xml 文件已生成而不是已经存在。

解决这个问题的方法是在这些生成的文件旁边创建一个哨兵文件。但现在,我对 SCons 的 Clean 行为的新理解就足够了。

关于generator - SCons 不会清除所有文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2473808/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com