我们有两个工具: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的生成器?
答案 0 :(得分:2)
Emitter实际上并不存在“构建”内容,例如示例中的文件TargetFile
。它只是返回在构建阶段“稍后”创建或更新的目标。 SCons将通过在内部数据结构中存储“虚拟”文件(可能尚未物理存在)来记录此信息。在实际构建期间解析依赖关系时,此树也将在以后使用。
请注意,“通过发射器更新目标和源列表”与“使用为当前构建器指定的单个操作构建目标”完全不同。关于生成文件的名称,它们甚至不必匹配!
Emitter在“解析阶段”运行,但构建器及其操作在“构建阶段”中执行(在所有SConstructs中读取之后)。
因此,如果您的Tool2_emitter
确实需要Tool1的目标来解析/猜测其创建的目标列表,那么您将非常困难,并且无法在一次运行中成功构建。
官方版本太多了。 ;)但您可以查看https://bitbucket.org/scons/scons/wiki/DynamicSourceGenerator,这可能有助于您克服上述限制。