#!/bin/sh
set -x
TRANSLATE_ARCH="sed -e s/ppc/powerpc/ -e s/i386/i686/ -e s/ppc64/powerpc64/"
TRANSLATE_TARGETS="sed -e s/ppc/powerpc/ -e s/i386/i686/ -e s/armv4t/arm/ \
-e s/armv6/arm/ -e s/x86_64// -e s/powerpc64// -e s/ppc64//"
HOSTS=`echo $1 | $TRANSLATE_ARCH `
ORIG_TARGETS="$2"
TARGETS=`echo $2 | $TRANSLATE_TARGETS`
CFLAGS="-g -O2 ${RC_NONARCH_CFLAGS/-pipe/}"
BUILD=`arch | $TRANSLATE_ARCH`
ORIG_SRC_DIR="$3"
DEST_ROOT="$4"
DEST_DIR="$5"
DIR=`pwd`
VERS=`sed -n -e '/version_string/s/.*\"\([^ \"]*\)[ \"].*/\1/p' \
< $ORIG_SRC_DIR/gcc/version.c || exit 1`
# This isn't a parameter either, it's the major version of the compiler
# to be built. It's VERS but only up to the second '.' (if there is one).
MAJ_VERS=`echo $VERS | sed 's/\([0-9]*\.[0-9]*\)[.-].*/\1/'`
# This is the default architecture for i386 configurations.
I386_CPU="--with-arch=apple --with-tune=generic"
# For ARM, grab all system files from an SDK.
ARM_SYSROOT="/Developer/SDKs/Extra"
ARM_CONFIGFLAGS="--with-sysroot=\"$ARM_SYSROOT\""
LIBSTDCXX_VERSION=4.0.0
DARWIN_VERS=9
if [ x"`file /usr/lib/crt1.o | grep 'architecture ppc64'`" == x ]; then
DARWIN_VERS=7
fi
echo DARWIN_VERS = $DARWIN_VERS
unset CC
SRC_DIR=$DIR/src
rm -rf $SRC_DIR || exit 1
mkdir $SRC_DIR || exit 1
ln -s $ORIG_SRC_DIR/* $SRC_DIR/ || exit 1
rm -rf $SRC_DIR/tcl $SRC_DIR/expect $SRC_DIR/dejagnu || exit 1
rm -rf $SRC_DIR/libstdc++-v3 || exit 1
rm -f /usr/lib/gcc/*/4.0.0/specs
CONFIGFLAGS="--disable-checking -enable-werror \
--prefix=$DEST_ROOT \
--mandir=\${prefix}/share/man \
--enable-languages=c,objc,c++,obj-c++ \
--program-transform-name=/^[cg][^.-]*$/s/$/-$MAJ_VERS/ \
--with-gxx-include-dir=\${prefix}/include/c++/$LIBSTDCXX_VERSION \
--with-slibdir=/usr/lib \
--build=$BUILD-apple-darwin$DARWIN_VERS"
SYSCTL=`sysctl -n hw.activecpu`
if [ -z "$SYSCTL" ]; then
SYSCTL=`sysctl -n hw.ncpu`
fi
if [ -z "$SYSCTL" ]; then
SYSCTL=2
fi
MAKEFLAGS=${LOCAL_MAKEFLAGS-"-j $SYSCTL"}
rm -rf $DIR/bin || exit 1
mkdir $DIR/bin || exit 1
for prog in ar nm ranlib strip lipo ; do
for t in `echo $TARGETS $HOSTS | sort -u`; do
P=$DIR/bin/${t}-apple-darwin$DARWIN_VERS-${prog}
echo ' echo 'exec /usr/bin/'${prog}' $*' >> $P || exit 1
chmod a+x $P || exit 1
done
done
for t in `echo $1 $2 | sort -u`; do
gt=`echo $t | $TRANSLATE_ARCH`
P=$DIR/bin/${gt}-apple-darwin$DARWIN_VERS-as
echo ' echo 'exec /usr/bin/as -arch '${t}' $*' >> $P || exit 1
chmod a+x $P || exit 1
done
PATH=$DIR/bin:$PATH
for t in `echo $TARGETS $HOSTS | sort -u`; do
if [ $t != $BUILD ] ; then
mkdir -p $DIR/obj-$BUILD-$t $DIR/dst-$BUILD-$t || exit 1
cd $DIR/obj-$BUILD-$t || exit 1
if [ \! -f Makefile ]; then
$SRC_DIR/configure $CONFIGFLAGS --enable-werror-always \
`if [ $t = i686 ] ; then echo $I386_CPU ; fi` \
`if [ $t = 'arm' ] ; then echo $ARM_CONFIGFLAGS ; fi` \
--with-slibdir=$DEST_ROOT/lib \
--program-prefix=$t-apple-darwin$DARWIN_VERS- \
--host=$BUILD-apple-darwin$DARWIN_VERS --target=$t-apple-darwin$DARWIN_VERS || exit 1
fi
make $MAKEFLAGS all CFLAGS="$CFLAGS" CXXFLAGS="$CFLAGS" || exit 1
make $MAKEFLAGS DESTDIR=$DIR/dst-$BUILD-$t install-gcc install-target \
CFLAGS="$CFLAGS" CXXFLAGS="$CFLAGS" || exit 1
PATH=$DIR/dst-$BUILD-$t/usr/bin:$PATH
fi
done
cd $DEST_DIR || exit 1
rm -rf * || exit 1
SHARED_LIBS="libgcc_s.1.dylib libgcc_s_v6.1.dylib libgcc_s.10.4.dylib libgcc_s.10.5.dylib"
cd $DEST_DIR || exit 1
mkdir -p .$DEST_ROOT/lib
for l in $SHARED_LIBS ; do
CANDIDATES=()
for t in $TARGETS ; do
if [ -e $DIR/dst-$t-$t$DEST_ROOT/lib/$l ] ; then
CANDIDATES[${ else
if [ -e $DIR/dst-$BUILD-$t$DEST_ROOT/lib/$l ] ; then
CANDIDATES[${ fi
fi
done
if [ ${ if [ -L ${CANDIDATES[0]} ] ; then
ln -s `readlink ${CANDIDATES[0]}` .$DEST_ROOT/lib/$l || exit 1
else
lipo -output .$DEST_ROOT/lib/$l -create "${CANDIDATES[@]}" || exit 1
fi
if ! file .$DEST_ROOT/lib/$l | grep stub > /dev/null ; then
strip -x .$DEST_ROOT/lib/$l || exit 1
fi
fi
done
for t in $ORIG_TARGETS ; do
if [ $t = 'armv6' ] ; then
INCLUDE_ARMV6='yes'
elif [ $t = 'armv4t' ] ; then
INCLUDE_ARMV4='yes'
fi
done
for l in $SHARED_LIBS ; do
if [ -f .$DEST_ROOT/lib/$l ] ; then
if [ "$INCLUDE_ARMV4" = 'yes' ] && [ "$INCLUDE_ARMV6" != 'yes' ] ; then
lipo -thin arm .$DEST_ROOT/lib/$l -output .$DEST_ROOT/lib/$l
elif [ "$INCLUDE_ARMV6" = 'yes' ] && [ "$INCLUDE_ARMV4" != 'yes' ] ; then
lipo -thin armv6 .$DEST_ROOT/lib/$l -output .$DEST_ROOT/lib/$l
fi
fi
done
exit 0