python3 中 f2py 的 Makefile
Makefile for f2py in python3
为了在 python2 中使用 f2py 构建扩展模块,我一直在使用类似于以下内容的 Makefile:
default: fortran_lib.so
%.so:: %.f90
f2py -c -m $* $<
为了完整起见,这里还有一个虚拟 fortran_lib.f90
文件
subroutine square(d)
implicit none
!f2py intent(inout) d
integer, intent(inout) :: d
d = d*d
end subroutine square
这曾经工作得很好,make
只会产生 fortran_lib.so
。
现在我也想支持 python3,但是当使用 f2py3
时,make
会生成版本化的 fortran_lib.cpython-35m-x86_64-linux-gnu.so
(在我的特定设置中)。
由于这与指定的目标名称不同,make
无法识别目标已经创建。因此,它会在您每次 运行 make
.
时重新制作目标
如何解决这个问题(无需对版本进行硬编码)?
- 我可以告诉 f2py3 关闭版本控制吗?
- 我能以某种方式解决 Makefile 中的版本控制问题吗?
- 或者我是否被迫切换到其他工具来构建扩展模块 (
distutils
,...)?
我的建议是保留版本控制(它是出于某种原因而发明的...),而是弄清楚它使用的后缀是什么。命令 python3-config --extension-suffix
得到它。
因此生成文件看起来像
EXT_SUFFIX := $(shell python3-config --extension-suffix)
default: fortran_lib$(EXT_SUFFIX)
%$(EXT_SUFFIX): %.f90
f2py3 -c -m $* $<
(我不确定 shell
是否是 GNU 扩展,如果是,是否会降低可移植性。这可能需要考虑。)
如果您真的很想去掉后缀,那么您应该在规则中添加第二步,例如:
%.so:: %.f90
f2py3 -c -m $* $<
mv $*$(EXT_SUFFIX) $@
如果您不想使用 shell
来获得 EXT_SUFFIX
那么您可能想出一个有效的通配符。
我认为第二种选择比第一种更糟糕...
为了在 python2 中使用 f2py 构建扩展模块,我一直在使用类似于以下内容的 Makefile:
default: fortran_lib.so
%.so:: %.f90
f2py -c -m $* $<
为了完整起见,这里还有一个虚拟 fortran_lib.f90
文件
subroutine square(d)
implicit none
!f2py intent(inout) d
integer, intent(inout) :: d
d = d*d
end subroutine square
这曾经工作得很好,make
只会产生 fortran_lib.so
。
现在我也想支持 python3,但是当使用 f2py3
时,make
会生成版本化的 fortran_lib.cpython-35m-x86_64-linux-gnu.so
(在我的特定设置中)。
由于这与指定的目标名称不同,make
无法识别目标已经创建。因此,它会在您每次 运行 make
.
如何解决这个问题(无需对版本进行硬编码)?
- 我可以告诉 f2py3 关闭版本控制吗?
- 我能以某种方式解决 Makefile 中的版本控制问题吗?
- 或者我是否被迫切换到其他工具来构建扩展模块 (
distutils
,...)?
我的建议是保留版本控制(它是出于某种原因而发明的...),而是弄清楚它使用的后缀是什么。命令 python3-config --extension-suffix
得到它。
因此生成文件看起来像
EXT_SUFFIX := $(shell python3-config --extension-suffix)
default: fortran_lib$(EXT_SUFFIX)
%$(EXT_SUFFIX): %.f90
f2py3 -c -m $* $<
(我不确定 shell
是否是 GNU 扩展,如果是,是否会降低可移植性。这可能需要考虑。)
如果您真的很想去掉后缀,那么您应该在规则中添加第二步,例如:
%.so:: %.f90
f2py3 -c -m $* $<
mv $*$(EXT_SUFFIX) $@
如果您不想使用 shell
来获得 EXT_SUFFIX
那么您可能想出一个有效的通配符。
我认为第二种选择比第一种更糟糕...