SCons:递归扩展库依赖项

时间:2010-09-14 10:27:36

标签: c++ c scons

我目前正在使用基于SCons的构建系统,我不能维护它,但可以为维护者提供输入。

它遇到的一个问题是处理C ++源包之间的依赖关系。在系统中,每个源包都是基于Windows上的DLL或Linux上的共享库构建的。

假设包A包含对包B和C的依赖性.B和C在包A的SConscript中指定。这可以。包A的DLL也将链接到B和C的DLL。这也很好,因为在构建这些DLL时,已经解决了B和C所具有的任何链接依赖性。

复杂性带有与它们相关联的单元测试的包。在这里,我们需要知道完整的,递归扩展的库依赖项列表,主要有两个原因:

  1. 构建单元测试涉及创建一个设置PATH并调用可执行文件的脚本。需要为每个运行时依赖项添加一个条目到PATH。
  2. 在Linux上链接单元测试可执行文件需要完整的,扩展的库依赖项列表。这与Windows不同,其中DLL链接模型意味着已经考虑了间接依赖性。
  3. 我们不希望必须明确指定完全展开的依赖项列表,因为它过于冗长且存在维护问题。

    当前系统仍然有问题,它确实要求我们只需要在SConscripts包中指定直接依赖关系,但是通过SConstruct中的Python代码解析间接依赖关系。此代码打开并解析SConscript文件,并根据这样提取的信息构建依赖关系的映射。这种方法感觉不对。直觉上,我觉得应该有一种方法可以更自然地使用原生的SCons设施,但我不熟悉SCons能够提出更好的方法。有没有更好的方式,它是什么?

1 个答案:

答案 0 :(得分:1)

这是一个黑客,但我只是在我的顶层环境中保存一个变量,导出到我的所有SConscripts,每次一个SConscripts需要一个新的库时,我就这样做:

env.Append(TOPLEVEL_LIBS = ['somelib'])

这样,env ['TOPLEVEL_LIBS']包含了所有必需的库,并且可以从任何SConscript访问它。