Как мне установить систему scons, включающую путь

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

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

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

-Ifoo

в gcc

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

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

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

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

-isystem foo

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

4 ответа

Решение

Не существует встроенного способа передачи путей -isystem include в 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-7 раз. Сокращенное дерево зависимостей до того, как это изменение имело 4 миллиона включений от Boost. Это безумие.

Другие вопросы по тегам