[Distutils] SWIG runtime libs/Python distutils combo on Mac
Bill Spotz
wfspotz at sandia.gov
Mon Sep 27 18:03:04 CEST 2004
This problem concerns using distutils to compile a set of python
modules that are generated by SWIG, so I am cross-posting to both SWIG
and distutils mailing lists.
I use SWIG to wrap several packages that are intended to be both
independent and interoperable. So I am creating separate python
extensions that link to the swig runtime libraries.
Previously, I linked to installed system runtime libraries, but this is
not the preferred approach, and indeed, swig 1.3.22 does not support
it. Instead, I am supposed to generate my own local runtime library,
and link to it. Fine; this would seem to be more portable.
The SWIG documentation says to do the following (for Linux), with the
caveat that compiling dynamic libraries is different on every system:
------------------
% swig -runtime -python swigrun.i
% gcc -fpic swigrun_wrap.c -o swigrun_wrap.o
% gcc -shared swigrun_wrap.o -o libswigrunpy.so
Now, you compile all of the normal SWIG modules using the -noruntime
option:
% swig -noruntime -c++ -python A.i
% swig -noruntime -c++ -python B.i
Finally, when linking the dynamically loadable modules, you need to
link again the special runtime library above. For example (Linux) :
% g++ -shared A_wrap.o -L. -lswigrunpy -o _A.so
% g++ -shared B_wrap.o -L. -lswigrunpy -o _B.so
------------------
To get around the portability problem, I have decided to use python's
distutils module to handle the compilation issues. In my setup.py
script, I define
SwigRun = Extension("PyTrilinos.libswigrun", ["src/swigrun_wrap.c"])
and this works, as build/lib.blahblahblah/PyTrilinos/libswigrun.so gets
created properly. When I define real extensions in setup.py, they are
created with keyword arguments
library_dirs = [..., "build/lib.blahblahblah/PyTrilinos", ...],
libraries = [..., "swigrun", ...],
which gives me the link command arguments I want:
-Lbuild/lib.blahblahblah/PyTrilinons -lswigrun. However, on my Mac,
when the link command is invoked, I get
ld: can't locate file for: -lswigrun
I strongly suspect that the Mac's ld command does not search for
libswigrun.so when -lswigrun is given as a command line argument (the
old system libraries have .la and .dylib extensions). But I cannot
figure out how to get setup.py to compile to a different suffix.
Any suggestions would be appreciated.
** Bill Spotz **
** Sandia National Laboratories Voice: (505)845-0170 **
** P.O. Box 5800 Fax: (505)284-5451 **
** Albuquerque, NM 87185-0316 Email: wfspotz at sandia.gov **
More information about the Distutils-SIG
mailing list