#!/bin/sh

# COMPILE-go32
# Compile a C and C++ cross-compiler for go32 MS-DOS binaries under Linux.
# (C) Uwe Girlich
# 18 August 1999

set -e
set -x

# This is my private prefix.
PREFIX=/usr/self/go32
# I did it with this version.
EGCS_VER=1.1.2
GCC_VERSION=egcs-2.91.66
BINUTILS_VER=2.9.4.0.7

# Put all necessary files (egcs,binutils,djcrx201.zip)
# in a directory.
ARCHIVE_DIR=/rest/files/linux/gcc
BINUTILS_FILE=$ARCHIVE_DIR/binutils-${BINUTILS_VER}.tar.bz2
EGCS_FILE=$ARCHIVE_DIR/egcs-${EGCS_VER}.tar.bz2
DJCRX_FILE=$ARCHIVE_DIR/djcrx201.zip


# If something went wrong, here you can comment a line to leave 
# some parts of the whole thing out.
MAKE_BINUTILS=yes
CLEAN_BINUTILS=yes
MAKE_DJGPP=yes
CONFIGURE_EGCS=yes
MAKE_EGCS_CC=yes
MAKE_EGCS_CPP=yes
CLEAN_EGCS=yes


# You should not change anything below.
BINUTILS_ARCH=i386-coff-go32
EGCS_ARCH=i386-go32-msdos
ARCH=$EGCS_ARCH

CC_FOR_BUILD=gcc
CFLAGS_FOR_BUILD="-O3 -m486"
BASE=`pwd`



##############################################################################
if [ $MAKE_BINUTILS ]; then

	cd $BASE
	bzip2 -dc $BINUTILS_FILE | tar xvf -
	cd binutils-${BINUTILS_VER}
	env CC=$CC_FOR_BUILD ./configure --target=$BINUTILS_ARCH \
		--prefix=$PREFIX
	make CFLAGS="$CFLAGS_FOR_BUILD"

	mkdir -p $PREFIX/$ARCH/bin
	cd binutils
	cp addr2line ar c++filt objcopy objdump ranlib size strings \
		$PREFIX/$ARCH/bin
	cp nm-new $PREFIX/$ARCH/bin/nm
	cp strip-new $PREFIX/$ARCH/bin/strip
	cd ../gas
	cp as-new $PREFIX/$ARCH/bin/as
	cp gasp-new $PREFIX/$ARCH/bin/gasp
	cd ../ld
	cp ld-new $PREFIX/$ARCH/bin/ld

	cd $PREFIX/$ARCH/bin
	strip addr2line ar c++filt objcopy objdump ranlib size strings nm \
		strip as gasp ld

fi # MAKE_BINUTILS -----------------------------------------------------------



##############################################################################
if [ $CLEAN_BINUTILS ]; then

	cd $BASE
	rm -rf binutils-${BINUTILS_VER}

fi # CLEAN_BINUTILS ----------------------------------------------------------



##############################################################################
if [ $MAKE_DJGPP ]; then

	mkdir -p $PREFIX/djgpp
	cd $PREFIX/djgpp
	unzip -a $DJCRX_FILE
	cd lib
	cd $PREFIX/djgpp/src/stub
	$CC_FOR_BUILD -s $CFLAGS_FOR_BUILD -o stubify stubify.c
	mkdir -p $PREFIX/lib/gcc-lib/$ARCH/$GCC_VERSION
	cp stubify $PREFIX/lib/gcc-lib/$ARCH/$GCC_VERSION
	$CC_FOR_BUILD -s $CFLAGS_FOR_BUILD -o stubedit stubedit.c
	cp stubedit $PREFIX/$ARCH/bin
	cd $PREFIX/lib/gcc-lib/$ARCH/$GCC_VERSION
	mv $PREFIX/djgpp/lib/* .
	if [ -d ./include ]; then
		rm -rf ./include
	fi
	mv $PREFIX/djgpp/include .

	cd $PREFIX
	rm -r djgpp

fi # MAKE_DJGPP --------------------------------------------------------------



##############################################################################
if [ $CONFIGURE_EGCS ]; then

	cd $BASE
	bzip2 -dc $EGCS_FILE | tar xvf -
	cd egcs-${EGCS_VER}/gcc
	env CC="$CC_FOR_BUILD" ./configure --target=$ARCH \
		--prefix=$PREFIX --with-gnu-as --with-gnu-ld
	touch libgcc1.a
	#
	# Patch the config/i386/go32.h file for building libgcc2.a
	#
	cat >go32.diff <<"!EOF!"
--- go32.h.orig	Mon Aug 11 10:57:16 1997
+++ go32.h	Thu Mar 19 17:43:04 1998
@@ -19,6 +19,8 @@
 #define CPP_PREDEFINES "-Dunix -Di386 -DGO32 -DMSDOS \
   -Asystem(unix) -Asystem(msdos) -Acpu(i386) -Amachine(i386)"
 
+#define HAVE_ATEXIT
+
 #undef EXTRA_SECTIONS
 #define EXTRA_SECTIONS in_ctor, in_dtor
!EOF!
	patch config/i386/go32.h <go32.diff

fi # CONFIGURE_EGCS ----------------------------------------------------------



##############################################################################
if [ $MAKE_EGCS_CC ]; then

	cd $BASE/egcs-${EGCS_VER}/gcc
	make LANGUAGES=c CFLAGS="$CFLAGS_FOR_BUILD" CC="$CC_FOR_BUILD" \
		LIBGCC1_TEST=""
	strip xgcc cc1 cccp
	cp xgcc $PREFIX/$ARCH/bin/gcc
	cp cc1 $PREFIX/lib/gcc-lib/$ARCH/$GCC_VERSION
	cp cccp $PREFIX/lib/gcc-lib/$ARCH/$GCC_VERSION/cpp
	mv $PREFIX/lib/gcc-lib/$ARCH/$GCC_VERSION/libgcc.a \
		$PREFIX/lib/gcc-lib/$ARCH/$GCC_VERSION/libgcc-dist.a
	$PREFIX/$ARCH/bin/ranlib libgcc.a
	cp libgcc.a $PREFIX/lib/gcc-lib/$ARCH/$GCC_VERSION

fi # MAKE_EGCS_CC ------------------------------------------------------------



##############################################################################
if [ $MAKE_EGCS_CPP ]; then

	cd $BASE/egcs-${EGCS_VER}/gcc
	make LANGUAGES=c++ CFLAGS="$CFLAGS_FOR_BUILD" CC="$CC_FOR_BUILD" \
		LIBGCC1_TEST=""
	strip g++ cc1plus 
	cp g++ $PREFIX/$ARCH/bin/g++
	cp cc1plus $PREFIX/lib/gcc-lib/$ARCH/$GCC_VERSION

	cd $PREFIX/$ARCH/bin
	ln -sf ar $ARCH-ar
	ln -sf nm $ARCH-nm
	ln -sf ranlib $ARCH-ranlib
	PATH=$PATH:$PREFIX/$ARCH/bin
	export PATH
	cd $BASE/egcs-${EGCS_VER}
	env CC="$CC_FOR_BUILD" ./configure --target=$ARCH --prefix=$PREFIX \
		--with-gnu-as --with-gnu-ld 
	make configure-target-libiberty CFLAGS="$CFLAGS_FOR_BUILD" \
		CC="$CC_FOR_BUILD"
	make configure-target-libio CFLAGS="$CFLAGS_FOR_BUILD" \
		CC="$CC_FOR_BUILD"
	make configure-target-libstdc++ CFLAGS="$CFLAGS_FOR_BUILD" \
		CC="$CC_FOR_BUILD"
	cd $ARCH/libstdc++
	make CFLAGS="$CFLAGS_FOR_BUILD" CC="$CC_FOR_BUILD"
	cp libstdc++.a $PREFIX/lib/gcc-lib/$ARCH/$GCC_VERSION
	cd $PREFIX/$ARCH/bin
	rm $ARCH-ar $ARCH-nm $ARCH-ranlib

fi # MAKE_EGCS_CPP -----------------------------------------------------------



##############################################################################
if [ $CLEAN_EGCS ]; then

	cd $BASE
	rm -rf egcs-${EGCS_VER}

fi # CLEAN_EGCS --------------------------------------------------------------
