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