Как установить систему scons, включающую путь - PullRequest
19 голосов
/ 14 марта 2010

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

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

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

-Ifoo

ГКК

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

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

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

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

-isystem foo

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

Ответы [ 4 ]

12 голосов
/ 14 марта 2010

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

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

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

6 голосов
/ 30 марта 2010

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

  print env.Dump()

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

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

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

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

3 голосов
/ 22 марта 2017

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

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

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

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

0 голосов
/ 29 марта 2017

В продолжение идеи, предложенной @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) в 1000 раз в Linux и в 3000 раз в Windows! Это ускорило время создания бездействия (то есть все цели на данный момент) в 5-7 раз Сокращенное дерево зависимостей до этого изменения имело 4 миллиона включений от Boost. Это безумие.

...