在setup.py中自动构建共享fortran库,并将其链接到f2py



我正在寻找生成setup.py文件的最佳方法,该文件基于Fortran例程构建我的包。

封装/模块结构

.
├── CHANGES.txt
├── LICENSE.txt
├── MANIFEST.in
├── README.md
├── PKG
│   ├── __init__.py
│   ├── lib
│   │   ├── __init__.py
│   │   ├── xx.f90
│   │   ├── yy.f90
│   │   ├── gg.py
│   ├── dirA
│   │   ├── __init__.py
│   │   ├── ee.py
│   │   ├── bb.py
├── setup.py

Fortran文件的手动编译

为了生成Python包装器并编译Fortran文件,我可以使用以下工作流(在文件夹库中(来完成:

gfortran -fPIC -Wall -fcheck=all --shared xx.f90 -o xx.o[1]

f2py -c -m yy yy.f90 xx.o

前一行确保共享库xx.o和库"yy.f90"之间的链接。

请注意,f2py -c -m xx xx.f90不起作用,因为使用了一些f2py不可用的语法(在子例程中使用可分配的参数…(。

当前setup.py(不工作(

我使用numpy.distutils:的Extension模块

import os
from numpy.distutils.core import setup, Extension
#
pkgs['PKG'] = 'PKG'
pkgs['PKG.lib'] = 'PKG/lib'
pkgs['PKG.dirA'] = 'PKG/dirA'
#
exts = list()
exts.append(
Extension(name='PKG.lib.yy',
sources=['PKG/lib/yy.f90','PKG/lib/xx.o'],
extra_compile_args=['-g','--backtrace'],
extra_link_args=[],
f2py_options=['--debug-capi']))
###
### 
setup(name = 'PKG',
ext_modules = exts,
packages = list(pkgs.keys()),
package_dir = pkgs,
include_package_data=True,
zip_safe=False
)

问题

有没有办法将setup.py中共享图书馆的建设整合起来?一种解决方案可以是手动运行第[1]行,但如果可能的话,我希望避免使用自己的语法,以便使用f2py使用的相同gfortran编译器和选项。

最后,解决方案是在扩展和设置中使用library/libraries参数:

import os
from numpy.distutils.core import setup, Extension
#
pkgs['PKG'] = 'PKG'
pkgs['PKG.lib'] = 'PKG/lib'
pkgs['PKG.dirA'] = 'PKG/dirA'
#
exts = list()
exts.append(
Extension(name='PKG.lib.yy',
sources=['PKG/lib/yy.f90'],
extra_compile_args=['-g','--backtrace'],
extra_link_args=[],
libraries=['xx'],
f2py_options=['--debug-capi']))
###
### 
setup(name = 'PKG',
ext_modules = exts,
packages = list(pkgs.keys()),
package_dir = pkgs,
libraries=['xx',sources=['PKG/lib/xx.f90']],
include_package_data=True,
zip_safe=False
)

另一种使用Configuration的解决方案

from numpy.distutils.core import setup
from numpy.distutils.misc_util import Configuration
config = Configuration('PKG')
config.packages=['PKG','PKG.lib']
config.add_extension('lib.yy',
sources=['PKG/lib/MeshField2D.f90'],
libraries=['xx'])
config.add_library('xx',
sources=['PKG/lib/xx.f90'])   
setup(**config.todict())

相关内容

  • 没有找到相关文章

最新更新