[Pythonmac-SIG] Python 2.3.4 Installation
tmk
lists at netelligent.biz
Sun Nov 28 23:59:34 CET 2004
Thanks a lot for the thorough (and quick!) explanation Bob.
This is much appreciated.
= tmk =
On Nov 28, 2004, at 17:45, Bob Ippolito wrote:
> On Nov 28, 2004, at 10:53 AM, tmk wrote:
>
>> First I must confess that I don't really understand the details of
>> the problem of building extensions with multiple versions of Python
>> installed on Panther...
>
> Very few people do :)
>
>> Out of curiosity I just checked and the lib/python2.3/config/Makefile
>> file from my compiled from source python 2.3.4 don't appear to be
>> patched with the patch below.
>
> The correct linker settings are not adopted by any mainline version of
> Python 2.3. I had thought they were in 2.3.4, but they're not. Only
> Python 2.4 builds correctly by default. Also, Apple's build of Python
> 2.3.3 in the WWDC 2004 preview
> <http://www.opensource.apple.com/darwinsource/WWDC2004/python-11/>
> adopts a similar method to this patch, but slightly modified so that
> it does not depend on MACOSX_DEPLOYMENT_TARGET being set:
>
> (this is what a good
> /System/Library/Frameworks/Python.framework/Versions/2.3/lib/
> python2.3/config/Makefile should look like, starting on or around line
> 98)
>
> LDSHARED= env MACOSX_DEPLOYMENT_TARGET=10.3 $(CC) $(LDFLAGS) -bundle
> -undefined dynamic_lookup
> BLDSHARED= env MACOSX_DEPLOYMENT_TARGET=10.3 $(CC) $(LDFLAGS) -bundle
> -undefined dynamic_lookup
>
>> Am I correct in assuming that this is ok and that the patch below is
>> only meant for the Apple-installed python 2.3?
>
> Unfortunately not, it recently came to my attention that it is VERY
> IMPORTANT TO PATCH THIS MAKEFILE. Here is some more information
> (listing what will happen with various permutations of common Python
> installations). I hope to never have to repeat this again by email :)
>
> Versions of Mac OS X prior to 10.3: This patch isn't at all compatible
> because dyld did not support this feature until Darwin 7. That sucks,
> but there's little that can be done about that!
>
> = Scenario 1 =
>
> [a] Python 2.3.0 in /System/Library, unpatched
> [b] Python 2.3.x in /Library, unpatched
>
> Building extensions with [a] no longer works, because -framework
> Python locates [b]. Therefore, it actually ends up building
> extensions only compatible with [b].
> Building extensions with [b] correctly creates extensions, but are
> only compatible with [b].
> Loading correctly built extensions built for [a] from [b] or vice
> versa will crash the interpreter.
>
> = Scenario 2 =
>
> [a] Python 2.3.0 in /System/Library, patched
> [b] Python 2.3.x in /Library, unpatched
>
> Building extensions with [a] will build extensions compatible with [b]
> (or any other Python 2.3.x, even non-framework builds).
> Building extensions with [b] correctly creates extensions, but are
> only compatible with [b].
> Loading correctly built extensions built for [b] from [a] will crash
> the interpreter.
>
> = Scenario 3 =
>
> [a] Python 2.3.0 in /System/Library, unpatched
> [b] Python 2.3.x in /Library, patched
>
> Building extensions with [a] no longer works, because -framework
> Python locates [b]. Therefore, it actually ends up building
> extensions only compatible with [b].
> Building extensions with [b] will build extensions compatible with [a]
> (or any other Python 2.3.x, even non-framework builds).
> Loading correctly built extensions built for [a] from [b] will crash
> the interpreter.
>
> = Scenario 4 =
>
> [a] Python 2.3.0 in /System/Library, patched
> [b] Python 2.3.x in /Library, patched
>
> Building extensions with [a] will build extensions compatible with [b]
> (or any other Python 2.3.x, even non-framework builds) and vice versa.
>
> = Scenario 5 =
>
> [a] Python 2.3.0 in /System/Library, unpatched
> [b] Python 2.3.x in /Library, unpatched
> [c] Python 2.4.x in /Library <no patch necessary>
>
> Building extensions with [a] no longer works, because -framework
> Python locates [c]. These extensions are not compatible with ANY
> Python (built with 2.3 headers, linked with 2.4).
> Building extensions with [b] no longer works, because -framework
> Python locates [c]. These extensions are not compatible with ANY
> Python (built with 2.3 headers, linked with 2.4).
> Loading correctly built extensions built for [a] from [b] or vice
> versa will crash the interpreter.
>
> = Scenario 6 =
>
> [a] Python 2.3.0 in /System/Library, patched
> [b] Python 2.3.x in /Library, unpatched
> [c] Python 2.4.x in /Library <no patch necessary>
>
> Building extensions with [b] no longer works, because -framework
> Python locates [c]. These extensions are not compatible with ANY
> Python (built with 2.3 headers, linked with 2.4).
> Loading correctly built extensions built for [b] from [a] will crash
> the interpreter.
>
> = Scenario 7 =
>
> [a] Python 2.3.0 in /System/Library, unpatched
> [b] Python 2.3.x in /Library, patched
> [c] Python 2.4.x in /Library <no patch necessary>
>
> Building extensions with [a] no longer works, because -framework
> Python locates [c]. These extensions are not compatible with ANY
> Python (built with 2.3 headers, linked with 2.4).
> Loading correctly built extensions built for [a] from [b] will crash
> the interpreter.
>
> = Scenario 8 =
>
> [a] Python 2.3.0 in /System/Library, patched
> [b] Python 2.3.x in /Library, patched
> [c] Python 2.4.x in /Library <no patch necessary>
>
> Building extensions with [b] will build extensions compatible with [a]
> (or any other Python 2.3.x, even non-framework builds) and vice versa.
>
> ...
>
> So obviously, it's very important to patch your Python! The sooner
> you patch, the less extensions you will build that are tied to a
> particular installation location. Note that nearly all precompiled
> extensions you will find for Python 2.3.0 are generally of the
> unpatched variety, so they aren't compatible with other installations
> of Python 2.3.x.
>
> Considering [c] can screw up the whole mix, even though it doesn't
> have it's own problems... it turns out that there is a fundamental
> flaw in the way gcc's compiler and linker finds headers and dylibs
> from frameworks! It can't take version numbers into account! The
> runtime does just fine, but link time does not.. This is pretty bad!
> It's not solvable without patching gcc either, because from the source
> files you say <FrameworkName/HeaderName.h> but HeaderName.h doesn't
> live in a directory named FrameworkName, it lives in a directory named
> Headers, so it's not possible to specify an -I that works correctly if
> you use this feature.
>
> There are a few workarounds to versioned framework issues, and they
> all suck.
>
> [1] Keep versioned frameworks in separate places and use -F
> appropriately.
> [2] Use -I with only "inside-framework" header names (i.e. <Python.h>
> instead of <Python/Python.h>) and link directly to the framework's
> dylib as if it were an .o file (i.e.
> /Library/Frameworks/Python.framework/Versions/2.3/Python instead of
> -framework Python)
> [3] Name your frameworks with the version number in them instead of
> using the versioning capability of frameworks (i.e.
> Python23.framework)
>
> Note that Python 2.4 uses a hybrid of [1] and [2]. When building the
> Python framework, it uses -F into the build directory, so it always
> links the interpreter correctly. All sources expect the headers to be
> available via "Python.h" and it uses an appropriate -I to make this
> work. When building extensions, it uses -undefined dynamic_lookup, so
> it doesn't link directly to any Python.
>
>> Also in a separate but related e-mail you also suggested that one
>> would "also need to set the "MACOSX_DEPLOYMENT_TARGET" environment
>> variable to "10.3" when using this patch."
>>
>> Could you please elaborate on how/where one should set that
>> environment variable (I set it in ~/.MacOSX/environment.plist).
>
> Setting it there is fine. You could also, instead, adopt a better
> patch like Apple has as stated above.
>
> -bob
>
More information about the Pythonmac-SIG
mailing list