# Written but not copyrighted by Lasse Collin <lasse.collin@tukaani.org>.
# Thanks to Slackware, Linux from Scratch and Do It Yourself Linux.
#
# You may want to copy libstdc++.so.5 from Slackware's gcc-g++-3.3.6
# to gcc-solibs. There are still quite a few C++ apps that are linked
# against the old C++ library.

# NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
# Use a custom TMP directory, which a non-root user will be unable to
# create later! I think that this shouldn't be needed anymore, because we
# fix the .la files, but better safe than sorry.
TMP=/home/gcc-$(mcookie)-$RANDOM

NAME=(gcc  gcc-g++  gcc-objc  gcc-gfortran  gcc-gnat  gcc-java  gcc-solibs  gcc-objc++)
VERSION=4.1.2
SOURCE=$MIRROR_GNU/gcc/gcc-$VERSION/gcc-$VERSION.tar.bz2
SOURCE_SHA1=7981b8d1b58b10ddfd7d5142eab16352d9206f3b
PATCH=gcc.with-tune.patch.gz
PATCH_SHA1=42c9551b1dfc25824312a659e37b8a7f4d10caca
BUILD=1
ROOT_REQUIRED=1

# Set version for all the subpackages:
VERSION=($VERSION  $VERSION  $VERSION  $VERSION  $VERSION  $VERSION  $VERSION  $VERSION)


build() {
	# These optimazations are tested only on 32-bit x86 already
	# running GNU/Linux. It is safe to comment these out.
	# - No debugging symbols (removed -g).
	# - Use appropriate -march and -mtune.
	# - Add -pipe.
	# - There should be no other differences compared to default flags.
	#   The -fomit-frame-pointer is also in the default flags
	#   although it is not mentioned in INSTALL/build.html.
	_cflags -O2 -pipe
	export LIBCFLAGS=$CFLAGS
	export LIBCXXFLAGS="$CXXFLAGS -fno-implicit-templates"
	export BOOT_CFLAGS="$CFLAGS -fomit-frame-pointer"

	_explode 0
	cd gcc-$VERSION
	
	# Do not install libiberty, we use the one from binutils.
	sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in

	# Skip running fixincludes. Running fixincludes is generally
	# a good thing (that's why they implemented it;) but because
	# we are building a GCC package which will be distributed, we
	# don't want to include semi-random header files which
	# may get old later.
	sed -i 's@\./fixinc\.sh@-c true@' gcc/Makefile.in
	
	# Fix broken --with-tune and --with-cpu flags. Seems that they
	# didn't backport the fix to 4.1 branch. :-(
	_patch 0 -p1

	# Build in a separate directory
	cd ..
	mkdir gcc-build
	cd gcc-build
	# Notes about configure options:
	# --libexecdir=$LIBDIR      According to Debian, $PREFIX/libexec
	#                           is FHS incompatible. It is this way
	#                           in quite a few other distros.
	# --enable-clocale=gnu      Quote from Linux from Scratch:
	#                           "This option ensures the correct locale
	#                           model is selected for the C++ libraries
	#                           under all circumstances."
	# --enable-languages=c,c++,objc,obj-c++,fortran,ada,java
	#                           Without this, Ada and Obj-C++
	#                           won't get built. Treelang is skipped.
	# --with-arch=i586          Use -march=i586 by default.
	# --with-tune=i686          Use -mtune=i686 by default.
	../gcc-$VERSION/configure \
		--prefix=$PREFIX \
		--libdir=$LIBDIR \
		--infodir=$INFODIR \
		--mandir=$MANDIR \
		--libexecdir=$LIBDIR \
		--enable-shared \
		--enable-threads=posix \
		--enable-languages=c,c++,objc,obj-c++,fortran,ada,java \
		--enable-__cxa_atexit \
		--disable-checking \
		--with-system-zlib \
		--enable-clocale=gnu \
		--build=$CONFIGURE_TRIPLET \
		--host=$CONFIGURE_TRIPLET \
		--target=$CONFIGURE_TRIPLET \
		--with-arch=i586 \
		--with-tune=i686
	# BOOT_CFLAGS needs to be overriden on make command line.
	make BOOT_CFLAGS="$BOOT_CFLAGS" bootstrap-lean

	# Install into package directory.
	make DESTDIR=$PKG install

	# Some (ancient?) packs expect cpp to be in /lib.
	mkdir -p $PKG/lib
	ln -s $BINDIR/cpp $PKG/lib/cpp

	# Slackware chmods libgcc_s.so.1 to 0755, but I don't know why,
	# maybe it looks more consistent if all libs are 0755. Other
	# distros seem to leave it to 0644.
	#chmod 0755 $PKG$LIBDIR/libgcc_s.so.1

	# Get rid of build paths in *.la files. We definitely do not want
	# them to be left in the final packages.
	sed -i "s|-L$TMP[^ ]* | |g" $PKG$LIBDIR/*.la

	# Convert hardlinks to symlinks:
	cd $PKG$BINDIR
	rm -f cc c++ $CONFIGURE_TRIPLET-*
	ln -sf gcc cc
	ln -sf g++ c++
	ln -sf gcc $CONFIGURE_TRIPLET-gcc
	ln -sf gcc $CONFIGURE_TRIPLET-gcc-$VERSION
	ln -sf g++ $CONFIGURE_TRIPLET-c++
	ln -sf g++ $CONFIGURE_TRIPLET-g++
	ln -sf gfortran $CONFIGURE_TRIPLET-gfortran
	ln -sf gcj $CONFIGURE_TRIPLET-gcj
	ln -sf gcjh $CONFIGURE_TRIPLET-gcjh
	cd $TMP/gcc-$VERSION

	
	# Time for the boring part. Split GCC into smaller packages.
	# To $DOCDIR we put less stuff than what Slackware has.

	GCCLIB=$LIBDIR/gcc/$CONFIGURE_TRIPLET/$VERSION
	for I in ${PKG[@]}; do
		mkdir -p \
			$I$BINDIR \
			$I$GCCLIB/include \
			$I$INCLUDEDIR \
			$I$DATADIR \
			$I$INFODIR \
			$I$MANDIR/man1
	done
	
	# gcc
	# - other docs
	_doc 0 gcc-$VERSION \
			bugs.html faq.html \
			MAINTAINERS SERVICE gcc/README.Portability
	# There are excellent docs online, but we are not including
	# them in the packages, because nowadays most users are only
	# compiling source code, not writing it themselves.
	echo 'http://gcc.gnu.org/onlinedocs/' > $PKG$DOCDIR/gcc-$VERSION/README.onlinedocs

	# gcc-g++
	# - binaries with symlinks pointing to them
	mv $PKG$BINDIR/*++* ${PKG[1]}$BINDIR
	mv $PKG$GCCLIB/cc1plus ${PKG[1]}$GCCLIB
	# - static C++ libs
	mv $PKG$LIBDIR/lib*++.{a,la} ${PKG[1]}$LIBDIR
	# - C++ headers, including the huge precompiled headers
	mv $PKG$INCLUDEDIR/c++ ${PKG[1]}$INCLUDEDIR
	# - man page
	mv $PKG$MANDIR/man1/g++.1 ${PKG[1]}$MANDIR/man1
	
	# gcc-objc
	# - binaries
	mv $PKG$GCCLIB/cc1obj ${PKG[2]}$GCCLIB
	# - static libs
	mv $PKG$LIBDIR/libobjc.{a,la} ${PKG[2]}$LIBDIR
	# - headers
	mv $PKG$GCCLIB/include/objc ${PKG[2]}$GCCLIB/include

	# gcc-objc++
	# - binaries
	mv $PKG$GCCLIB/cc1objplus ${PKG[7]}$GCCLIB

	# gcc-gfortran
	# - binaries
	mv $PKG$BINDIR/*fortran* ${PKG[3]}$BINDIR
	mv $PKG$GCCLIB/f* ${PKG[3]}$GCCLIB
	# - static libraries
	mv $PKG$LIBDIR/libgfortran*.{a,la} ${PKG[3]}$LIBDIR
	# - info and man pages
	mv $PKG$INFODIR/gfortran.info ${PKG[3]}$INFODIR
	mv $PKG$MANDIR/man1/gfortran.1 ${PKG[3]}$MANDIR/man1

	# gcc-gnat
	# - binaries
	mv $PKG$BINDIR/{gpr*,gnat*} ${PKG[4]}$BINDIR
	mv $PKG$GCCLIB/gnat1 ${PKG[4]}$GCCLIB
	# - headers & libs
	mv $PKG$GCCLIB/ada{include,lib} ${PKG[4]}$GCCLIB
	# - info files (no man pages)
	mv $PKG$INFODIR/gnat* ${PKG[4]}$INFODIR

	# gcc-java
	# - binaries (*[jr]* matches correct files...)
	mv $PKG$BINDIR/*[jr]* ${PKG[5]}$BINDIR
	mv $PKG$GCCLIB/{jc1,jvgenmain} ${PKG[5]}$GCCLIB
	# - libraries (both shared and static)
	mv $PKG$LIBDIR/{pkgconfig,security,classpath,"gcj-$VERSION",libgcj*,libgij*,logging.properties} ${PKG[5]}$LIBDIR
	# - arch independent data
	mv $PKG$DATADIR/java ${PKG[5]}$DATADIR
	# - headers (some went to g++ pack...)
	mv $PKG$GCCLIB/include/{gcj,j*} ${PKG[5]}$GCCLIB/include
	mkdir -p ${PKG[5]}$INCLUDEDIR/c++/$VERSION
	mv ${PKG[1]}$INCLUDEDIR/c++/$VERSION/{gcj,gnu,java,javax,org} \
			${PKG[5]}$INCLUDEDIR/c++/$VERSION
	# - info and man pages
	mv $PKG$INFODIR/*j* ${PKG[5]}$INFODIR
	mv $PKG$MANDIR/man1/*[jr]* ${PKG[5]}$MANDIR/man1
	# - other docs
	_doc 5 gcc-$VERSION/libjava libjava/{LIBGCJ_LICENSE,THANKS}
	cp -a libjava/classpath/LICENSE ${PKG[5]}$DOCDIR/gcc-$VERSION/libjava/CLASSPATH_LICENSE
	# - i18n
	for I in $(find $PKG$DATADIR/locale -name 'libgcj.mo'); do
		J=${PKG[5]}${I#"$PKG"}
		J=${J%/*}
		mkdir -p $J
		mv $I $J
	done
	# Add symlink to fastjar. Some packages expect this (e.g. GNU libidn).
	ln -s fastjar ${PKG[5]}$BINDIR/jar

	# gcc-solibs
	# - shared libs to run C++, Obj-C and Fortran apps
	# - their i18 files
	# - Java stuff is too big to be included here :(
	# - license stuff
	mv $PKG$LIBDIR/lib*.so* ${PKG[6]}$LIBDIR
	for I in $(find $PKG$DATADIR/locale -name 'lib*.mo'); do
		J=${PKG[6]}${I#"$PKG"}
		J=${J%/*}
		mkdir -p $J
		mv $I $J
	done
	_doc 6 gcc-$VERSION  COPYING COPYING.LIB
	_doc 6 gcc-$VERSION/libffi  libffi/{LICENSE,README}

	# Some empty directories have been left, remove them.
	_rm_empty_dirs

	_chfix
	_chgrp_bin
}
