2017-04-25 138 views
0

f2py为了建立使用python2 f2py扩展模块,我一直在使用一个Makefile类似于:的Makefile中python3

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

我的建议是离开版本(它是为了某个原因而发明的),而是计算出它使用的后缀是什么。命令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) [email protected] 

如果你不想使用shell得到EXT_SUFFIX那么你可能会想出一个通配符的工作。

我认为这第二个选项更糟,第一个...

+0

这正是我所期待的。由于代表<15,所以不能升级。 –