.. ftnproject
FORTRAN Module(s)
=================
GenericF2PY will act as an example of how to treat a `PyPI `_
project containing FORTRAN modules.
For your project, it would be very reasonable to start with a copy of the
`GenericF2PY Github repository `_
and change all occurrences of GenericF2PY to , and replace
the simple **fprog.f** FORTRAN code with your FORTRAN code.
A simplified layout of GenericF2PY is shown below::
GenericF2PY/
docs/
...
genericf2py/
__init__.py
main.py
examples/
example_1.py
src/
fprog.f
fprog.inc
tests/
__init__.py
test_main.py
LICENSE.txt
MANIFEST.in
README.rst
requirements.txt
setup.cfg
setup.py
Note that the FORTRAN source code is in the subdirectory **"GenericF2PY/genericf2py/src"**.
In GenericF2PY, there is both a FORTRAN source file (**fprog.f**) and a FORTRAN include file (**fprog.inc**).
SETUP.PY File
-------------
In order to compile the FORTRAN code when using **pip install**, the **setup.py** file should
use the `numpy setup `_
(not the usual setuptools version of **setup**)
A `numpy Extension `_ object
will be created to handle the FORTRAN source code.
.. code:: python
# Use numpy to build the f2py fortran extension
# --------------------------------
import setuptools
from numpy.distutils.core import Extension, setup
A `numpy Extension `_ object
should be created for each of the FORTRAN modules in your project.
.. code:: python
ext_fprog = Extension(name = 'genericf2py.fprog',
sources = ['genericf2py/src/fprog.f'])
After creating the `numpy Extension `_ object
simply include it in the call to **setup** and the **setup.py** file is complete.
The example below is truncated... make the rest of the call to **setup** however you normally do it.
.. code:: python
setup(
ext_modules = [ext_fprog], # numpy Extension object created above.
name='genericf2py',
platforms = 'any',
install_requires = ['numpy'], # includes numpy + any other requirements
version = __version__,
description = 'GenericF2PY demostrates how to handle FORTRAN binaries in python modules.',
long_description = long_description,
# the rest of your normal setup call goes below...
# ...
)
Build & Upload
--------------
With the above accomplished, you simply need to build your project and upload it to `PyPI `_.
Build a source distribution with::
python setup.py sdist
This will create a file like **genericf2py-0.1.15.tar.gz** in the **/dist** subdirectory.
You upload this to `PyPI `_ directly from the **/dist** subdirectory with the command::
twine upload --skip-existing dist/*
User Experience
---------------
From this point, your users should be able to install your package like::
pip install genericf2py
The FORTRAN module(s) will be compiled and made available to the project.
In order to achieve this, the user may need to do some setup, see: :ref:`link_userinstructions`.