使用 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 中,您还可以找到更多示例和设置,让您了解其他人如何设置他们的项目。
我正在使用 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 中,您还可以找到更多示例和设置,让您了解其他人如何设置他们的项目。