Выбор компилятора и настройка сборки#
Выбор конкретного компилятора#
Meson поддерживает стандартные переменные окружения CC, CXX и FC для выбора конкретных компиляторов C, C++ и/или Fortran. Эти переменные окружения документированы в справочные таблицы в документации Meson.
Обратите внимание, что переменные окружения применяются только при чистой сборке, потому что они влияют на этап конфигурации (т.е., meson setup). Инкрементная пересборка
не реагирует на изменения в переменных окружения - необходимо запустить git
clean -xdf и выполнить полную пересборку, или запустить meson setup --reconfigure.
Добавление пользовательского флага компилятора или компоновщика#
Meson по дизайну предпочитает настройку сборок через параметры командной строки,
передаваемые в meson setup. Он предоставляет множество встроенных опций:
Для включения отладочной сборки и уровня оптимизации см. следующий раздел о "типах сборки".
Включение
-Werrorв переносимом виде осуществляется через-Dwerror=true,Включение уровней предупреждений осуществляется через
-Dwarning_level=, содин из{0, 1, 2, 3, everything},Существует множество других встроенных опций, от активации Visual Studio (
-Dvsenv=true) и сборка с оптимизацией времени линковки (-Db_lto) для изменения уровня языка C++ по умолчанию (-Dcpp_std='c++17') или флаги компоновщика (-Dcpp_link_args='-Wl,-z,defs').
Для полного обзора опций см. Страница документации встроенных опций Meson.
Meson также поддерживает стандартные переменные окружения CFLAGS,
CXXFLAGS, FFLAGS и LDFLAGS для добавления дополнительных флагов - с той же оговоркой, что и в предыдущем разделе, о том, что эти переменные окружения учитываются только при чистой сборке, а не при инкрементной.
Использование различных типов сборки с Meson#
Meson предоставляет различные типы сборки при настройке проекта. Вы можете увидеть доступные опции для типов сборки в раздел "основные опции" документации Meson.
Предполагая, что вы начинаете с нуля (не git clean -xdf если необходимо),
вы можете настроить сборку следующим образом, чтобы использовать debug тип сборки:
meson setup build --buildtype debug --prefix=$PWD/build-install
Теперь вы можете использовать dev.py интерфейс для дальнейшей сборки, установки и тестирования SciPy:
python dev.py -s linalg
Это будет работать, потому что после начальной конфигурации Meson запомнит параметры конфигурации.
Управление параллелизмом сборки#
По умолчанию, ninja запустит 2*n_cpu + 2, с n_cpu количеством
физических ядер CPU, параллельных заданий сборки. Это подходит в подавляющем большинстве
случаев и обеспечивает близкое к оптимальному время сборки. В некоторых случаях, на машинах
с небольшим объемом ОЗУ относительно количества ядер CPU, это может привести к
исчерпанию памяти заданием. Если это происходит, уменьшите количество заданий N
таким образом, чтобы у вас было не менее 2 ГБ ОЗУ на задачу. Например, для запуска 6 задач:
python -m pip install . -Ccompile-args="-j6"
или:
python dev.py build -j6
Использовать сборки GCC и Clang параллельно#
Может быть полезно иметь несколько сборок SciPy в одном репозитории, например, чтобы сравнить различия между двумя компиляторами для диагностики проблемы. Как обсуждалось, Meson полностью поддерживает раздельные сборки, поэтому разные сборки не будут мешать друг другу. В оставшейся части этого раздела мы предполагаем, что GCC используется по умолчанию. Например, давайте соберём с использованием GCC и Clang.
Сборка с GCC:
python dev.py build
Используя приведённую выше команду, meson будет собирать с (стандартными) компиляторами GCC в build директорию и установить в build-install каталог.
Сборка с Clang:
CC=clang CXX=clang++ FC=gfortran python dev.py --build-dir=build-clang build
Используя указанные команды, Meson будет собирать с компиляторами Clang, Clang++ и Gfortran в build-clang каталога, а затем установить SciPy в
build-clang-install.
Meson запомнит выбор компилятора для build-clang каталог и его нельзя изменить, поэтому каждый последующий вызов
python dev.py --build-dir=build-clang он автоматически будет использовать Clang.
Совет: используйте псевдоним для упрощения использования, например,
alias dev-clang="python dev.py --build-dir=build-clang" и затем
dev-clang build.
Распространенная причина иметь две сборки — сравнение между ними. Например,
чтобы запустить scipy.linalg тесты для сборок с обоими компиляторами, выполните:
python dev.py -s linalg # run tests for the GCC build
python dev.py --build-dir build-clang -s linalg # run tests for the Clang build