Понимание Meson#

Сборка SciPy зависит от следующих инструментов, которые можно считать частью системы сборки:

  • meson: система сборки Meson, устанавливаемая как чистый Python пакет из PyPI или conda-forge

  • ninja: инструмент сборки, вызываемый Meson для фактической сборки (например, вызов компиляторов). Также устанавливается из PyPI (на всех распространённых платформах) или conda-forge.

  • pkg-config: инструмент, используемый для обнаружения зависимостей (в частности, BLAS/LAPACK). Доступен на conda-forge (а также Homebrew, Chocolatey и в менеджерах пакетов Linux), но не упакован на PyPI.

  • meson-python: бэкенд сборки Python (т.е., то, что вызывается через хук в pyproject.toml сборщиком, таким как pip или pypa/build). Это тонкий слой поверх Meson, с основными ролями (a) интерфейс с фронтендами сборки и (b) создание sdists и wheels с допустимыми именами файлов и метаданными.

Сборка с помощью Meson происходит поэтапно:

  • Этап конфигурации (meson setup) для обнаружения компиляторов, зависимостей и параметров сборки, и создания директории сборки и build.ninja файл,

  • Этап компиляции (meson compile или ninja), где расширяемые модули, являющиеся частью собранного пакета SciPy, компилируются,

  • Этап установки (meson install) для установки устанавливаемых файлов из исходного и сборного каталогов в целевой каталог установки,

Meson имеет хорошую систему отслеживания зависимостей сборки, поэтому повторный запуск сборки пересоберёт только те цели, для которых изменились исходные коды или зависимости.

Чтобы узнать больше о Meson#

Meson имеет очень хорошая документация; стоит прочитать его, и это часто лучший источник ответов на вопрос «как сделать X». Кроме того, обширную pdf-книгу о Meson можно получить бесплатно на https://nibblestew.blogspot.com/2021/12/this-year-receive-gift-of-free-meson.html

Чтобы узнать больше о принципах проектирования, используемых Meson, недавние выступления, ссылки на которые приведены в mesonbuild.com/Videos также являются хорошим ресурсом.

Объяснение этапов сборки#

Это только для учебных целей; не должно быть необходимости выполнять эти этапы отдельно. Скрипты dev.py в корне репозитория также содержат эти шаги и могут быть изучены для понимания.

Предположим, мы начинаем с чистого репозитория и полностью настроенного conda окружения:

git clone git@github.com:scipy/scipy.git
git submodule update --init
mamba env create -f environment.yml
mamba activate scipy-dev

Теперь для запуска этапа конфигурации сборки и указания Meson поместить артефакты сборки в build/ и локальная установка под build-install/ относительно корня репозитория, выполните:

meson setup build --prefix=$PWD/build-install

Чтобы затем запустить этап компиляции сборки, выполните:

ninja -C build

В приведённой выше команде -C следует за именем директории сборки. Вы можете иметь несколько директорий сборки одновременно. Meson полностью вне места, поэтому эти сборки не будут мешать друг другу. Вы можете, например, иметь сборку GCC, сборку Clang и отладочную сборку в разных директориях.

Чтобы затем установить SciPy в префикс (build-install/ здесь, но обратите внимание, что это просто произвольное имя, которое мы выбрали здесь):

meson install -C build

Затем он установится в build-install/lib/python3.11/site-packages/scipy, который не находится в пути Python, поэтому для добавления выполните (опять же, это для учебных целей, явное использование ``PYTHONPATH`` обычно не лучшая идея):

export PYTHONPATH=$PWD/build-install/lib/python3.11/site-packages/

Теперь мы должны иметь возможность импортировать scipy и запустить тесты. Помня, что нам нужно выйти из корня репозитория, чтобы гарантировать, что мы используем пакет, а не локальный scipy/ исходный каталог:

cd doc
python -c "from scipy import constants as s; s.test()"

Вышеприведенное запускает тесты для одного модуля, constants. Другие способы запуска тестов также должны работать, например:

pytest --pyargs scipy

Полный набор тестов должен проходить без предупреждений сборки на Linux (с версией GCC, для которой -Werror применяется в CI как минимум) и с не более чем умеренным количеством предупреждений на других платформах.