I've got shared libraries working on Windows and Linux -- without any 
LD_LIBRARY_PATH nonsense, or any .so file rewriting.  I have not had a 
chance to try this on OS X, however.  If there's anybody out there who has 
experience wrestling with the Mac OS linker (hi, Bob! <wink>) has a chance 
to try it out and maybe tweak it a little bit, I'd appreciate it.

The code is in the subversion trunk now, and the source includes a 
tests/shlib_test subdirectory that you can change to and run "setup.py 
test" to build/link/test, e.g.:

     cd tests/shlib_test
     PYTHONPATH=../.. python setup.py test

This just verifies that the basic linking works, i.e., whether my guesses 
for the linker options in build_ext.py were correct.  The second test is to 
verify that it works from a different directory:

     cd ..
     PYTHONPATH=..:shlib_test python -c "import hello"

If this works without crashing, then the dynamic linking works even from a 
different directory.

Based on my limited guesswork, the final test is the one most likely to 
fail on OS X (assuming the link step succeeded, and I'm not sure it 
will!).  Rename the test directory temporarily:

     mv shlib_test something_else
     PYTHONPATH=..:something_else python -c "import hello"
     mv something_else shlib_test

If this works without a bit of hacking, I'll be rather surprised, but 
*very* pleased.  If all three tests work without any changes to the source, 
it's probably a bug.  ;)  (Specifically, it probably means setuptools fell 
back to static linking, and thus isn't having any dynamic link problems.)

The basic idea of what I'm doing here is that I try to set the runtime 
library search path of each extension (that depends on a shared library in 
the project), to include the current directory *at runtime*, then make a 
Python wrapper for the extension that temporarily changes the current 
directory while doing the import.

The tricky bit -- if I understand correctly -- is that OS X has no concept 
of a runtime library search path, so what this probably *should* be doing 
is specifying something like "-dylib_file 
libhellolib.dylib:./libhellolib.dylib" in the link options for the 'hello' 
extension.  What I'm not clear on is whether this is actually allowed by 
the linker, or if it even does what I think it does in the first 
place.  Even if it's allowed and does the right thing, I have a sneaky 
suspicion that perhaps the path will be converted to an absolute path at 
link time, rather than leaving the './' in place, given the general 
reputation for deviousness possessed by the Mac OS linker.  :)

On the other hand, perhaps it's possible to fudge the paths in the dylib 
once it's built, such that the './' is in the file?  Any thoughts or 
suggestions would be welcome.

In a couple of weeks I'll have a chance to play around with this on a Mac 
myself, but since I'm starting from scratch (zero Mac experience 
whatsoever), I'm hoping maybe someone more experienced could provide some 
degree of guidance by then.  Thanks.

_______________________________________________
Distutils-SIG maillist  -  [email protected]
http://mail.python.org/mailman/listinfo/distutils-sig

Reply via email to