如何设置scons系统包含路径

时间:2010-03-14 03:05:53

标签: c++ scons

使用scons我可以轻松设置包含路径:

env.Append( CPPPATH=['foo'] )

这会传递标志

-Ifoo

到gcc

但是我正在尝试编译并启用了很多警告。

特别是
env.Append( CPPFLAGS=['-Werror', '-Wall', '-Wextra'] )
在某些提升中可怕的死亡包括......我可以通过添加boost包含到系统包含路径而不是包含路径来解决这个问题,因为gcc对待系统包含的方式不同。

所以我需要传递给gcc而不是-Ifoo是

-isystem foo

我想我可以用CPPFLAGS变量做到这一点,但想知道scons中是否有更好的解决方案。

4 个答案:

答案 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。那太疯狂了。