#!/bin/sh

#
# Please change the following macros to your paths.
#

GNU_TARGET_NAME=arm-linux

TOP_DIR=`pwd`
BUILD_DIR=$TOP_DIR/build
STAGING_DIR=$TOP_DIR/$GNU_TARGET_NAME
SOURCE_DIR=$TOP_DIR
ROOT_DIR=$TOP_DIR/rootfs

KERNEL=$HOME/embedded/linux-2.4.18-rmk7-ptx3
HOST=
HOSTCC=gcc


# ----------------------------------------------------------------------------
# There should be nothing to configure below this line

#
# Check if everything is there
#
echo -n "check if sources are available..."
mkdir -p $BUILD_DIR
if [ "$KERNEL" = "" -o ! -f "$KERNEL/Documentation/arm/README" ]; then
  echo "You haven't changed KERNEL to point at a valid kernel tree"
  exit 1
fi
if [ ! -f $SOURCE_DIR/binutils-2.11.2.tar.gz ]; then
  echo Binutils 2.11.2 seems to be missing
  exit 1
fi
if [ ! -f $SOURCE_DIR/gcc-2.95.3.tar.gz ]; then
  echo GCC 2.95.3 seems to be missing
  exit 1
fi
if [ ! -f $SOURCE_DIR/gcc-2.95.3.diff.bz2 ]; then
  echo GCC 2.95.3 diff seems to be missing
  exit 1
fi
echo "done"

#
# binutils
#
echo -n "binutils..."
[ -d $BUILD_DIR/binutils-2.11.2 ] || {
	echo -n "extracting..."
	cd $BUILD_DIR
	tar zxf $SOURCE_DIR/binutils-2.11.2.tar.gz
	cd binutils-2.11.2
	./configure 				\
		--disable-shared 		\
		--target=arm-linux		\
		--prefix=$STAGING_DIR		\
		--enable-targets=arm-linux
	make 
	make install
}
echo "done"

#
# Copy header files to $STAGING_DIR
#
echo -n "copying header files..."
[ -d $STAGING_DIR/asm-arm/include ] || {
	mkdir -p $STAGING_DIR/asm-arm/include
	cp -dR $KERNEL/include/asm-arm $STAGING_DIR/asm-arm/include
	cp -dR $KERNEL/include/asm     $STAGING_DIR/asm-arm/include
	cp -dR $KERNEL/include/linux   $STAGING_DIR/asm-arm/include
}
echo "done"


#
# gcc
#
echo -n "gcc..."
[ -d $BUILD_DIR/gcc-2.95.3 ] || {
	echo -n "extracting..."
	cd $BUILD_DIR
	tar zxf $SOURCE_DIR/gcc-2.95.3.tar.gz
	cd gcc-2.95.3
	echo -n "patching..."
	bzcat $SOURCE_DIR/gcc-2.95.3.diff.bz2 | patch -p1
	# hack to build gcc without glibc
	perl -pi -e 's/^(TARGET_LIBGCC2_CFLAGS.*)/$1 -Dinhibit_libc -D__gthr_posix_h/' gcc/config/arm/t-linux
}
echo "done"

# gcc stage 1
echo -n "gcc-stage 1..."
[ -d $BUILD_DIR/gcc-2.95.3-stage1-obj ] || {
	mkdir $BUILD_DIR/gcc-2.95.3-stage1-obj
	cd $BUILD_DIR/gcc-2.95.3-stage1-obj
	PATH=$PATH:$STAGING_DIR/bin 					\
	AR=$GNU_TARGET_NAME-ar						\
	RANLIB=$GNU_TARGET_NAME-ranlib					\
	CC=$HOSTCC							\
	../gcc-2.95.3/configure 					\
	  --target=$GNU_TARGET_NAME	 				\
	  --prefix=$STAGING_DIR	 					\
	  --enable-target-optspace					\
	  --disable-nls							\
	  --with-gnu-ld							\
	  --disable-shared						\
	  --enable-languages=c						\
	  --with-headers=$KERNEL/include
	PATH=$PATH:$STAGING_DIR/bin make
	PATH=$PATH:$STAGING_DIR/bin make install
}
echo "done"

# glibc-cross
GLIBC=glibc-2.2.5
GLIBC_LINUXTHREADS=glibc-linuxthreads-2.2.5
echo -n "glibc..."
[ -d $BUILD_DIR/$GLIBC ] || {
	cd $BUILD_DIR
	gzip -dc $SOURCE_DIR/$GLIBC.tar.gz | tar -xf -
	cd $BUILD_DIR/$GLIBC
	gzip -dc $SOURCE_DIR/$GLIBC_LINUXTHREADS.tar.gz | tar -xf -
	gzip -dc $SOURCE_DIR/glibc-2.2.5-ptx1.diff.gz | patch -p1 
	rm -f sysdeps/unix/sysv/linux/configure
	cd $BUILD_DIR
	mkdir $GLIBC-obj	
	cd $GLIBC-obj
	PATH=$PATH:$STAGING_DIR/bin 					\
	AR=$GNU_TARGET_NAME-ar						\
	RANLIB=$GNU_TARGET_NAME-ranlib					\
	CC=$GNU_TARGET_NAME-gcc						\
	../$GLIBC/configure arm-linux 					\
	  --build=i686-linux						\
	  --target=arm-linux 						\
	  --prefix=$STAGING_DIR						\
	  --enable-add-ons						\
	  --disable-sanity-checks
	PATH=$PATH:$STAGING_DIR/bin make
	PATH=$PATH:$STAGING_DIR/bin make install
}
echo "done"

# ld.so from glibc-cross: needs to be configured differently for the 
# target system (because of other paths)
echo -n "ld.so..."
[ -d $BUILD_DIR/$GLIBC-ldso ] || {
	mkdir $BUILD_DIR/$GLIBC-ldso
	cd $BUILD_DIR/$GLIBC-ldso
	PATH=$PATH:$STAGING_DIR/bin 					\
	AR=$GNU_TARGET_NAME-ar						\
	RANLIB=$GNU_TARGET_NAME-ranlib					\
	CC=$GNU_TARGET_NAME-gcc						\
	../$GLIBC/configure arm-linux 					\
	  --build=i686-linux						\
	  --target=arm-linux 						\
	  --prefix=							\
	  --enable-add-ons						\
	  --disable-sanity-checks
	PATH=$PATH:$STAGING_DIR/bin make
	# CAREFUL: don't never ever make install here!!!
	cp elf/ld.so $ROOT_DIR/lib/ld-linux.so.2
}
echo "done"

# gcc stage 2
echo -n "gcc-stage 2..."
[ -d $BUILD_DIR/gcc-2.95.3-stage2-obj ] || {
	mkdir $BUILD_DIR/gcc-2.95.3-stage2-obj
	cd $BUILD_DIR/gcc-2.95.3
	# remove glibc header hack
	perl -pi -e 's/^(TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC).*/$1/' gcc/config/arm/t-linux
#	perl -pi -e 's/(^T_CFLAGS =.*)//' gcc/config/arm/t-linux
	cd $BUILD_DIR/gcc-2.95.3-stage2-obj
        PATH=$PATH:$STAGING_DIR/bin					\
        AR=$GNU_TARGET_NAME-ar						\
        RANLIB=$GNU_TARGET_NAME-ranlib					\
        CC=$HOSTCC							\
	../gcc-2.95.3/configure 					\
	  --target=$GNU_TARGET_NAME					\
	  --prefix=$STAGING_DIR						\
	  --enable-target-optspace					\
	  --disable-nls							\
	  --with-gnu-ld							\
	  --disable-shared						\
	  --enable-languages="c,c++"					\
	  --with-headers=$KERNEL/include				\
	  --with-headers=$STAGING_DIR/include				\
	  --with-libs=$STAGING_DIR/lib
	PATH=$PATH:$STAGING_DIR/bin make
	PATH=$PATH:$STAGING_DIR/bin make install
}
echo "done"

