使用scons我可以轻松设置包含路径:
env.Append( CPPPATH=['foo'] )
这会传递标志
-Ifoo
到gcc
但是我正在尝试编译并启用了很多警告。
特别是env.Append( CPPFLAGS=['-Werror', '-Wall', '-Wextra'] )
在某些提升中可怕的死亡包括......我可以通过添加boost包含到系统包含路径而不是包含路径来解决这个问题,因为gcc对待系统包含的方式不同。
所以我需要传递给gcc而不是-Ifoo是
-isystem foo
我想我可以用CPPFLAGS变量做到这一点,但想知道scons中是否有更好的解决方案。
答案 0 :(得分:12)
没有内置的方法可以在SCons中传递-isystem include路径,主要是因为它非常符合编译器/平台。
将它放在CXXFLAGS中会起作用,但请注意,这将隐藏SCons的依赖扫描程序中的标题,该扫描程序仅查看CPPPATH。
如果您不希望这些标头发生变化,这可能就行了,但如果您使用构建结果缓存和/或隐式依赖缓存,则可能会导致奇怪的问题。
答案 1 :(得分:6)
如果你这样做
print env.Dump()
你会看到_CPPINCFLAGS
,你会看到CCCOM(或_CCCOMCOM)中使用的变量。 _CPPINCFLAGS通常如下所示:
'$( ${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)'
从这里你可以看到如何添加一个“isystem”包含,如_CPPSYSTEMINCFLAGS或其他一些。只需定义自己的前缀,路径var名称(例如CPPSYSTEMPATH)和后缀,并使用上面的习惯用法来连接前缀。然后将你的_CPPSYSTEMINCFLAGS附加到CCCOM或_CCCOMCOM,然后离开。
当然这是系统特定的,但您可以根据需要在编译器命令行中有条件地包含新变量。
答案 2 :(得分:3)
根据the SCons release notes," -isystem"从版本2.3.4开始支持环境的CCFLAGS。
因此,您可以执行以下操作:
env.AppendUnique(CCFLAGS=('-isystem', '/your/path/to/boost'))
但是,您需要确保您的编译器支持该选项。
答案 3 :(得分:0)
扩展@LangerJan和@BenG提出的想法......这里是一个完整的跨平台示例(用您的Windows平台检查替换env['IS_WINDOWS']
)
from SCons.Util import is_List
def enable_extlib_headers(env, include_paths):
"""Enables C++ builders with current 'env' to include external headers
specified in the include_paths (list or string value).
Special treatment to avoid scanning these for changes and/or warnings.
This speeds up the C++-related build configuration.
"""
if not is_List(include_paths):
include_paths = [include_paths]
include_options = []
if env['IS_WINDOWS']:
# Simply go around SCons scanners and add compiler options directly
include_options = ['-I' + p for p in include_paths]
else:
# Tag these includes as system, to avoid scanning them for dependencies,
# and make compiler ignore any warnings
for p in include_paths:
include_options.append('-isystem')
include_options.append(p)
env.Append(CXXFLAGS = include_options)
现在,在配置外部库的使用时,而不是
env.AppendUnique(CPPPATH=include_paths)
呼叫
enable_extlib_headers(env, include_paths)
在我的情况下,这在Linux上将已修剪的依赖树(由--tree=prune
生成)减少了1000倍,在Windows上减少了3000倍!它将无动作构建时间(即所有目标最新)加速5-7倍
在此更改之前,已修剪的依赖关系树有400万来自Boost。那太疯狂了。