Scons:如何为 3rd 方编译结果指定文件依赖项?
Scons: how to specify file dependency for 3rd party compile result?
在我看来,scons 目标不是按声明顺序生成的。我的问题是,我需要先生成一些代码,我正在使用 protoc 将 my.proto 文件处理成 .h 和 .cc 文件,我需要一些这样的伪代码(工作代码应该是什么样的? )
import os
env=Environment(ENV=os.environ,LIBPATH='/usr/local/lib')
env.ShellExecute('protoc', '--outdir=. --out-lang=cpp', 'my.proto')//produces my.cc
myObj=Object('my.cc')//should wait until 'my.cc' is generated by protoc
Dependency(myObj, 'my.cc')
mainObj=Object('main.cpp')
我的问题是:
如何在SConstruct/SConscript中指定protoc的这个ShellExecution?
如何保证'main.cpp'的编译依赖'my.cc'的存在,换句话说就是等到'my.cc'生成后再执行?
您的观察和假设是正确的,SCons 不会按照您在 SConstruct 文件中列出的顺序执行单个构建命令。它将根据构建中目标和源文件的依赖关系 运行 它们,可以隐式定义(例如,header 包含在 C++ 中)或显式定义(通过 Depends()
方法) .
因此您必须正确定义和设置您的依赖项,以便 SCons 提供您想要的输出。对于示例中的特殊 protoc
情况,存在一个特殊的 Builder 可以帮助您获得正确的依赖关系图。它在我们的 ToolsIndex 中可用,其中还可以找到对各种其他语言和方言的支持。
这些特殊的构建器将发出正确的目标节点,例如当给定一个 *.proto
输入文件时,SCons 能够自动检测 protoc 输入文件和你的 main
程序,如果你说这样的话:
env=Environment(tools=['default','protoc'])
env.Protoc([], "test.proto")
env.Program('main', ['main.cpp'] + Glob('*.cc'))
Glob('*.cc')
将检测来自 protoc 工具的 *.cc
文件,并将它们作为最终目标的依赖项包含在内 main
.
您始终可以在 SCons 中编写自己的构建器和发射器,这是使 tools/toolchains 为 SCons[= 所知的规范方式37=]依赖分析。在 UserGuide, sect. "18 Writing Your Own Builders", and especially our ToolsForFools Guide 你可以找到更多关于这个的信息。
在我看来,scons 目标不是按声明顺序生成的。我的问题是,我需要先生成一些代码,我正在使用 protoc 将 my.proto 文件处理成 .h 和 .cc 文件,我需要一些这样的伪代码(工作代码应该是什么样的? )
import os
env=Environment(ENV=os.environ,LIBPATH='/usr/local/lib')
env.ShellExecute('protoc', '--outdir=. --out-lang=cpp', 'my.proto')//produces my.cc
myObj=Object('my.cc')//should wait until 'my.cc' is generated by protoc
Dependency(myObj, 'my.cc')
mainObj=Object('main.cpp')
我的问题是:
如何在SConstruct/SConscript中指定protoc的这个ShellExecution?
如何保证'main.cpp'的编译依赖'my.cc'的存在,换句话说就是等到'my.cc'生成后再执行?
您的观察和假设是正确的,SCons 不会按照您在 SConstruct 文件中列出的顺序执行单个构建命令。它将根据构建中目标和源文件的依赖关系 运行 它们,可以隐式定义(例如,header 包含在 C++ 中)或显式定义(通过 Depends()
方法) .
因此您必须正确定义和设置您的依赖项,以便 SCons 提供您想要的输出。对于示例中的特殊 protoc
情况,存在一个特殊的 Builder 可以帮助您获得正确的依赖关系图。它在我们的 ToolsIndex 中可用,其中还可以找到对各种其他语言和方言的支持。
这些特殊的构建器将发出正确的目标节点,例如当给定一个 *.proto
输入文件时,SCons 能够自动检测 protoc 输入文件和你的 main
程序,如果你说这样的话:
env=Environment(tools=['default','protoc'])
env.Protoc([], "test.proto")
env.Program('main', ['main.cpp'] + Glob('*.cc'))
Glob('*.cc')
将检测来自 protoc 工具的 *.cc
文件,并将它们作为最终目标的依赖项包含在内 main
.
您始终可以在 SCons 中编写自己的构建器和发射器,这是使 tools/toolchains 为 SCons[= 所知的规范方式37=]依赖分析。在 UserGuide, sect. "18 Writing Your Own Builders", and especially our ToolsForFools Guide 你可以找到更多关于这个的信息。