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