【问题标题】:SCons building with non-standard location of boost librarySCons 使用非标准位置的 boost 库构建
【发布时间】:2016-02-24 22:02:39
【问题描述】:

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

然后我们修改CPPPATHLIBPATH 以反映所选的增强版本。但是,一些 boost headers 不会被 scons Scanner 拾取,因此它们不会被复制到变体输出位置。

scons 扫描器没有拾取它们的原因是它们使用如下宏:

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

这会导致编译过程中找不到文件错误。

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

我查看了 Depends() 例程,但这需要一个目标节点,在我们将 Boost 引入构建系统时,我们并没有方便的目标节点。 这是因为我们所有的 3rd 方库都用库级别的 SConscript 包装,它基本上确定了应该使用哪个版本的 3rd 方库(CPPPATH,LIBPATH)。当读取该库SConscript 时,它没有可用的目标节点,因为这是在SConstruct 进程的早期完成的。

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

这是我们的SConscript "declaring" 提升我们的环境:

#!/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)]

【问题讨论】:

  • 我没有观察到 scons 曾经复制通过 CPPPATH 找到的文件 - 尽管我们通常将它与 duplicate=False 一起使用
  • 另外,你们都手动将包含路径添加到 CCFLAGS 以消除警告,到 CPPPATH?您确定这按您的预期工作吗?
  • 为什么需要将整个 boost 复制到变体目录中?
  • @Melak 我们将 -isystem 的路径添加为 CCFLAGS。这会禁用警告。这对我们来说效果很好。
  • @bdbaddog 我们不需要需要将整个 Boost 库复制到变体目录,但是因为扫描程序没有检测到某些包含文件(因为使用了 MACRO ),它们不会被复制过来,所以我们只得到我们需要的头文件集的部分副本。

标签: c++ boost scons


【解决方案1】:

解决方案:

为“SRC_ROOT”添加第二个附加到 CCFLAGS

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 2012-11-19
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多