[Pythonmac-SIG] building universal binaries
Ronald Oussoren
ronaldoussoren at mac.com
Sun Feb 5 20:23:16 CET 2006
On 5-feb-2006, at 19:59, Bob Ippolito wrote:
> On Feb 5, 2006, at 6:48 AM, Ronald Oussoren wrote:
>
>>
>> On 5-feb-2006, at 7:46, Bob Ippolito wrote:
>>
>>>
>>> On Feb 3, 2006, at 12:10 PM, Bob Ippolito wrote:
>>>
>>>> I think the only things missing from my branch currently are:
>>>>
>>>> 1) 10.3.9 support
>>>
>>> I believe this is taken care of now that Ronald contributed the
>>> weak linking patch.
>>
>> If anyone wants support for 10.3.x with x <= 8 now would be the
>> right time to speak up and volunteer resources :-)
>
> In py2app I should at least be able to give a good error dialog if
> the app is built with the fat build but the target OS isn't >=
> 10.3.9, so this isn't all that urgent...
>
>>>> 3) Revamped Mac/OSX/Dist scripts (probably should rewrite all
>>>> that in
>>>> Python and not hardcode everything)
>>>
>>> This isn't done yet, but what we have now is probably a fully
>>> usable universal Python.
>>
>> I'll work on this, I probably still know what needs to be done
>> from when I tried to build a Python 2.4.2 compatible package using
>> this script.
>
> The "only" thing that needs to be done is to change strings in
> these files during (or after I guess) frameworkinstall:
>
> OSX/Dist/resources/ReadMe.txt
> OSX/Dist/resources/Welcome.rtf
> OSX/PythonLauncher/PythonLauncher_app/Contents/Info.plist
> OSX/PythonLauncher/PythonLauncher_app/Contents/Resources/
> factorySettings.plist
> OSXResources/framework/Info.plist
> OSXResources/framework/version.plist
> OSXResources/framework/InfoPlist.strings
>
> I was thinking it would be easiest to use string.Template to do
> this, with a dict populated mostly with distutils.sysconfig
> information but with a couple extra strings added such as the
> architectures supported, the full version, and the size of the
> package after installation.
>
>>>> This backwards incompatible change is mostly just a backport from
>>>> setuptools' pkg_resources module.
>>>>
>>>> $ python -c "from distutils.util import get_platform as p; print
>>>> p()"
>>>> macosx-10.4.3-fat
>>>
>>> This output will now be:
>>> macosx-10.3-fat
>>>
>>> The version number is determined from MACOSX_DEPLOYMENT_TARGET
>>> (or CONFIGURE_MACOSX_DEPLOYMENT_TARGET). It's relatively safe to
>>> assume that modules compiled with this build will be compatible
>>> with Mac OS X 10.3.9 (as long as they don't use 10.4 specific
>>> features anyway).
>>
>> I'm not 100% sure I'm happy with this. You can now accidently
>> create binary packages that claim to run on 10.3 yet don't. But as
>> you say, this will likely affect only a very small number of
>> packages (PyObjC being one of those, that's on my TODO list already).
>
> The only way to check this would be to set
> MACOSX_MAX_VERSION_REQUIRED to 1030, but that would be bad too
> because then you couldn't write code that takes advantage of Mac OS
> X 10.4 features because you'd get a compile time error.
Let's just keep the current behaviour (that is packages claiming that
they'll run on 10.3), we can always change this if it turns out that
this is a problem. Neither of expects it will be a problem, so we
should be safe ;-)
>
> In the setuptools branch of PyObjC the 10.3 and 10.4 specific
> modules are in separate distributions. We could simply set
> MACOSX_DEPLOYMENT_TARGET to 10.4 in the 10.4 setup.py and then it
> should build a package that claims 10.4.
I want to use weak linking in the wrappers to ensure that a single
binary distribution will be useable on 10.3 and later without loosing
features. That's not rocket-science, but requires some work.
>
>>> For modules that absolutely require 10.4 you can set the
>>> MACOSX_DEPLOYMENT_TARGET environment variable at build time (e.g.
>>> in setup.py) and then the package produced will have a different
>>> platform string. setuptools will need work if people actually do
>>> this, because it will need to know that a Mac OS X 10.4 user can
>>> use "macosx-10.3-fat" and "macosx-10.4-fat" packages. It's
>>> probably a better idea to just write all your code so that it
>>> uses weak symbols for anything that isn't in 10.3 and raises
>>> ImportError on initialization if it's not usable.
>>
>> Setuptools already contains code for this (using 10.3 packages on
>> 10.4) in pkg_resources.compatible_platforms for the stock python
>> distribution. That should also work with the python24-fat tree.
>> The only thing that would require work is accepting a cpu-specific
>> version if a fat package is not available. The only reason that
>> might be useful is stuf like psyco which is only available for one
>> of cpu-type.
>
> Well the way everything is setup, it's not going to be reasonable
> to build a package that claims to be specific to a given
> architecture using the universal Python. We'd need to have Yet
> Another Distutils Hack that takes the architecture list off of the
> command line or something and modifies the compiler/linker flags..
> ick.
Time for a MacOSXCompiler class? The hack would have to look at
extra_compile_args and extra_link_args, if those contain '-arch'
arguments it should strip
the architecture calls from the default compile flags.
>
> We do still need to patch setuptools because
> distutils.util.get_platform() is going to say 10.3, so we'd need to
> insert the code that knows what the actual version of the OS is.
If you need to specify another platform you can use a setuptools-
specific argument in setup.py.
>
> I can't think of anything that only works on one architecture...
> even psyco has a C-based ivm that makes some smaller optimizations
> on non-x86 platforms...
Yet another thing not to worry about then :-)
Ronald
>
> -bob
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 2157 bytes
Desc: not available
Url : http://mail.python.org/pipermail/pythonmac-sig/attachments/20060205/c6523fa3/attachment-0001.bin
More information about the Pythonmac-SIG
mailing list