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++ 編譯器選項 |
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 子專案。