2010-03-18 72 views
3

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

即:每个目录:

  • 如果Build-info.xml已经存在,什么也不做。更重要的是,不要在'scons --clean'上删除它。
  • 如果build-info.xml不存在,生成一个框架 - build-info.xml对任何其他文件没有依赖关系 - 框架基本上是最小的默认值。
  • 期间--clean
  • ,清理积聚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' 不会删除生成的构建-info.xml文件。

我在'if'中玩过env.Clean(t,build_info_xml),但是我无法让它工作 - 主要是因为我无法确定分配给't'的东西 - 我想要一个生成的build-info.xml无条件地进行清理,而不是基于另一个目标的清理,而且我无法使其工作。

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

我想知道什么是SCons的如何去有关确定哪些文件应该被清理,那些不应该。有没有什么有趣的方式,我使用了一个发电机功能,防止SCons将这个目标记录为Clean候选人?

+0

进一步就此 - 与上面的规则,scons的--tree =状态不显示“显式生成器”的集结info.xml。它显示E(存在)和C(当前),但不显示B(显式构建器)。这是没有B的唯一文件,所以也许这就是SCons不清除它的原因。那么为什么env.BuildInfoXML没有资格作为“显式构建器”呢? – meowsqueak 2010-03-18 22:56:07

+0

实际上,如果我手动清理整个环境并运行'scons --tree = status path/to/something/that/depends/on/build-info.xml',我会为build-info.xml获得'B' ,并且SCons根据上述规则构建它。但我认为这个规则具有“无”作为依赖的事实意味着它不会被添加到清单列表中...... – meowsqueak 2010-03-18 23:13:08

回答

7

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

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

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

来解决,这将是创建一个文件定点沿着那些生成文件的方式。但是现在,我对SCons的清洁行为的新理解就足够了。

+0

这是对行为的很好的描述。谢谢! – 2010-03-19 17:57:36