[Numpy-discussion] how to compile Fortran using setup.py

Ondrej Certik ondrej at certik.cz
Fri Mar 11 01:57:54 EST 2011


On Thu, Mar 10, 2011 at 8:25 PM, Robert Kern <robert.kern at gmail.com> wrote:
> On Thu, Mar 10, 2011 at 19:58, Ondrej Certik <ondrej at certik.cz> wrote:
>> Hi,
>>
>> I spent about an hour googling and didn't figure this out. Here is my setup.py:
>>
>> setup(
>>    name = "libqsnake",
>>    cmdclass = {'build_ext': build_ext},
>>    version = "0.1",
>>    packages = [
>>        'qsnake',
>>        'qsnake.calculators',
>>        'qsnake.calculators.tests',
>>        'qsnake.data',
>>        'qsnake.mesh2d',
>>        'qsnake.tests',
>>        ],
>>    package_data = {
>>        'qsnake.tests': ['phaml_data/domain.*'],
>>        },
>>    include_dirs=[numpy.get_include()],
>>    ext_modules = [Extension("qsnake.cmesh", [
>>        "qsnake/cmesh.pyx",
>>        "qsnake/fmesh.f90",
>>        ])],
>>    description = "Qsnake standard library",
>>    license = "BSD",
>> )
>>
>> The qsnake.cmesh extension needs to compile .pyx into .c and later to
>> .o, it needs to use gfortran to compile fmesh.f90 to fmesh.o, and then
>> link both things. That's it. In other words, this is what I want
>> distutils to do:
>>
>> $ cython cmesh.pyx
>> $ gcc -fPIC -o cmesh.o -c cmesh.c -I$SPKG_LOCAL/include/python2.6
>> -I$SPKG_LOCAL/lib/python2.6/site-packages/numpy/core/include
>> $ gfortran -fPIC -o fmesh.o -c fmesh.f90
>> $ gcc -shared -o cmesh.so cmesh.o fmesh.o
>
> Difficult if sticking with distutils of any flavor. You would have
> probably to replace the build_ext command to handle both the Fortran
> and the Cython. You may want to give David Cournapeau's Bento a try:
>
>  http://pypi.python.org/pypi/bento/

Thanks Robert. I burned most of my today's evening on this, trying to
replace the command, but so far I didn't figure it out. It is indeed
difficult, but I wasn't sure, whether it is because I am not so
familiar with distutils.

I looked at bento, but I'll simply stick to cmake. I thought that for
a Python package (that uses cython + C or fortran, which I thought is
a pretty standard configuration for scientific computing), I would use
distutils, just like other Python packages.

With cmake, I have already figured out how to mix fotran, c, c++,
Cython and Python and everything works nicely together, very robustly.
So if I have to hack distutils anyway, I would write a simple
distutils -> cmake bridge.

Ondrej



More information about the NumPy-Discussion mailing list