我们有两个工具: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 的生成器?
最佳答案
发射器实际上并不是用来“构建”东西的,例如示例中的文件 TargetFile
。它只是返回在构建阶段“稍后”将创建或更新的目标。 SCons 将通过将“虚拟”文件(可能尚未物理存在)存储在内部数据结构中来记录此信息。稍后在实际构建期间解决依赖关系时也会使用该树。
请注意,“通过发射器更新目标和源列表”与“使用为当前构建器指定的单个操作构建目标”是完全不同的任务。关于生成的文件的名称,它们甚至不必匹配!
发射器在“解析阶段”运行,但构建器及其操作在“构建阶段”执行(读入所有 SConstructs 后)。
因此,如果您的 Tool2_emitter
确实需要 Tool1 的目标来解析/猜测其创建的目标列表,那么您就会陷入困境,并且无法在一次运行中成功构建。
正式版就这么多了。 ;)但是你可以看看https://bitbucket.org/scons/scons/wiki/DynamicSourceGenerator这可能会帮助您克服上述情况中的限制。
关于python - Scons:创建迟到的目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35056538/