1 遷移到 meson#

根據 numpy.distutils 的狀態與遷移建議 中列出的時程,distutils 已不再是 f2py 的預設建置後端。本頁面收集兩種格式的常見工作流程。

注意

這是一份**持續更新**的文件,非常歡迎pull requests

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++ 編譯器選項

注意

對於 Windows,這些可能無法非常可靠地運作,因此原生檔案可能是最佳選擇,或者直接透過1.3 自訂建置

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 函式庫#

mesondistutils 都能夠連結函式庫。

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 子專案。