python3中f2py的Makefile

时间:2017-04-25 18:51:14

标签: python-3.x makefile cpython f2py

为了在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,...)?

1 个答案:

答案 0 :(得分:3)

我的建议是保留版本控制(它是出于某种原因而发明的......)而是确定它使用的后缀是什么。命令python3-config --extension-suffix得到了。

因此makefile看起来像

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,那么您可能会想出一个有效的通配符。

我认为第二种选择比第一种更糟糕......