使用scons的可选目标的分层模块

时间:2013-09-09 13:48:50

标签: scons

我希望能够根据顶层定义的常见构建模式有选择地构建分层源代码树。源树由许多不同的模块组成,有时在层次结构中的不同级别,如下所示:

  • 大型模块包
    • 子模块包A.
      • 模块A1
      • 模块A2
    • 子模块包B.
      • 模块B1
  • 小模块包
    • 模块C1
    • 模块C2

每个模块可能依赖于任意数量的其他模块(当然,没有周期)。

每个模块都需要能够激活在顶层定义的一组模板目标的选择,这些目标将查找某些源文件并构建某些输出。例如,Library模板目标将只构建当前模块的共享库。 UnitTest目标将确保所有上游依赖项都构建了它们的库,查找单元测试源,构建然后运行单元测试可执行文件。

目标是让每个模块都有自己的封装SConscript文件,列出a)它的依赖关系,b)应该为它启用的顶级目标的名称。

理想情况下,我想确保这些目标的构建方式与此类似:

scons ModuleA1_UnitTest

我如何设置scons为我做这件事,特别是以一种友好的方式添加新模块?

1 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题,您可以使用SCons Alias()功能执行此操作。

关于Alias()函数的好处(SCons man pages中的更好描述)是你可以为同一个别名分配几个目标,如下所示:

模块A SConscript:

libAtarget = env.Library(target='a', src=libASrcFiles)
env.Alias('libraries', libAtarget)

模块B SConscript:

libBtarget = env.Library(target='b', src=libBSrcFiles)
env.Alias('libraries', libBtarget)

别名的范围是项目范围的,这意味着它可以添加到不同的SConscript脚本中。我不确定您是否能够在根SConstruct中定义别名(用于创建模板目标),而无需指定目标。

假设您正确列出了二进制文件所需的库等,您不应该对其他模块的依赖关系做任何特别的事情,因为SCons应该在内部进行管理。