代码之家  ›  专栏  ›  技术社区  ›  Grant Limberg

SCons:复制外部库以生成输出目录

  •  3
  • Grant Limberg  · 技术社区  · 15 年前

    我们在Mac、Linux和Windows上使用SCons+swtoolkit构建系统。我们有一个包含所有外部库依赖项的svn存储库,其路径位于环境变量external\u SDKS中。

    在我们的每个目标SConscripts中,我想找到一个方法,该方法将查找目标链接到的外部SDK路径下的库,并在生成并放置目标时将其复制到build output文件夹中。

    我在swtoolkit中找到了一种使用一些附加组件的方法,但是它会减慢sconscripts的解析速度(在mac上15秒以上,在windows上1分钟以上!!)。

    有人知道一种有效的方法吗?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Grant Limberg    15 年前

    我通过创建swtoolkit的Google开发人员randallspangler找到了答案。因此,这个答案特定于与scon一起使用swtoolkit。

    之前,我们正在扫描目标的依赖关系,然后确定要从该依赖关系扫描中复制哪些外部库。这就是导致经济严重放缓的原因。

    swtoolkit有一个env.Publish()方法,用于注册目标,以便将它们用作其他目标的依赖项。一旦发布了外部库,它们将通过在生成目标时swtoolkit中使用的ReplicatePublished()调用自动复制到生成输出文件夹中。

    他给出了以下示例代码:

    thirdparty_libs = []
    for dir in env.SubstList2('$THIRDPARTY_LIB_DIRS'):
      thirdparty_libs += env.Glob(dir + '/lib*.dylib')
      thirdparty_libs += env.Glob(dir + '/lib*.a')
    
    import os
    for lib in thirdparty_libs:
      name_parts = os.path.splitext(lib.name)
      if name_parts[1] == '.dylib':
        # TODO: Need to publish 'libfoo.dylib' or 'libfoo.a' as both
        # 'libfoo' and 'foo'.  Need to clean up sconscripts to remove 'lib' prefix
        # from all libs for mac, linux.
        lib_basename = name_parts[0]
        env.Publish(lib_basename, 'run', lib)
        env.Publish(lib_basename[3:], 'run', lib)
    

    我们修改了它以满足我们的需要,并将它放在配置外部库使用的脚本中。例如,在我们的BoostSettings模块中,它查找并发布所有boost库。如果目标需要其中一个,则会自动将其复制到生成输出文件夹中。