具有非标准位置的升压库的SCons建筑

SCons building with non-standard location of boost library

本文关键字:SCons 建筑 非标准 位置      更新时间:2023-10-16

我们在非标准位置安装了各种增强版本。

然后,我们修改CPPPATHLIBPATH以反映所选的加速版本。但是,某些提升标头不会被 scons 扫描程序拾取,因此它们不会被复制到变体输出位置。

scons 扫描程序未选取它们的原因是因为它们使用如下所示的宏:

#include BOOST_ATOMIC_DETAIL_HEADER(boost/atomic/detail/caps_)

这会导致编译期间出现"找不到文件"错误。

我们如何修改 scons 脚本,以便它们复制整个提升库?

我研究了 Depends() 例程,但这需要一个目标节点,在我们将 Boost 引入构建系统时,我们没有方便的节点。这是因为我们所有的第三方库都包装有库级 SConscript,它基本上确定了应该(CPPPATH,LIBPATH)使用哪个版本的第三方库。读取该库SConscript时,没有目标节点可供其使用,因为这是在SConstruct过程中很早就完成的。

关于如何解决这个问题的想法?

以下是我们对环境"declaring"提升SConscript

#!/usr/bin/env python
import os
Import('env')
PROJ         = 'boost'
TARGET       = PROJ
VERSION      = '1.57.0'
PATH_INCLUDE = 'cmn/thirdparty/boost/' + VERSION + '/include'
PATH_LIB     = 'cmn/thirdparty/boost/' + VERSION + '/lib'

## extend/modify the imported environment
if not PROJ in env['THIRDPARTY']:
  env['THIRDPARTY'][PROJ] = { 
    'TARGET'       : TARGET,
    'VERSION'      : VERSION,
    'PATH_INCLUDE' : PATH_INCLUDE,
    'PATH_LIB'     : PATH_LIB,
}
  ## because boost emits lots of warnings when compiled under c++11, we use the -isystem flag to disable the warnings
  env.Append(CCFLAGS = ['-isystem', os.path.join(env['BUILD_ROOT'], PATH_INCLUDE)])
  env.PrependUnique(CPPPATH = [ os.path.join(env['BUILD_ROOT'], PATH_INCLUDE)])
  env.PrependUnique(LIBPATH = [os.path.join(env['BUILD_ROOT'], PATH_LIB)]

解决方案:

为"SRC_ROOT"添加第二个附加到CCFLAGS

env.Append(CCFLAGS = ['-isystem', os.path.join(env['SRC_ROOT'], PATH_INCLUDE)])

我可以单独使用上面的单个追加(用于SRC_ROOT),但我仍然看到警告(并将 Boost 文件复制到变体目录中),所以我需要两个 -isystem 路径来避免大量警告输出。

SRC_ROOT是我们src树的根。BUILD_ROOT是变体目录的根。

注意:您可以删除 CPPPATH,因为当 -isystem 使用相同的路径时,gcc 会忽略它