【发布时间】:2016-02-24 22:02:39
【问题描述】:
我们在非标准位置安装各种增强版本。
然后我们修改CPPPATH 和LIBPATH 以反映所选的增强版本。但是,一些 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 ),它们不会被复制过来,所以我们只得到我们需要的头文件集的部分副本。