Как установить 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. Это безумие.