1 Migrating to meson#

As per the timeline laid out in Status of numpy.distutils and migration advice, distutils has been removed. This page collects common workflows.

Note

This is a living document, pull requests are very welcome!

1.1 Baseline#

We will start out with a slightly modern variation of the classic Fibonnaci series generator.

! 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

This will not win any awards, but can be a reasonable starting point.

1.2 Compilation options#

1.2.1 Basic Usage#

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 Specify the backend#

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

This is the only option. There used to be a distutils backend but it was removed in NumPy2.5.0.

1.2.3 Pass a compiler name#

FC=gfortran python -m numpy.f2py -c fib.f90 -m fib

Native files can also be used.

Similarly, CC can be used in both cases to set the C compiler. Since the environment variables are generally pretty common across both, so a small sample is included below.

Name

What

FC

Fortran compiler

CC

C compiler

CFLAGS

C compiler options

FFLAGS

Fortran compiler options

LDFLAGS

Linker options

LD_LIBRARY_PATH

Library file locations (Unix)

LIBS

Libraries to link against

PATH

Search path for executables

CXX

C++ compiler

CXXFLAGS

C++ compiler options

Note

For Windows, these may not work very reliably, so native files are likely the best bet, or by direct 1.3 Customizing builds.

1.2.4 Dependencies#

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

This maps to dependency("lapack") and so can be used for a wide variety of dependencies. They can be customized further to use CMake or other systems to resolve dependencies.

1.2.5 Libraries#

meson is capable of linking against libraries.

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

1.3 Customizing builds#

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

The resulting build can be customized via the Meson Build How-To Guide. In fact, the resulting set of files can even be committed directly and used as a meson subproject in a separate codebase.