Подтвердить что ты не робот

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

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

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

Это передает флаг

-Ifoo

в gcc

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

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

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

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

-isystem foo

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Если вы делаете

  print env.Dump()

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

Расширение идеи, предложенной @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. Это безумие.