Понимание Meson#

Для сборки NumPy требуются следующие инструменты, которые можно считать частью системы сборки:

  • 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 с допустимыми именами файлов и метаданными.

Предупреждение

По состоянию на декабрь 2023, NumPy включает собственную версию Meson, которая необходима для функций SIMD и BLAS/LAPACK, ещё не доступных в основной версии Meson. Следовательно, использование meson непосредственный запуск исполняемого файла невозможен. Вместо этого, где бы инструкции ни говорили meson xxx, используйте python vendored-meson/meson/meson.py xxx вместо этого.

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

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

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

  • Этап установки (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 также являются хорошим ресурсом.

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

Это только для учебных целей; не должно быть необходимости выполнять эти этапы отдельно!

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

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

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

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

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

ninja -C build

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

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

meson install -C build

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

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

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

cd doc
python -c "import numpy as np; np.test()"

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

pytest --pyargs numpy

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