2017-04-25 45 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,所以不能升級。 –