我有一个包含“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'的内容 - 我想要一个生成的构建信息。 xml 被无条件地清理,而不是基于另一个目标的清理,我无法让它工作。
如果我在“if”之后但在“if”之外尝试了一个简单的 env.Clean(None, "build_info_xml"),我发现 SCons 会清理每个 build-info.xml 文件,包括那些未生成的文件。也不好。
我想知道的是 SCons 如何确定哪些文件应该被清理,哪些文件不应该被清理。我使用生成器函数阻止 SCons 将此目标记录为 Clean 候选者的方式有什么有趣的地方吗?