Hi Tom!

Am 09.04.2006 um 04:34 schrieb Tom Lane:

Philipp Ott <[EMAIL PROTECTED]> 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

---------------------------(end of broadcast)---------------------------
TIP 2: Don't 'kill -9' the postmaster

Reply via email to