This is a pre-release version (2.5.0.dev0+git20251130.2de293a). Go to latest (2.4.4)
{ } Raw JSON

bundles / numpy 2.5.0.dev0+git20251130.2de293a / docs

Doc

Using via meson

docs/f2py:buildtools:meson

The key advantage gained by leveraging meson over the techniques described in f2py-distutils is that this feeds into existing systems and larger projects with ease. meson has a rather pythonic syntax which makes it more comfortable and amenable to extension for python users.

Fibonacci walkthrough (F77)

We will need the generated C wrapper before we can use a general purpose build system like meson. We will acquire this by:

python -m numpy.f2py fib1.f -m fib2

Now, consider the following meson.build file for the fib and scalar examples from f2py-getting-started section:

At this point the build will complete, but the import will fail:

meson setup builddir
meson compile -C builddir
cd builddir
python -c 'import fib2'
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: fib2.cpython-39-x86_64-linux-gnu.so: undefined symbol: FIB_
# Check this isn't a false positive
nm -A fib2.cpython-39-x86_64-linux-gnu.so | grep FIB_
fib2.cpython-39-x86_64-linux-gnu.so: U FIB_

Recall that the original example, as reproduced below, was in SCREAMCASE:

With the standard approach, the subroutine exposed to python is fib and not FIB. This means we have a few options. One approach (where possible) is to lowercase the original Fortran file with say:

tr "[:upper:]" "[:lower:]" < fib1.f > fib1.f
python -m numpy.f2py fib1.f -m fib2
meson --wipe builddir
meson compile -C builddir
cd builddir
python -c 'import fib2'

However this requires the ability to modify the source which is not always possible. The easiest way to solve this is to let f2py deal with it:

python -m numpy.f2py fib1.f -m fib2 --lower
meson --wipe builddir
meson compile -C builddir
cd builddir
python -c 'import fib2'

Automating wrapper generation

A major pain point in the workflow defined above, is the manual tracking of inputs. Although it would require more effort to figure out the actual outputs for reasons discussed in f2py-bldsys.

However, we can augment our workflow in a straightforward to take into account files for which the outputs are known when the build system is set up.

This can be compiled and run as before.

rm -rf builddir
meson setup builddir
meson compile -C builddir
cd builddir
python -c "import numpy as np; import fibby; a = np.zeros(9); fibby.fib(a); print (a)"
# [ 0.  1.  1.  2.  3.  5.  8. 13. 21.]

Salient points

It is worth keeping in mind the following:

  • It is not possible to use SCREAMCASE in this context, so either the contents of the .f file or the generated wrapper .c needs to be lowered to regular letters; which can be facilitated by the --lower option of F2PY