2

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

  • 大模块包
    • 子模块包 A
      • 模块 A1
      • 模块 A2
    • 子模块包 B
      • 模块 B1
  • 小模块封装
    • 模块 C1
    • 模块 C2

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

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

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

理想情况下,我想确保可以以类似于以下方式构建这些目标:

scons ModuleA1_UnitTest

我怎样才能设置 scons 来为我做这件事,尤其是以一种对添加新模块友好的方式?

4

1 回答 1

2

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

Alias() 函数的好处(SCons 手册页中有更好的描述)是您可以将多个目标分配给同一个别名,如下所示:

模块 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 应该在内部管理它。

于 2013-09-09T14:26:50.697 回答