1 Переход на meson#

В соответствии с графиком, изложенным в Статус numpy.distutils и рекомендации по миграции, distutils перестал быть сборщиком по умолчанию для f2py. Эта страница собирает общие рабочие процессы в обоих форматах.

Примечание

Это живой документ, запросы на включение изменений очень приветствуются!

1.1 Базовый уровень#

Мы начнём с немного современной вариации классического генератора ряда Фибоначчи.

! fib.f90
subroutine fib(a, n)
  use iso_c_binding
   integer(c_int), intent(in) :: n
   integer(c_int), intent(out) :: a(n)
   do i = 1, n
      if (i .eq. 1) then
         a(i) = 0.0d0
      elseif (i .eq. 2) then
         a(i) = 1.0d0
      else
         a(i) = a(i - 1) + a(i - 2)
      end if
   end do
end

Это не выиграет никаких наград, но может быть разумной отправной точкой.

1.2 Параметры компиляции#

1.2.1 Основное использование#

Это не изменилось:

python -m numpy.f2py -c fib.f90 -m fib
❯ python -c "import fib; print(fib.fib(30))"
[     0      1      1      2      3      5      8     13     21     34
     55     89    144    233    377    610    987   1597   2584   4181
   6765  10946  17711  28657  46368  75025 121393 196418 317811 514229]

1.2.2 Указание бэкенда#

python -m numpy.f2py -c fib.f90 -m fib --backend distutils

Это значение по умолчанию для версий Python до 3.12.

python -m numpy.f2py -c fib.f90 -m fib --backend meson

Это единственный вариант для версий Python после 3.12.

1.2.3 Передать имя компилятора#

python -m numpy.f2py -c fib.f90 -m fib --backend distutils --fcompiler=gfortran
FC="gfortran" python -m numpy.f2py -c fib.f90 -m fib --backend meson

Также могут использоваться нативные файлы.

Аналогично, CC можно использовать в обоих случаях для установки C компилятора. Поскольку переменные окружения обычно довольно общие для обоих, небольшой пример приведён ниже.

Name

Что

FC

Компилятор Fortran

CC

C компилятор

CFLAGS

Опции компилятора C

FFLAGS

Опции компилятора Fortran

LDFLAGS

Опции компоновщика

LD_LIBRARY_PATH

Расположение файлов библиотек (Unix)

LIBS

Библиотеки для линковки

PATH

Путь поиска для исполняемых файлов

CXX

Компилятор C++

CXXFLAGS

Параметры компилятора C++

Примечание

Для Windows это может работать не очень надежно, поэтому нативные файлы вероятно, лучший вариант, или путем прямого 1.3 Настройка сборок.

1.2.4 Зависимости#

Здесь, meson может фактически использоваться для более надежной установки зависимостей.

python -m numpy.f2py -c fib.f90 -m fib --backend distutils -llapack

Обратите внимание, что этот подход на практике подвержен ошибкам.

python -m numpy.f2py -c fib.f90 -m fib --backend meson --dep lapack

Это соответствует dependency("lapack") и поэтому могут использоваться для широкого спектра зависимостей. Они могут быть дальнейшая настройка использовать CMake или другие системы для разрешения зависимостей.

1.2.5 Библиотеки#

Оба meson и distutils способны линковаться с библиотеками.

python -m numpy.f2py -c fib.f90 -m fib --backend distutils -lmylib -L/path/to/mylib
python -m numpy.f2py -c fib.f90 -m fib --backend meson -lmylib -L/path/to/mylib

1.3 Настройка сборок#

python -m numpy.f2py -c fib.f90 -m fib --backend distutils --build-dir blah

Это может быть технически интегрировано с другими кодами, см. Использование через numpy.distutils.

python -m numpy.f2py -c fib.f90 -m fib --backend meson --build-dir blah

Полученная сборка может быть настроена через Руководство по сборке с помощью Meson. Фактически, полученный набор файлов можно даже напрямую закоммитить и использовать как мезонный подпроект в отдельной кодовой базе.