Scons:创建迟到的目标

Scons: create late targets

我们有两个工具: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 的生成器?

发射器实际上并不存在 "build" 东西,例如您示例中的文件 TargetFile。它只是 returns 将在构建阶段创建或更新哪些目标,"later on"。 SCons 将通过在内部数据结构中存储 "virtual" 文件(物理上可能还不存在)来记录此信息。稍后在实际构建期间解析依赖项时也会使用此树。 请注意,"updating the list of targets and sources via an Emitter" 与 "building the targets with the single Actions as specified for the current Builder" 是完全不同的任务。关于生成文件的名称,它们甚至不必匹配!

Emitter 运行在"Parsing phase"中,但是Builder和它的Actions在"Build phase"中执行(在读入所有SConstructs之后)。 所以,如果你的 Tool2_emitter 真的需要 Tool1 的目标到 parse/guess 它的已创建目标列表,你就会陷入困境,无法成功构建一个 运行 .

正式版就这么多了。 ;) 但是你可以看看 https://bitbucket.org/scons/scons/wiki/DynamicSourceGenerator 这可能会帮助你克服上面的限制。