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 编译器。由于环境变量在这两者之间通常很常见,因此下面包含了一个小示例。
| 名称 | 说明 | 
| FC | Fortran 编译器 | 
| CC | C 编译器 | 
| CFLAGS | C 编译器选项 | 
| FFLAGS | Fortran 编译器选项 | 
| LDFLAGS | 链接器选项 | 
| LDLIBRARYPATH | 库文件位置 (Unix) | 
| LIBS | 要链接的库 | 
| PATH | 可执行文件的搜索路径 | 
| LDFLAGS | 链接器标志 | 
| CXX | C++ 编译器 | 
| CXXFLAGS | C++ 编译器选项 | 
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 构建操作指南进行自定义。事实上,生成的文件集甚至可以直接提交并在单独的代码库中用作 Meson 子项目。