doc/source/f2py/buildtools/cmake.rst
.. _f2py-cmake:
cmakeIn terms of complexity, cmake falls between make and meson. The
learning curve is steeper since CMake syntax is not pythonic and is closer to
make with environment variables.
However, the trade-off is enhanced flexibility and support for most architectures
and compilers. An introduction to the syntax is out of scope for this document,
but this extensive CMake collection_ of resources is great.
.. note::
cmake is very popular for mixed-language systems, however support for
f2py is not particularly native or pleasant; and a more natural approach
is to consider :ref:f2py-skbuild
Returning to the fib example from :ref:f2py-getting-started section.
.. literalinclude:: ./../code/fib1.f :language: fortran
We do not need to explicitly generate the python -m numpy.f2py fib1.f
output, which is fib1module.c, which is beneficial. With this; we can now
initialize a CMakeLists.txt file as follows:
.. literalinclude:: ./../code/CMakeLists.txt :language: cmake
A key element of the CMakeLists.txt file defined above is that the
add_custom_command is used to generate the wrapper C files and then
added as a dependency of the actual shared library target via a
add_custom_target directive which prevents the command from running every
time. Additionally, the method used for obtaining the fortranobject.c file
can also be used to grab the numpy headers on older cmake versions.
This then works in the same manner as the other modules, although the naming
conventions are different and the output library is not automatically prefixed
with the cython information.
.. code:: bash
ls .
# CMakeLists.txt fib1.f
cmake -S . -B build
cmake --build build
cd build
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.]
This is particularly useful where an existing toolchain already exists and
scikit-build or other additional python dependencies are discouraged.
.. _extensive CMake collection: https://cliutils.gitlab.io/modern-cmake/