使用SCONS建立多个目标

时间:2018-10-16 08:47:50

标签: scons

我正在用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处理这种体系结构?

1 个答案:

答案 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中,您还可以找到更多示例和设置,以使您对其他人如何设置他们的项目有印象。