F2PY

The purpose of the F2PY –Fortran to Python interface generator– project is to provide a connection between Python and Fortran languages.

F2PY is a Python package (with a command line tool f2py and a module f2py2e) that facilitates creating/building Python C/API extension modules that make it possible to call Fortran 77/90/95 external subroutines and Fortran 90/95 module subroutines as well as C functions; to access Fortran 77 COMMON blocks and Fortran 90/95 module data, including allocatable arrays from Python.

For more information on the F2PY project, see http://www.f2py.com/.

The following variables are defined:

F2PY_EXECUTABLE      - absolute path to the F2PY executable
F2PY_VERSION_STRING  - the version of F2PY found
F2PY_VERSION_MAJOR   - the F2PY major version
F2PY_VERSION_MINOR   - the F2PY minor version
F2PY_VERSION_PATCH   - the F2PY patch version

Note

By default, the module finds the F2PY program associated with the installed NumPy package.

Example usage

Assuming that a package named method is declared in setup.py and that the corresponding directory containing __init__.py also exists, the following CMake code can be added to method/CMakeLists.txt to ensure the C sources associated with cylinder_methods.f90 are generated and the corresponding module is compiled:

find_package(F2PY REQUIRED)

set(f2py_module_name "_cylinder_methods")
set(fortran_src_file "${CMAKE_CURRENT_SOURCE_DIR}/cylinder_methods.f90")

set(generated_module_file ${CMAKE_CURRENT_BINARY_DIR}/${f2py_module_name}${PYTHON_EXTENSION_MODULE_SUFFIX})

add_custom_target(${f2py_module_name} ALL
  DEPENDS ${generated_module_file}
  )

add_custom_command(
  OUTPUT ${generated_module_file}
  COMMAND ${F2PY_EXECUTABLE}
    -m ${f2py_module_name}
    -c
    ${fortran_src_file}
  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  )

install(FILES ${generated_module_file} DESTINATION methods)

Warning

Using f2py with -c argument means that f2py is also responsible to build the module. In that case, CMake is not used to find the compiler and configure the associated build system.

The following functions are defined:

add_f2py_target

Create a custom rule to generate the source code for a Python extension module using f2py.

add_f2py_target(<Name> [<F2PYInput>]
[OUTPUT_VAR <OutputVar>])

<Name> is the name of the new target, and <F2PYInput> is the path to a pyf source file. Note that, despite the name, no new targets are created by this function. Instead, see OUTPUT_VAR for retrieving the path to the generated source for subsequent targets.

If only <Name> is provided, and it ends in the “.pyf” extension, then it is assumed to be the <F2PYInput>. The name of the input without the extension is used as the target name. If only <Name> is provided, and it does not end in the “.pyf” extension, then the <F2PYInput> is assumed to be <Name>.pyf.

Options:

OUTPUT_VAR <OutputVar>
Set the variable <OutputVar> in the parent scope to the path to the generated source file. By default, <Name> is used as the output variable name.
DEPENDS [source [source2...]]
Sources that must be generated before the F2PY command is run.

Defined variables:

<OutputVar>
The path of the generated source file.

Example usage

find_package(F2PY)

# Note: In this case, either one of these arguments may be omitted; their
# value would have been inferred from that of the other.
add_f2py_target(f2py_code f2py_code.pyf)

add_library(f2py_code MODULE ${f2py_code})
target_link_libraries(f2py_code ...)