22

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

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

这通过了标志

-Ifoo

到 gcc

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

env.Append( CPPFLAGS=['-Werror', '-Wall', '-Wextra'] )

在某些提升包含中可怕地死去......我可以通过将提升包含添加到系统包含路径而不是包含路径来解决这个问题,因为 gcc 对待系统包含的方式不同。

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

-isystem foo

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

4

4 回答 4

12

在 SCons 中没有内置的方法来传递 -isystem 包含路径,主要是因为它非常特定于编译器/平台。

将它放在 CXXFLAGS 中会起作用,但请注意,这将隐藏 SCons 的依赖扫描器的标题,它只查看 CPPPATH。

如果您不希望这些标头永远更改,这可能没问题,但如果您使用构建结果缓存和/或隐式依赖项缓存,可能会导致奇怪的问题。

于 2010-03-14T04:50:52.480 回答
6

如果你这样做

  print env.Dump()

您会看到_CPPINCFLAGS,并且您会看到 CCCOM(或 _CCCOMCOM)中使用的变量。_CPPINCFLAGS 通常如下所示:

  '$( ${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)'

从这里您可能会看到如何添加“isystem”集,例如 _CPPSYSTEMINCFLAGS 或类似的。只需定义您自己的前缀、路径变量名称(例如 CPPSYSTEMPATH)和后缀,并使用上述习惯用法连接前缀。然后只需将您的 _CPPSYSTEMINCFLAGS 附加到 CCCOM 或 _CCCOMCOM 即可。

当然,这是特定于系统的,但您可以在需要时有条件地将新变量包含在编译器命令行中。

于 2010-03-30T17:33:45.000 回答
4

根据SCons 发行说明,从 2.3.4 版开始,环境的 CCFLAGS 支持“-isystem”。

因此,例如,您可以执行以下操作:

env.AppendUnique(CCFLAGS=('-isystem', '/your/path/to/boost'))

不过,您需要确保您的编译器支持该选项。

于 2017-03-22T14:49:14.017 回答
0

扩展@LangerJan 和@BenG 提出的想法......这是一个完整的跨平台示例(替换env['IS_WINDOWS']为您的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 的包含。这太疯狂了。

于 2017-03-29T19:08:26.567 回答