2010-03-11 61 views
3

我们在Mac,Linux和Windows上使用SCons + swtoolkit构建系统。我们有一个svn存储库,其中包含我们所有的外部库依赖项,其路径位于环境变量EXTERNAL_SDKS中。SCons:复制外部库以构建输出目录

在我们的每个目标SConscript中,我想找到一种方法,它将查找目标链接到的EXTERNAL_SDKS路径下的库,并在构建目标本身时将其复制到构建输出文件夹中,以及放在那里。

我发现了一种使用swtoolkit中的某些组件添加的方法,但它会减慢sconscripts的解析速度(Mac上为15+秒,在windows上为1分钟+)。

有没有人知道这样做的有效方法?

回答

2

我通过创建swtoolkit的Google开发者Randall Spangler找到了答案。因此,这个答案是专门为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库。如果其中一个目标需要,它会自动复制到构建输出文件夹中。

相关问题