使用 SCONS 构建多个目标

Build multiple targets with 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")

即我希望 Builder 将每个组件编译一次作为一个库,然后每个 SW_PRODUCT 获取它想要构建可执行文件的组件列表。

但是我有下一个问题,SCONS 工具 returns 下一个错误:

"scons: *** Two environments with different actions were specified for the same target"

这是事实,因为根据脚本,组件 A 和 B 用完全相同的目标名称调用了两次,但我希望 SCONS 能够处理多个目标可以共享库的事实。我希望 SCONS 在对 COMPONENTS_A 和 B 的第二次调用中意识到目标 "up to date" 但它不会那样工作。
我已经考虑过为每个产品编译两个不同的库(不同名称)的解决方法,但这不是我想要的,因为库完全相同,我不想浪费编译时间来构建完全相同的 N 次。我只想构建相同的库池,然后根据每种产品的需要选择此类库。 有什么简单的方法可以用 Scons 处理这种架构吗?

只需将所有 (!) 所需的库(=组件)和产品放入同一个顶级SConstruct 文件中。您可以使用 SConscript 调用来包含来自不同子文件夹的构建定义,但不要遗漏任何子文件夹。 试着想象您想要一次构建所有内容。不要尝试通过在构建文件中包含或不包含 "components" 的 SConscript 来设置构建依赖项(或构建顺序)。

这很重要,因为它确保 SCons 可以看到完整的源代码树,其中包含您可能需要的所有源代码、库和程序。然后它能够​​自己找出构建依赖项。

在下一步中,只需通过 Alias 命令为您的产品定义组合目标,即:

env = Environment()
program_a = env.Program('maina', Glob('*.cpp'), LIBS=['compx','compy'])
env.Alias('producta', program_a)

(另见 User Guide 中的第 25 章 "Alias Targets")。现在你可以打电话了

scons producta

SCons 会为您找出哪些组件是最新的或需要重建的。如果您随后指定多个目标

scons producta productb productk

所需的库只会构建一次并自动在产品之间共享。

在我们的 SCons Wiki:Recipes 中,您还可以找到更多示例和设置,让您了解其他人如何设置他们的项目。