You are here: Home Tech Building Python with --enable-shared in non-standard location

Building Python with --enable-shared in non-standard location

by Chris Shenton last modified Feb 04, 2009 02:01 PM
We want to use mod_wsgi but getting python to link at runtime isn't obvious.

We have some RedHat boxes which ship with python-2.4 for its own uses like Yum.  Its python libraries are in /usr/lib/python2.4.  If we try and install another python-2.4 in another location, we've found that at runtime it uses the system's python libraries instead.  This plays havoc with our use of a custom python for plone or mod_wsgi or django and whatnot.

I've seen this happen as well when compiling a different python version like 2.6: django under mod_wsgi said it was running my python from its absolute path, but then reported that the python version was 2.4. Deeply disturbing.

When I built these pythons I installed them in locations like /usr/local/python/2.5 and /usr/local/python/2.6.  If I used the --enable-shared flag then when I tried to run them, they couldn't find their shared libraries.  I could use "ldd" to add their libraries to the systems cache, and that would work so long as there weren't any other same-versioned pythons that needed this. Doing it for 2.4 would have hosed the system python and probably broken yum. So this approach isn't robust and can lead to difficult failures later.

So instead I can use the "-rpath" loader flag at configuration to tell it to link against its own libraries at runtime.

 ./configure --enable-shared --prefix=/usr/local/python/2.5  LDFLAGS="-Wl,-rpath /usr/local/python/2.5/lib"

Surprise! It fails severely with the misleading message:

checking for C compiler default output file name...
configure: error: C compiler cannot create executables

It acts as if setting this rpath is breaking the compiler, as if it now can't find its own libraries.  If I first create the (empty) library directory then re-run the configure, it works:

sudo mkdir -p /usr/local/python/2.5/lib

Then invoke the configure command again. After it completes, do the normal make and make install, then you can run your new python and the rpath will tell it to link against the library that was built for it.

Then you can build mod_wsgi against this and it won't complain about python not being able to load its library.

Share this: