[Pythonmac-SIG] building universal binaries

Ronald Oussoren ronaldoussoren at mac.com
Sat Feb 4 09:32:35 CET 2006


On 3-feb-2006, at 20:51, Bob Ippolito wrote:

>>>
>>> Since this is GCC, the #ifndef __LITTLE_ENDIAN__ branch is always  
>>> false... so I'm making this a compile-time not configure-time  
>>> value, but I left in the configure-time stuff for other platforms.
>>
>> Did you test this? I'd be surprised if distutils honours the ifdef  
>> statement. Luckily the easiest way to find the byteorder is  
>> sys.byteorder.
>
> Yes, I ran the test suite on PPC with a PPC-built build and on i386  
> with and without Rosetta on a i386 build... I didn't test the PPC- 
> built version on an i386, but I'm going to assume it works for now  
> since the two possible outputs above are logically equivalent.

I meant fetching WORDS_BIGENDIAN using distutils :-). Not that I  
think anyone actually does this. I had no doubt about your trick  
w.r.t. building python or extensions.

>
> distutils does know how to parse and find pyconfig.h  
> (sysconfig.parse_config_h, get_config_h_filename), but Python  
> itself only uses that functionality in the main setup.py.   
> Surprisingly, the main setup.py parses pyconfig.h twice (once with  
> distutils, once without -- good job there), but it of course  
> doesn't go anywhere near WORDS_BIGENDIAN.
>
> Packages that use WORDS_BIGENDIAN from distutils are broken.   
> There's nothing we can do to fix that short of patching the  
> package.  Fortunately I don't think any package is dumb enough to  
> do that.

We could patch distutils to derive WORDS_BIGENDIAN from sys.byteorder.

>
> Packages that do something with sys.byteorder at setup.py time are  
> probably going to be broken also... but I've never seen that either.

These are not broken, its just harder to create universal binaries  
for them. I know that cElementTree uses sys.byteorder to calculate  
the right flags for compiling expat and wouldn't be surprised if  
other packages that wrap expat use the same mechanism.

>
>> I have a patched version of pyconfig.h that #includes "macosx- 
>> config.h" at the end. This file redefines a number of values based  
>> on the cpu-type. Anyone that grabs CPU information from pyconfig.h  
>> will get the values from the platform that was used to generate  
>> pyconfig.h (an intel system in my case). I like your trick better,  
>> mine is a bit too elaborate and not needed until someone wants to  
>> do a ppc64 build.
>
> sys.byteorder is actually determined at runtime:
>
>         unsigned long number = 1;
>         char *value;
>
>         s = (char *) &number;
>         if (s[0] == 0)
>             value = "big";
>         else
>             value = "little";
>         PyDict_SetItemString(sysdict, "byteorder",
>                      v = PyString_FromString(value));
>         Py_XDECREF(v);

I know that. I've looked into eliminating WORDS_BIGENDIAN and the  
SIZEOF_* defines and decided this was a bit too much work for now.  
Odly enough WORDS_BIGENDIAN is used elsewhere in the sourcecode, not  
using that define here just complicates the code.

Ronald

-------------- 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/20060204/13d042b7/attachment.bin 


More information about the Pythonmac-SIG mailing list