Scons:创造迟到的目标

时间:2016-01-28 08:40:34

标签: python scons

我们有两个工具:Tool1和Tool2。 Tool1基于SourceFile创建一些TargetFile。 Tool2使用Tool1(TargetFile)的输出作为源。结构类似于:

   env.Tool1(TargetFile, SourceFile)
   env.Tool2(NewTargetFile, TargetFile)

问题是Tool2的发射器使用TargetFile来创建新目标:

   def Tool2_emitter(target, source, env):
       target.append( CreateNewTargetFunc(source) )
       return target, source

但是当Scons创建一个依赖项时,他就找不到TargetFile,因为它尚未创建。

是否可以在创建依赖项的情况下运行Tool1的生成器?

1 个答案:

答案 0 :(得分:2)

Emitter实际上并不存在“构建”内容,例如示例中的文件TargetFile。它只是返回在构建阶段“稍后”创建或更新的目标。 SCons将通过在内部数据结构中存储“虚拟”文件(可能尚未物理存在)来记录此信息。在实际构建期间解析依赖关系时,此树也将在以后使用。 请注意,“通过发射器更新目标和源列表”与“使用为当前构建器指定的单个操作构建目标”完全不同。关于生成文件的名称,它们甚至不必匹配!

Emitter在“解析阶段”运行,但构建器及其操作在“构建阶段”中执行(在所有SConstructs中读取之后)。 因此,如果您的Tool2_emitter确实需要Tool1的目标来解析/猜测其创建的目标列表,那么您将非常困难,并且无法在一次运行中成功构建。

官方版本太多了。 ;)但您可以查看https://bitbucket.org/scons/scons/wiki/DynamicSourceGenerator,这可能有助于您克服上述限制。