我正在用SCONS构建一个模块化项目。 我想将多个SW产品编译为多个SW子组件的集合:
例如: *构造:
Sconscript("SW_PRODUCT_1.Sconscript")
Sconscript("SW_PRODUCT_2.Sconscript")
*带有SW_PRODUCT_1.Sconscript:
Sconscript("COMPONENT_A.Sconscript")
Sconscript("COMPONENT_B.Sconscript")
Sconscript("COMPONENT_C.Sconscript")
*并带有SW_PRODUCT_2.Sconscript:
Sconscript("COMPONENT_A.Sconscript")
Sconscript("COMPONENT_B.Sconscript")
ie,我希望Builder一次将每个组件作为库进行编译,然后每个SW_PRODUCT提取要构建可执行文件的组件列表。
但是我有下一个问题,SCONS工具会返回下一个错误:
“缺点:***为同一目标指定了两个具有不同操作的环境”
这是事实,因为根据脚本,使用相同的目标名称两次调用了组件A和B,但是我希望SCONS能够处理多个目标可以共享库的事实。我希望SCONS在对COMPONENTS_A和B的第二次调用中意识到目标是“最新的”,但那样行不通。
我已经为每个产品编译两个不同的库(名称不同)提供了一种解决方法,但这不是我想要的,因为库是完全相同的,并且我不想浪费编译时间来构建完全相同的N次。我只想建立相同的库池,然后根据需要对每种产品选择此类库。
有没有简单的方法可以用Scons处理这种体系结构?
答案 0 :(得分:1)
只需将所有(!)必需的库(=组件)和产品放入同一顶级SConstruct
文件中。您可以使用SConscript
调用来包含来自不同子文件夹的构建定义,但不要忽略其中的任何一个。
试想一下,您想一次构建一切。请勿尝试通过在构建文件中是否包含SConscript
来表示“组件”的方式来建立构建依赖关系(或构建顺序)。
这很重要,因为它确保 SCons 可以看到完整的源代码树,其中包含您可能需要的所有源代码,库和程序。然后,它可以自己找出所有的构建依赖项。
下一步,只需通过Alias
命令为您的产品定义组合目标,即:
env = Environment()
program_a = env.Program('maina', Glob('*.cpp'), LIBS=['compx','compy'])
env.Alias('producta', program_a)
(另请参见User Guide中的第25章“别名目标”)。现在您可以拨打电话了
scons producta
和 SCons 将为您找出哪些组件是最新的或需要重建。如果您随后指定多个目标
scons producta productb productk
所需的库仅会构建一次,并在产品之间自动共享。
在我们的SCons Wiki:Recipes中,您还可以找到更多示例和设置,以使您对其他人如何设置他们的项目有印象。