[SciPy-dev] Re: build_flib.py again
Pearu Peterson
pearu at scipy.org
Wed Oct 29 14:38:47 CST 2003
On Wed, 29 Oct 2003, [iso-8859-15] Berthold Höllmann wrote:
> Pearu Peterson <pearu at scipy.org> writes:
>
> > Could you give a more detailed example of the fortran wrapper and how do
> > you wrap it to Python? If these wrappers can be modified e.g. by inserting
> > f2py directives, then `fortranname` .pyf file command might be what you
> > need.
>
> Now i have a binary Fortran library named 'provided'. 'provided'
> provides a function 'subroutine foo()' which leads to a symol '_FOO at 0'
> in the library. Now i want to write a function that makes intensive
> use of 'foo', so I write a Fortran routine 'subroutine usefoo()' that
> is specific to python ant I wrap it unsing f2py. Because 'usefoo' is
> only usefull for my Python extension library I include it's sourcecode
> in my Python Project and build it as 'fortran_libraries' using scipy
> distutils. With the switches' settings as they are now this does not
> work, because the linker looks for '_foo_' instead of '_FOO' or
> '_FOO at 0'.
Thanks for the explanation. So, you must be also using -DUPPERCASE_FORTRAN
and -DPREPEND_FORTRAN cpp options. In fact, there are two possible ways
for resolving Fortran symbols in f2py generated modules:
+ One is to uses compiler options to force certian convention that I
explained earlier.
+ And the other is to use certain combinations of the CPP variables
UPPERCASE_FORTRAN, PREPEND_FORTRAN, NO_APPEND_FORTRAN.
In scipy_distutils we are using the first way because of two reasons:
(i) this avoids issues with symbols containing characters like @ or !
that certain Fortran compilers may add to the initial names; namely, these
characters in names will cause C compiler to complain as they are not
allowed characters for C names.
(ii) we haven't worked out a way how to define CPP macros for a C compiler
depending on the Fortran compiler, and all that within the framework of
distutils.
But to resolve your case, there should be a way to define Fortran compiler
options for scipy_distutils, but this feature is not implemented yet
because we haven't needed it earlier. Meanwhile, you can use the following
workaround in the setup.py file:
from scipy_distutils.command import build_flib
class my_fortran_compiler(build_flib.compaq_visual_fortran_compiler):
def __init__(self, fc=None, f90c=None, verbose=0):
build_flib.compaq_visual_fortran_compiler.__init__(self,fc,f90c,verbose)
s = self.f77_switches
s = s.replace('/names:lowercase','')
s = s.replace('/assume:underscore','')
# ...
self.f77_switches = s
# similarly can be self.f90_switches fixed.
i = build_flib.all_compilers.index(build_flib.compaq_visual_fortran_compiler)
build_flib.all_compilers[i] = my_fortran_compiler
Note that I have not tested this code but it should work after fixing any
possible typos that I might have been made here.
Pearu
More information about the Scipy-dev
mailing list