Re: "Fat" binaries for OS X (was Re: [GENERAL] Postgres Library natively available for Mac OSX Intel?)

From: Philipp Ott <philipp(dot)ott(at)avalon(dot)at>
To: pgsql-hackers(at)postgreSQL(dot)org
Subject: Re: "Fat" binaries for OS X (was Re: [GENERAL] Postgres Library natively available for Mac OSX Intel?)
Date: 2006-04-09 13:39:52
Message-ID: 8E34E48A-4918-4BE8-99A3-AA0B1830259E@avalon.at
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general pgsql-hackers

Hi Tom!

Am 09.04.2006 um 04:34 schrieb Tom Lane:

> Philipp Ott <philipp(dot)ott(at)avalon(dot)at> writes:
>> Currently 8.1.3 compiles and runs just fine on OSX 10.4.6 + XCode
>> 2.2.1, but generates binaries just for the current host architecture.
>> Now when I add -arch i386 -arch ppc to CFLAGS and LDFLAGS for
>> configure, then it compiles everything just fine, however at linking
>> stage I get various problems for missing architecture files.
>
> [...]
> So what you're seeing is that one of the arches has been dropped from
> the SUBSYS.o files.
>
> Unfortunately, there doesn't seem to be any way to use cc/gcc to
> emulate
> "ld -r", in the sense of just combining multiple fat .o files into one
> fat .o file. At least I couldn't see one after perusing the man page
> for a bit. I also found out that lipo(1) is not by itself smart
> enough
> to do this.
>
> So it looks like you'd have to write a small shell script to do
> what the
> above snippet describes cc as doing. Not out of the question by any
> means, but still a PITA. Any Apple experts around who know a better
> answer? Is Apple likely to improve this situation in the near future?
> [...]

Thank you for the suggestion. I followed your suggestion and came up
with a ldfat script and a change to src/Makefile.global after running
configure. I put my ldfat script into the top_builddir and reference
it in the src/Makefile.global.

So from the download of postgresql-8.1.3.tar.gz I made the following
steps:

tar xzf postgresql-8.1.3.tar.gz
cd postgres-8.1.3
./configure CFLAGS="-arch i386 -arch ppc"

vi src/Makefile.global
....
LD = ${top_builddir}/ldfat
...

And in the postgres top directory I put the following script called
ldfat.

#!/bin/bash

OFILES=""
RELOPT=""
OUTPUT=""
OTHERS=""

while [ "$#" != "0" ];
do
case "$1" in
-r) RELOPT="-r";;
-o) OUTPUT=`basename -s .o "$2"`; shift;;
*.o) OFILES="$OFILES $1";;
*) OTHERS="$OTHERS $1";;
esac
shift
done

if [ "$RELOPT" == "-r" ];
then
echo ldfat $RELOPT -o $OUTPUT $OFILES $OTHERS
`/usr/bin/ld -r -arch i386 -o ${OUTPUT}_i386.o $OFILES $OTHERS`
`/usr/bin/ld -r -arch ppc -o ${OUTPUT}_ppc.o $OFILES $OTHERS`
`lipo -create -output ${OUTPUT}.o ${OUTPUT}_i386.o ${OUTPUT}_ppc.o`
else
echo ld -o $OUTPUT $OFILES $OTHERS
`/usr/bin/ld -o $OUTPUT $OFILES $OTHERS`
fi
exit $?

Now make and sudo make install run fine and in default config put a
working psql (and the rest I think will work too) into /usr/local/
pgsql on my imac. At the moment I just have this Intel iMac around
but I will try this with a PowerPC Mac later and let you know, if the
generated binaries and libraries work on an out-of-the-box OSX.

I vote for an --enable-osxuniversal option to ./configure which adds
"-arch ppc -arch i386" to the CFLAGS and replaces "LD" with a script
solution for the time being, unless an Apple expert has a better
solution at hand. If Apple makes changes to ld later this --enable-
osxuniversal would handle this transparently. However my configure
knowledge is next to non-existant :-) Also I only made a cursory
glance over all Makefiles ${LD} invoctions for calling patterns and
atm it works, however it would need some checking for available
options and errors.

Regards,
Philipp Ott

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Milen Kulev 2006-04-09 13:54:12 "Pg_restore -C" is not creating a database ( Was Create database bug in 8.1.3 ? )
Previous Message Milen Kulev 2006-04-09 13:35:50 Re: Create database bug in 8.1.3 ? -> solved

Browse pgsql-hackers by date

  From Date Subject
Next Message Myron Scott 2006-04-09 15:23:36 Re: Support Parallel Query Execution in Executor
Previous Message Qingqing Zhou 2006-04-09 09:11:18 Re: Support Parallel Query Execution in Executor