Выбор компилятора и настройка сборки#

Выбор конкретного компилятора#

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.

  1. Сборка с GCC:

    python dev.py build
    

Используя приведённую выше команду, meson будет собирать с (стандартными) компиляторами GCC в build директорию и установить в build-install каталог.

  1. Сборка с 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