Как установить scons system include path

используя scons, я могу легко установить мои пути включения:

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

это проходит флаг

-Ifoo

в gcc

однако я пытаюсь скомпилировать с большим количеством предупреждений. В частности с

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

который умирает ужасно на определенном boost включает в себя ... Я могу исправить это, добавив boost includes в system include path, а не include path, поскольку gcc обрабатывает system includes по-разному.

так что мне нужно получить передан в gcc вместо-Ifoo is

-isystem foo

Я думаю, что мог бы сделать это с переменной CPPFLAGS, но задавался вопросом, есть ли лучшее решение, встроенное в scons.

4 ответов


нет встроенного способа передачи-isystem включает пути в SCons, главным образом потому, что он очень специфичен для компилятора/платформы.

положить его в CXXFLAGS будет работать, но обратите внимание, что это скроет заголовки из сканера зависимостей SCons, который смотрит только на CPPPATH.

Это, вероятно, нормально, если вы не ожидаете, что эти заголовки когда-либо изменятся, но может вызвать странные проблемы, если вы используете кэш результатов сборки и/или неявный кэш зависимостей.


Если у вас

  print env.Dump()

вы увидите _CPPINCFLAGS, и вы увидите, что переменная используется в CCCOM (или _CCCOMCOM). _CPPINCFLAGS обычно выглядит так:

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

из этого вы, вероятно, можете увидеть, как вы могли бы добавить набор "isystem" включает в себя, как _CPPSYSTEMINCFLAGS или некоторые такие. Просто определите свой собственный префикс, имя пути var (например, CPPSYSTEMPATH) и суффикс и используйте вышеуказанную идиому для объединения префикса. Затем просто добавьте _CPPSYSTEMINCFLAGS в CCCOM или _CCCOMCOM и вперед.

конечно, это специфично для системы, но вы можете условно включить новую переменную в командную строку компилятора, как и когда захотите.


по данным примечания к выпуску SCons, "-isystem" поддерживается, начиная с версии 2.3.4 для CCFLAGS среды.

таким образом, вы можете, например, сделать следующее:

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

тем не менее, вы должны быть уверены, что ваш компилятор поддерживает эту опцию.


расширение идеи, предложенной @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)

в моем случае это уменьшило обрезанное дерево зависимостей (как произведено с --tree=prune) 1000x на Linux и 3000x на Windows! Это ускорило время сборки без действий (т. е. все цели до настоящего времени) 5-7x Обрезанное дерево зависимостей до этого изменения имело 4 миллиона включений от Boost. Это безумие.