【问题标题】:SCons: expanding library dependencies recursivelySCons:递归扩展库依赖项
【发布时间】:2010-09-14 10:27:35
【问题描述】:

我目前正在使用基于 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 不同,在 Windows 中,DLL 链接模型意味着已经考虑了间接依赖关系。

我们不希望必须明确指定完全扩展的依赖项列表,因为这过于冗长并且存在维护问题。

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

【问题讨论】:

  • 你检查过例如的输出吗? scons --tree=derived?
  • 如果我理解正确的话,那是 scons 的调试工具。我不确定它将如何帮助解决这个问题。如果我遗漏了什么,请告诉我。

标签: c++ c scons


【解决方案1】:

这是一个 hack,但我只是在我的顶级环境中保留了一个变量,该变量被导出到我的所有 SConscripts 中,每次其中一个 SConscripts 需要一个新库时,我都会这样做:

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

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

【讨论】:

    猜你喜欢
    • 2011-06-20
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 2018-02-22
    • 2012-09-22
    • 2017-01-31
    相关资源
    最近更新 更多