我们在Mac,Linux和Windows上使用SCons + swtoolkit构建系统。我们有一个svn存储库,它包含我们所有的外部库依赖项,其路径位于环境变量EXTERNAL_SDKS中。
在我们的每个目标SConscripts中,我想找到一个方法,该方法将查找目标链接到的EXTERNAL_SDKS路径下的库,并在构建和放置目标时将其复制到构建输出文件夹中那里。
我已经找到了一种方法,使用swtoolkit中的一些组件添加,但它减慢了stscripts的解析速度(mac上15秒,Windows上1分钟+)。
有没有人知道这样做的有效方法?
答案 0 :(得分:2)
我通过创建swtoolkit的Google开发人员Randall Spangler找到了答案。因此,这个答案特定于将swtoolkit与SCons一起使用。
之前我们正在扫描目标依赖项,然后确定要从该依赖项扫描中复制哪些外部库。这就是导致严重放缓的原因。
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库。如果目标需要其中一个,它将自动复制到构建输出文件夹中。