build glib2 universal binary on PPC

Ryan Schmidt ryandesign at macports.org
Mon Mar 5 22:52:50 PST 2007


On Mar 5, 2007, at 23:06, Isaac Huang wrote:

> On 3/6/07, Ryan Schmidt wrote:
>
>> On Mar 5, 2007, at 06:15, Isaac Huang wrote:
>>
>> > The glib2 configure script makes conclusions about endianness and
>> > atomic operations from host cpu type, and generates headers with  
>> such
>> > assumptions inside. I've searched this list and someone said glib2
>> > needed a patch for this. But I couldn't find this patch, and I also
>> > lack enough knowledge about glib2 to fix it myself.

>> When I was researching how to compile glib2 universal, I found these
>> instructions:
>>
>> http://code.google.com/p/macfuse/wiki/HOWTO
>>
>> Specifically this part:
>>
>> > If you are on a PowerPC Macintosh, comment out one line in
>> > config.h: // #define G_ATOMIC_POWERPC 1
>
> I found this too, but I don't think that's sufficient because there's
> still the endianness problem. In glibconfig.h for ppc we should have:
> ......
> #define GLONG_TO_BE(val)        ((glong) GINT32_TO_BE (val))
> #define GULONG_TO_BE(val)       ((gulong) GUINT32_TO_BE (val))
> #define GINT_TO_LE(val)         ((gint) GINT32_TO_LE (val))
> #define GUINT_TO_LE(val)        ((guint) GUINT32_TO_LE (val))
> #define GINT_TO_BE(val)         ((gint) GINT32_TO_BE (val))
> #define GUINT_TO_BE(val)        ((guint) GUINT32_TO_BE (val))
> #define G_BYTE_ORDER G_BIG_ENDIAN
>
> If we just get rid of G_ATOMIC_POWERPC, glib2 compiles OK on ppc, but
> the resulting  glibconfig.h will assume G_BIG_ENDIAN which won't work
> for compiling for i386.
>
> Furthermore, I've discovered this weird thing with glib2 configure
> script on my ppc:
> ppc/glib-2.12.9 [1044:1]% CFLAGS='-I/opt/local/include'
> LDFLAGS='-L/opt/local/lib' ./configure
> ......
> checking whether byte ordering is bigendian... yes
> ......
>
> Which is correct, _but_:
> CFLAGS="-O3 -funroll-loops -fstrict-aliasing -I/opt/local/include
> -arch ppc -arch i386 -isysroot /Developer/SDKs/MacOSX10.4u.sdk"
> LDFLAGS="-L/opt/local/lib -arch ppc -arch i386  -isysroot
> /Developer/SDKs/MacOSX10.4u.sdk" ./configure --prefix=/usr/local
> --disable-dependency-tracking
> ......
> checking whether byte ordering is bigendian... no
> ......
>
> So whenever "-arch ppc -arch i386" is specified the configure script
> believes that my ppc iBook isn't bigendian - glib2 still builds OK,
> but some programs will definitely break.

Could someone please try to contact this "asingh" then, who wrote the  
glib2 universal installation instructions I posted above from the  
MacFUSE project? I surely don't know what I'm doing, but I assumed  
asingh did.

If "some programs will definitely break," which ones? Do we know of  
any at all? Can someone construct a sample program that will  
demonstrate the failure? I am not a C programmer so I cannot, I would  
just like to see proof that this very simple solution to making the  
universal binary does not work before we embark on a very complicated  
one.


If we're going to be serious about this universal binary business,  
then we will most likely need support within MacPorts for running  
through configure and make multiple times for multiple architectures  
and lipo-ing the result together before make install; it's silly for  
each port that needs it to have to engineer that logic. (Even if we  
get glib2 compiling universal without lipo, there will be other ports  
that still need it).


I have also already investigated compiling a universal binary of  
glib2 twice, once for each arch, and using lipo to combine:

- When cross-compiling glib2 for another architecture (as opposed to  
when building a universal binary, or only a platform-native binary),  
it requires a platform-native copy of glib-genmarshal to exist. So  
that's fun.

- When cross-compiling, autoconf cannot determine a few values, but  
you can supply ./configure with a config.cache file which specifies  
those few values:

glib_cv_stack_grows=${glib_cv_stack_grows=no}
glib_cv_uscore=${glib_cv_uscore=no}
ac_cv_func_posix_getpwuid_r=${ac_cv_func_posix_getpwuid_r=yes}

- I do not know if the endianness issues still remain.





More information about the macports-dev mailing list