#!/bin/bash
#
# GCC package build script (written by volkerdi@slackware.com)
#
# Copyright 2003, 2004  Slackware Linux, Inc., Concord, California, USA
# Copyright 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012  Patrick J. Volkerding, Sebeka, MN, USA
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
#  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
#  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
#  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
#  EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
#  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
#  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
#  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
#  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
#  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
#  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
#
# Modified by Stuart Winter <mozes@slackware.com> for Slackware ARM.
# 30-May-04
# Notes:
# [1] Some parts of the gcc suite do not work for ARM so they are currently
#     missing; this isn't an oversight on my part - they simply don't work! ;-)

ulimit -s unlimited

# Record toolchain & other info for the build log:
slackbuildinfo

# Paths to skeleton port's source & real Slackware source tree:
slackset_var_cwds

# Determine the CFLAGS for the known architectures.  If you specify -mtune=xscale
# for ARM then the build breaks.
# Also disable libspp (Stack Protector) because with gcc 4.2.3, code compiled
# with it tends to segfault.  Unfortunately, many newer releases of sources
# check for -fstack-protector & use it if available; glibc is one of these.
#
#case $ARCH in
#   arm)     # "--with-arch" sets the gcc defaults
#            export ARCH_CONFARGS="--with-arch=armv5te --with-float=soft --disable-werror"  ;;
#   armhf)   export ARCH_CONFARGS="--with-march=armv7-a --disable-werror" ;;
#esac

# We only use the slack-desc files from the Slackware source tree.
#CWD=$SLACKSOURCE/d/gcc
#if [ ! -d "$CWD" ]; then
#   echo "ERROR: Cannot find original Slackware source dir $CWD"
#   echo "       you would miss the slack-desc files."
#   exit 1
#fi
PORTCWD=$PWD

# The new toolchain's name:
# We suffix "gnueabi" to tell gcc that we want to build a compiler that
# builds for the EABI by default.
TARGET=$ARCH-slackware-linux-gnueabi

# Temporary build location.  This should *NOT* be a directory
# path a non-root user could create later...
# grr - this got annoying actually - deleting /gcc-foo -- and
# nobody should have write access to /root.
rm -rf $TMP/build-$PKGNAM*
export TMPBUILD=$TMP/build-$PKGNAM
export PKG=$TMP/package-$PKGNAM
rm -rf $TMP/package-gcc* # clear other gcc named packages
mkpkgdirs # Delete & re-create temporary directories then cd into $TMPBUILD

# Python branch version (e.g. 2.6 , 2.7)  we have installed on the
# system currently:
PYTHONVER=$( python -c 'import sys; print sys.version[:3]' )
echo "Building with Python branch version: $PYTHONVER"

# This is the main DESTDIR target:
PKG1=$TMP/package-gcc
# These are the directories to build other packages in:
PKG2=$TMP/package-gcc-g++
PKG3=$TMP/package-gcc-gfortran
PKG4=$TMP/package-gcc-gnat
PKG5=$TMP/package-gcc-java
PKG6=$TMP/package-gcc-objc
PKG7=$TMP/package-gcc-g++-gch
PKG8=$TMP/package-gcc-go

mkdir -p $PKG{1,2,3,4,5,6,7,8}/install
# Install the descriptions:
( cd $CWD
  install -vpm644 slack-desc.gcc          $PKG1/install/slack-desc
  install -vpm644 slack-desc.gcc-g++      $PKG2/install/slack-desc
  install -vpm644 slack-desc.gcc-gfortran $PKG3/install/slack-desc
  install -vpm644 slack-desc.gcc-gnat     $PKG4/install/slack-desc
  install -vpm644 slack-desc.gcc-java     $PKG5/install/slack-desc
  install -vpm644 slack-desc.gcc-objc     $PKG6/install/slack-desc
#  install -vpm644 slack-desc.gcc-g++-gch $PKG7/install/slack-desc
  install -vpm644 slack-desc.gcc-go       $PKG8/install/slack-desc
)

# Create doc dirs:
mkdir -p $PKG{1,2,3,4,5,6,7,8}/usr/doc/gcc-$VERSION

# Extract source:
echo "Unpacking gcc source..."
tar xf $CWD/gcc-[0-9].[0-9]*.tar.?z || exit 1
# Rename gcc-<version> to 'src' so that the patch utility lets us use
# the Debian patches.  The newer version of patch 2.7.4 (despite having an option
# to allow symlinks) won't follow them.
mv -fv gcc-* src
ln -vfs src gcc-$VERSION
cd gcc-$VERSION || exit 1
slackhousekeeping

##
# If there are any patches that get applied in the x86 SlackBuild, apply
# them here, but note that we're already inside the source dir so we don't
# need to spawn a subshell.

##

# Copy ecj.jar into the TLD of the source. Needed for java compiler.
# This can be retrieved from ftp://sourceware.org/pub/java
install -vpm644 $CWD/ecj-4.9.jar ecj.jar

# If we get libjava errors during the compile, this is because ejc is broken
# as was the case with 4.4.2.
# Renaming it out of the way causes the gcc bootstrapping procedure to
# work around it.
# mv -fv /usr/bin/gjar /usr/bin/gjar.broken

# Use an antlr runtime to compile javadoc.
# The runtime can be obtained from:
#https://oss.sonatype.org/content/repositories/releases/org/antlr/antlr-runtime/
ANTLJAR=$(echo $CWD/antlr-*.jar | tail -1)

#
# Apply Slackware patches:
#

# Smite the fixincludes:
zcat $CWD/gcc-no_fixincludes.diff.gz | patch -p1 --verbose || exit 1

# Add retpoline support for x86.  Most of this is covered in the Debian patch set.
zcat $CWD/0001-i386-Move-struct-ix86_frame-to-machine_function.diff.gz | patch -p2 --verbose || exit 1
zcat $CWD/0002-i386-Use-reference-of-struct-ix86_frame-to-avoid-cop.diff.gz | patch -p2 --verbose || exit 1
zcat $CWD/0003-i386-More-use-reference-of-struct-ix86_frame-to-avoi.diff.gz | patch -p2 --verbose || exit 1
zcat $CWD/0004-i386-Don-t-use-reference-of-struct-ix86_frame.diff.gz | patch -p2 --verbose || exit 1
zcat $CWD/0005-x86-Add-mindirect-branch-doc.diff.gz | patch -p2 --verbose || exit 1
zcat $CWD/0005-x86-Add-mindirect-branch.diff.gz | patch -p2 --verbose || exit 1
zcat $CWD/0006-x86-Add-mfunction-return-doc.diff.gz | patch -p2 --verbose || exit 1
zcat $CWD/0006-x86-Add-mfunction-return.diff.gz | patch -p2 --verbose || exit 1
zcat $CWD/0007-x86-Add-mindirect-branch-register-doc.diff.gz | patch -p2 --verbose || exit 1
zcat $CWD/0007-x86-Add-mindirect-branch-register.diff.gz | patch -p2 --verbose || exit 1
zcat $CWD/0008-x86-Add-V-register-operand-modifier-doc.diff.gz | patch -p2 --verbose || exit 1
zcat $CWD/0008-x86-Add-V-register-operand-modifier.diff.gz | patch -p2 --verbose || exit 1
zcat $CWD/0009-x86-Disallow-mindirect-branch-mfunction-return-with-.diff.gz | patch -p2 --verbose || exit 1
zcat $CWD/0009-x86-Disallow-mindirect-branch-mfunction-return-with-doc.diff.gz | patch -p2 --verbose || exit 1

# install docs
( cd gcc-$VERSION

  mkdir -p $PKG1/usr/doc/gcc-$VERSION
  cp -favv \
    COPYING* ChangeLog* FAQ INSTALL \
    LAST_UPDATED MAINTAINERS NEWS \
    README* *.html \
  $PKG1/usr/doc/gcc-$VERSION

  # We will keep part of these, but they are really big...
  if [ -r ChangeLog ]; then
    DOCSDIR=$(echo $PKG1/usr/doc/gcc-$VERSION)
    cat ChangeLog | head -n 1000 > $DOCSDIR/ChangeLog
    touch -r ChangeLog $DOCSDIR/ChangeLog
  fi
  if [ -r NEWS ]; then
    DOCSDIR=$(echo $PKG1/usr/doc/gcc-$VERSION)
    cat NEWS | head -n 1000 > $DOCSDIR/NEWS
    touch -r NEWS $DOCSDIR/NEWS
  fi


  mkdir -p $PKG1/usr/doc/gcc-${VERSION}/gcc
  ( cd gcc
    cp -favv \
      ABOUT* COPYING* DATESTAMP DEV-PHASE LANG* ONEWS README* SERVICE \
    $PKG1/usr/doc/gcc-$VERSION/gcc

    mkdir -p $PKG3/usr/doc/gcc-${VERSION}/gcc/fortran
    ( cd fortran
      if [ -r ChangeLog ]; then
        cat ChangeLog | head -n 1000 > $PKG3/usr/doc/gcc-$VERSION/gcc/fortran/ChangeLog
        touch -r ChangeLog $PKG3/usr/doc/gcc-$VERSION/gcc/fortran/ChangeLog
      fi
    )

    mkdir -p $PKG4/usr/doc/gcc-${VERSION}/gcc/ada
    ( cd ada
      cp -favv \
         ChangeLog.tree-ssa \
      $PKG4/usr/doc/gcc-$VERSION/gcc/ada
      if [ -r ChangeLog ]; then
        cat ChangeLog | head -n 1000 > $PKG4/usr/doc/gcc-$VERSION/gcc/ada/ChangeLog
        touch -r ChangeLog $PKG4/usr/doc/gcc-$VERSION/gcc/ada/ChangeLog
      fi
    )

    mkdir -p $PKG5/usr/doc/gcc-${VERSION}/gcc/java
    ( cd java
      cp -favv \
        ChangeLog.tree-ssa \
      $PKG5/usr/doc/gcc-${VERSION}/gcc/java
      if [ -r ChangeLog ]; then
        cat ChangeLog | head -n 1000 > $PKG5/usr/doc/gcc-${VERSION}/gcc/java/ChangeLog
        touch -r ChangeLog $PKG5/usr/doc/gcc-${VERSION}/gcc/java/ChangeLog
      fi
    )

    mkdir -p $PKG6/usr/doc/gcc-${VERSION}/gcc/objc
    ( cd objc
      cp -favv \
        README* \
      $PKG6/usr/doc/gcc-${VERSION}/gcc/objc
      if [ -r ChangeLog ]; then
        cat ChangeLog | head -n 1000 > $PKG6/usr/doc/gcc-${VERSION}/gcc/objc/ChangeLog
        touch -r ChangeLog $PKG6/usr/doc/gcc-${VERSION}/gcc/objc/ChangeLog
      fi
    )
  )

    mkdir -p $PKG8/usr/doc/gcc-${VERSION}/gcc/go
    ( cd go
      if [ -r ChangeLog ]; then
        cat ChangeLog | head -n 1000 > $PKG8/usr/doc/gcc-${VERSION}/gcc/go/ChangeLog
        touch -r ChangeLog $PKG8/usr/doc/gcc-${VERSION}/gcc/go/ChangeLog
      fi
      cp -a \
        README* THREADS* \
        gofrontend/{LICENSE,PATENTS,README} \
      $PKG8/usr/doc/gcc-${VERSION}/gcc/go
    )

  mkdir -p $PKG3/usr/doc/gcc-${VERSION}/libgfortran
  ( cd libgfortran
    if [ -r ChangeLog ]; then
      cat ChangeLog | head -n 1000 > $PKG3/usr/doc/gcc-${VERSION}/libgfortran/ChangeLog
      touch -r ChangeLog $PKG3/usr/doc/gcc-${VERSION}/libgfortran/ChangeLog
    fi
  )
 mkdir -p $PKG4/usr/doc/gcc-${VERSION}/libada
  ( cd libada
    if [ -r ChangeLog ]; then
      cat ChangeLog | head -n 1000 > $PKG4/usr/doc/gcc-${VERSION}/libada/ChangeLog
      touch -r ChangeLog $PKG4/usr/doc/gcc-${VERSION}/libada/ChangeLog
    fi
  )

  mkdir -p $PKG5/usr/doc/gcc-${VERSION}/libffi
  ( cd libffi
    cp -favv \
      ChangeLog.libgcj ChangeLog.v1 \
      LICENSE* README* \
    $PKG5/usr/doc/gcc-${VERSION}/libffi
    if [ -r ChangeLog ]; then
      cat ChangeLog | head -n 1000 > $PKG5/usr/doc/gcc-${VERSION}/libffi/ChangeLog
      touch -r ChangeLog $PKG5/usr/doc/gcc-${VERSION}/libffi/ChangeLog
    fi
  )

  mkdir -p $PKG5/usr/doc/gcc-${VERSION}/libjava
  ( cd libjava
    cp -favv \
      COPYING* HACKING LIBGCJ_LICENSE \
      NEWS README* THANKS \
    $PKG5/usr/doc/gcc-${VERSION}/libjava
    if [ -r ChangeLog ]; then
      cat ChangeLog | head -n 1000 > $PKG5/usr/doc/gcc-${VERSION}/libjava/ChangeLog
      touch -r ChangeLog $PKG5/usr/doc/gcc-${VERSION}/libjava/ChangeLog
    fi
  )

  mkdir -p $PKG1/usr/doc/gcc-${VERSION}/libmudflap
  ( cd libmudflap
    if [ -r ChangeLog ]; then
      cat ChangeLog | head -n 1000 > $PKG1/usr/doc/gcc-${VERSION}/libmudflap/ChangeLog
      touch -r ChangeLog $PKG1/usr/doc/gcc-${VERSION}/libmudflap/ChangeLog
    fi
  )

  mkdir -p $PKG1/usr/doc/gcc-${VERSION}/libgomp
  ( cd libgomp
    if [ -r ChangeLog ]; then
      cat ChangeLog | head -n 1000 > $PKG1/usr/doc/gcc-${VERSION}/libgomp/ChangeLog
      touch -r ChangeLog $PKG1/usr/doc/gcc-${VERSION}/libgomp/ChangeLog
    fi
  )

  mkdir -p $PKG6/usr/doc/gcc-${VERSION}/libobjc
  ( cd libobjc
    if [ -r ChangeLog ]; then
      cat ChangeLog | head -n 1000 > $PKG6/usr/doc/gcc-${VERSION}/libobjc/ChangeLog
      touch -r ChangeLog $PKG6/usr/doc/gcc-${VERSION}/libobjc/ChangeLog
    fi
    cp -favv \
      README* THREADS* \
    $PKG6/usr/doc/gcc-${VERSION}/libobjc
  )

  mkdir -p $PKG2/usr/doc/gcc-${VERSION}/libstdc++-v3
  ( cd libstdc++-v3
    cp -favv \
       README* \
       docs/html/faq.html \
      $PKG2/usr/doc/gcc-${VERSION}/libstdc++-v3
    if [ -r ChangeLog ]; then
      cat ChangeLog | head -n 1000 > $PKG2/usr/doc/gcc-${VERSION}/libstdc++-v3/ChangeLog
      touch -r ChangeLog $PKG2/usr/doc/gcc-${VERSION}/libstdc++-v3/ChangeLog
    fi
  )
)


# Add fastjar to the gcc-java package:
( cd $TMPBUILD
  FASTJARVER=$(echo $CWD/fastjar-*.tar.xz | rev | cut -f 3- -d . | cut -f 1 -d - | rev)
  echo
  echo "Building fastjar-$FASTJARVER first"
  echo

  # Extract source:
  tar xvvf $CWD/fastjar-$FASTJARVER.tar.xz || exit 1
  cd fastjar-$FASTJARVER || exit 1

  # Tidy up perms:
  slackhousekeeping

  # Apply patches:
  for patch in $CWD/fastjar-patches/*.gz ; do
    zcat $patch | patch -p1 --verbose || exit 1
  done

  # Configure:
  CFLAGS="$SLKCFLAGS" \
  CXXFLAGS="$SLKCFLAGS" \
  ./configure \
     --prefix=/usr \
     --libdir=/usr/lib$LIBDIRSUFFIX \
     --mandir=/usr/man \
     --infodir=/usr/info \
     --build=$TARGET || exit 1

  # Build:
  make $NUMJOBS || make || exit 1

  # Install into package:
  make install DESTDIR=$PKG5 || exit 1
  mkdir -p $PKG5/usr/doc/fastjar-$FASTJARVER
  cp -a \
    AUTHORS CHANGES COPYING* INSTALL NEWS README* TODO \
    $PKG5/usr/doc/fastjar-$FASTJARVER

  # If there's a ChangeLog, installing at least part of the recent history
  # is useful, but don't let it get totally out of control:
  if [ -r ChangeLog ]; then
    DOCSDIR=$(echo $PKG5/usr/doc/fastjar-$FASTJARVER)
    cat ChangeLog | head -n 1000 > $DOCSDIR/ChangeLog
    touch -r ChangeLog $DOCSDIR/ChangeLog
  fi

  # Strip:
  find $PKG5 | xargs file | grep -e "executable" -e "shared object" | grep ELF \
    | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null

  # Compress man & info pages.
  ( cd $PKG5 && slackgzpages -i )
  echo
) || exit 1

# build gcc
  cd $TMPBUILD || exit 1

  echo "*************************"
  echo "*** Building main GCC ***"
  echo "*************************"
  mkdir gcc.build.lnx
  cd gcc.build.lnx
  BOOT_CFLAGS="$SLKCFLAGS" \
  STAGE1_CFLAGS="$SLKCFLAGS" \
  CFLAGS="$SLKCFLAGS" \
  CXXFLAGS="$SLKCFLAGS" \
  LIBCFLAGS="$SLKCFLAGS" \
  LIBCXXFLAGS="$SLKCFLAGS" \
  GCJFLAGS="$SLKCFLAGS" \
  ../gcc-$VERSION/configure $ARCH_CONFARGS \
       --prefix=/usr \
       --mandir=/usr/man \
       --infodir=/usr/info \
       --libdir=/usr/lib$LIBDIRSUFFIX \
       --enable-bootstrap \
       --enable-checking=release \
       --with-system-zlib \
       --disable-libunwind-exceptions \
       --with-python-dir=/lib$LIBDIRSUFFIX/python${PYTHONVER}/site-packages \
       --enable-libstdcxx-dual-abi \
       --with-default-libstdcxx-abi=gcc4-compatible \
       --enable-shared \
       --enable-languages=c,c++,fortran,go,java,objc,lto \
       --enable-objc-gc \
       --enable-threads=posix \
       --enable-__cxa_atexit \
       --enable-libssp \
       --enable-lto \
       --with-gnu-ld \
       --verbose \
       --enable-java-home \
       --with-java-home=/usr/lib$LIBDIRSUFFIX/jvm/jre \
       --with-jvm-root-dir=/usr/lib$LIBDIRSUFFIX/jvm \
       --with-jvm-jar-dir=/usr/lib$LIBDIRSUFFIX/jvm/jvm-exports \
       --with-arch-directory=$LIB_ARCH \
       --with-antlr-jar=$ANTLJAR \
       --enable-java-awt=gtk \
       --disable-gtktest \
       --disable-install-libiberty \
       --host=$TARGET \
       --build=$TARGET \
       --target=$TARGET || exit 1

#       --enable-languages=ada,c,c++,fortran,go,java,objc,lto \

# go support doesn't work on ARM in gxx 4.7 (at least without a Java installed, it
# seems from a brief inspection of the build log).  This may be one to try after OpenJDK
# is built.
#       --enable-languages=c,c++,fortran,go,java,objc,lto \

  # Start the build:
#       BOOT_CFLAGS="$SLKCFLAGS -fno-stack-protector" \
#       STAGE1_CFLAGS="$SLKCFLAGS -fno-stack-protector" \

# Hard code the number of parallel jobs here rather than use $NUMJOBS
# This is because the bootstrap compiler is built using distcc against the x86 cluster, but
# the new compiler (built *from* the bootstrap compiler) is run natively, so -j22
# is a bit too much for a single ARM core.
# -j3 will be fine on the NVidia Tegra20 though..
# If the parallel build fails, perform a single job build.
  make -j2 \
       BOOT_CFLAGS="$SLKCFLAGS" \
       STAGE1_CFLAGS="$SLKCFLAGS" \
       CFLAGS="$SLKCFLAGS" \
       CXXFLAGS="$SLKCFLAGS" \
       LIBCFLAGS="$SLKCFLAGS" \
       LIBCXXFLAGS="$SLKCFLAGS" \
       GCJFLAGS="$SLKCFLAGS" \
       bootstrap || make \
       BOOT_CFLAGS="$SLKCFLAGS" \
       STAGE1_CFLAGS="$SLKCFLAGS" \
       CFLAGS="$SLKCFLAGS" \
       CXXFLAGS="$SLKCFLAGS" \
       LIBCFLAGS="$SLKCFLAGS" \
       LIBCXXFLAGS="$SLKCFLAGS" \
       GCJFLAGS="$SLKCFLAGS" \
       bootstrap || exit 1

# Build GNAT -- not yet since it's broken.
#( cd gcc
#    make gnatlib GNATLIBCFLAGS="$SLKCFLAGS" || exit 1
#
#    CFLAGS="$SLKCFLAGS" \
#    CXXFLAGS="$SLKCFLAGS" \
#    make gnattools || exit 1
#  ) || exit 1

  # Build info pages:
  make info

  # Set GCCCHECK=something to run the tests
  if [ ! -z $GCCCHECK ]; then
     make check
  fi

  # To begin, install the whole thing into one package.  We split up later.
  make install DESTDIR=$PKG1

  # KLUDGE ALERT
  # These *gdb.py files are causing ldconfig to complain, so they are going
  # to be REMOVED for now...  at some point, they might be moved somewhere
  # else, in which case things should Just Work(tm).  Keep an eye on it.
  rm -f $PKG1/usr/lib${LIBDIRSUFFIX}/*gdb.py

  # Be sure the "specs" file is installed.  There was an issue with that on 4.1.1:
  if [ ! -r $PKG1/usr/lib${LIBDIRSUFFIX}/gcc/${ARCH}-slackware-linux-gnueabi/${VERSION}/specs ]; then
     echo "************************************************************************"
     echo "************************* MISSING SPECS FILE ***************************"
     echo "************************************************************************"
     echo "************************************************************************"
     set -x
     cat stage1-gcc/specs > $PKG1/usr/lib${LIBDIRSUFFIX}/gcc/${ARCH}-slackware-linux-gnueabi/${VERSION}/specs
     set +x
  fi

  make -i install-info DESTDIR=$PKG1
  chmod 755 $PKG1/usr/lib${LIBDIRSUFFIX}/libgcc_s.so.1

# The (huge) static GNU java libraries are not packaged.  In nearly all
# cases one or more dependencies will not be available as static anyway.
rm -fv $PKG1/usr/lib${LIBDIRSUFFIX}/libgcj.a
rm -fv $PKG1/usr/lib${LIBDIRSUFFIX}/libgcj-tools.a

# Fix stuff up:
( cd $PKG1/usr/info ; rm dir ; gzip -9 * )
( cd $PKG1
  # *not* ${LIBDIRSUFFIX}
  mkdir -p lib
  cd lib
  ln -sf /usr/bin/cpp .
)

echo "************ Setting up $PKG1 ************"
( cd $PKG1/usr/bin
  mv g++ g++-gcc-$VERSION
  mv gcc gcc-$VERSION
  mv ${TARGET}-gfortran gfortran-gcc-$VERSION
  ln -sf g++-gcc-$VERSION g++
  ln -sf gcc-$VERSION gcc
  ln -sf g++ c++
  ln -sf gcc cc
  ln -sf gcc-$VERSION ${TARGET}-gcc
  ln -sf gcc-$VERSION ${TARGET}-gcc-$VERSION
  ln -sf gcj ${TARGET}-gcj
  ln -sf gcjh ${TARGET}-gcjh
  ln -sf g++-gcc-$VERSION ${TARGET}-c++
  ln -sf g++-gcc-$VERSION ${TARGET}-g++
  ln -sf gfortran-gcc-$VERSION gfortran
  ln -sf gfortran-gcc-$VERSION ${TARGET}-gfortran
  ln -sf gfortran-gcc-$VERSION ${TARGET}-gfortran-$VERSION
  ln -sf gfortran-gcc-$VERSION ${TARGET}-g95
  ln -sf gfortran g95
  ln -sf gfortran f95
  ln -sf gfortran-gcc-$VERSION ${TARGET}-g77
  ln -sf gfortran g77
  ln -sf gfortran f77
  install -vpm755 $CWD/c89.sh c89
  install -vpm755 $CWD/c99.sh c99
)

( cd $PKG1/usr/man
  gzip -9 */*
  cd man1
  ln -sf g++.1.gz c++.1.gz
  ln -sf gcc.1.gz cc.1.gz
)

## build the txz package
#(
#  cd $PKG1;
#  makepkg -l y -c n $TMP/gcc-$VERSION-$ARCH-$BUILD.txz
#)

# OK, time to split the big package where needed:
# gcc-g++:
echo "**************** Setting up $PKG2 ******************"
( cd $PKG2
  mkdir -p usr/bin
  mv $PKG1/usr/bin/*++* usr/bin
  mkdir -p usr/include
  mv $PKG1/usr/include/c++ usr/include
  mkdir -p usr/lib${LIBDIRSUFFIX}
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/*++* usr/lib
  mkdir -p usr/libexec/gcc/$TARGET/$VERSION
  mv $PKG1/usr/libexec/gcc/$TARGET/$VERSION/cc1plus usr/libexec/gcc/$TARGET/$VERSION/cc1plus
  mkdir -p usr/man/man1
  mv $PKG1/usr/man/man1/*++* usr/man/man1 )

# gcc-gfortran:
echo "******************* Setting up $PKG3 ****************"
( cd $PKG3
  mkdir -p usr/{bin,lib/gcc/$TARGET/$VERSION,libexec/gcc/$TARGET/$VERSION}
  mv $PKG1/usr/bin/*gfortran* usr/bin
  mv $PKG1/usr/bin/*95* usr/bin
  mv $PKG1/usr/bin/*77* usr/bin
  # Doesn't this seem like a logical idea?
  ( cd usr/bin ; ln -sf gfortran-gcc-${VERSION} fortran )
  mkdir -p usr/info
  mv $PKG1/usr/info/gfortran* usr/info
  mkdir -p usr/lib${LIBDIRSUFFIX}
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/libgfortran* usr/lib${LIBDIRSUFFIX}
  mkdir -p usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/finclude usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION
  mkdir -p usr/libexec/gcc/$TARGET/$VERSION
  mv $PKG1/usr/libexec/gcc/$TARGET/$VERSION/f951 usr/libexec/gcc/$TARGET/$VERSION/f951
  # On ARM This is in /usr/lib - possibly one of the patches has changed this.
  # mv $PKG1/usr/libexec/gcc/$TARGET/$VERSION/libgfortran* usr/libexec/gcc/$TARGET/$VERSION
  mv $PKG1/usr/lib/gcc/$TARGET/$VERSION/libgfortran* usr/lib/gcc/$TARGET/$VERSION/
  mkdir -p usr/man/man1
  mv $PKG1/usr/man/man1/gfortran* usr/man/man1
)

# gcc-gnat:
echo "***************** Setting up $PKG4 ****************"
( cd $PKG4
  mkdir -p usr/bin

  # Kludge:
  # Stop the gnat* wildcard moving gnative2ascii into this package
  mkdir -vpm755 $PKG5/usr/bin
  mv -fv $PKG1/usr/bin/*native2ascii $PKG5/usr/bin/

  # Now move the rest of the gnat package into place:
  mv $PKG1/usr/bin/gnat* usr/bin
  mv $PKG1/usr/bin/gpr* usr/bin
  mkdir -p usr/info
  mv $PKG1/usr/info/gnat* usr/info
  mkdir -p usr/libexec/gcc/$TARGET/$VERSION
  mv $PKG1/usr/libexec/gcc/$TARGET/$VERSION/gnat1 usr/libexec/gcc/$TARGET/$VERSION
  mkdir -p usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/adainclude usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/adalib usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION
)

# gcc-java:
echo "******************** Setting up $PKG5 *******************"
( cd $PKG5
  mkdir -p usr/bin
  mv $PKG1/usr/bin/aot-compile usr/bin
  mv $PKG1/usr/bin/addr2name.awk usr/bin
  # mv $PKG1/usr/bin/fastjar usr/bin
  mv $PKG1/usr/bin/gappletviewer usr/bin
  mv $PKG1/usr/bin/gc-analyze usr/bin
  mv $PKG1/usr/bin/*gcj* usr/bin
  mv $PKG1/usr/bin/gij usr/bin
  mv $PKG1/usr/bin/gjar usr/bin
  mv $PKG1/usr/bin/gjarsigner usr/bin
  mv $PKG1/usr/bin/gjdoc usr/bin
  mv $PKG1/usr/bin/gkeytool usr/bin
  mv $PKG1/usr/bin/grepjar usr/bin
  mv $PKG1/usr/bin/grmic usr/bin
  mv $PKG1/usr/bin/grmiregistry usr/bin
  mv $PKG1/usr/bin/gserialver usr/bin
  mv $PKG1/usr/bin/gtnameserv usr/bin
  mv $PKG1/usr/bin/gjavah usr/bin
  mv $PKG1/usr/bin/gorbd usr/bin
  mv $PKG1/usr/bin/jar usr/bin
  mv $PKG1/usr/bin/jcf-dump usr/bin
  mv $PKG1/usr/bin/jv-* usr/bin
  mv $PKG1/usr/bin/rmi* usr/bin
  mkdir -p usr/include/c++/$VERSION
  # Move some Java only C++ headers from the C++ package:
  mv $PKG2/usr/include/c++/$VERSION/{gcj,gnu,java,javax,org,sun} usr/include/c++/$VERSION
  mv $PKG1/usr/include/ffi.h usr/include
  mkdir -p usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/include
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/include/jawt.h usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/include
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/include/ffi.h usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/include
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/include/ffitarget.h usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/include 
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/include/jawt_md.h usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/include
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/include/jni.h usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/include
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/include/jni_md.h usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/include
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/include/jvmpi.h usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/include
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/include/libffi usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/include
  # aot-compile Python plugins:
  if [ ! -d $PKG1/usr/lib${LIBDIRSUFFIX}/python${PYTHONVER} ]; then
    echo "NO $PKG1/usr/lib${LIBDIRSUFFIX}/python${PYTHONVER} !"
    exit 1
  fi
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/python${PYTHONVER} usr/lib${LIBDIRSUFFIX}

  mkdir -p usr/info
  mv $PKG1/usr/info/gcj.* usr/info
  # mv $PKG1/usr/info/fastjar.* usr/info
  mkdir -p usr/lib${LIBDIRSUFFIX}
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/libffi* usr/lib${LIBDIRSUFFIX}
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/gcj* usr/lib${LIBDIRSUFFIX}
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/libgcj* usr/lib${LIBDIRSUFFIX}
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/libgij* usr/lib${LIBDIRSUFFIX}
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/lib-org* usr/lib${LIBDIRSUFFIX}
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/security usr/lib${LIBDIRSUFFIX}
  mkdir -p usr/lib${LIBDIRSUFFIX}/pkgconfig
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/pkgconfig/libgcj*.pc usr/lib${LIBDIRSUFFIX}/pkgconfig
  rmdir $PKG1/usr/lib${LIBDIRSUFFIX}/pkgconfig 2> /dev/null
  mkdir -p usr/libexec/gcc/$TARGET/$VERSION
  mv $PKG1/usr/libexec/gcc/$TARGET/$VERSION/jc1 usr/libexec/gcc/$TARGET/$VERSION
  mv $PKG1/usr/libexec/gcc/$TARGET/$VERSION/jvgenmain usr/libexec/gcc/$TARGET/$VERSION
  mkdir -p usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/include
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/include/gcj usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/include
  mkdir -p usr/man/man1
  mv $PKG1/usr/man/man1/aot-compile.1.gz usr/man/man1
  mv $PKG1/usr/man/man1/gappletviewer.1.gz usr/man/man1
  mv $PKG1/usr/man/man1/gc-analyze.1.gz usr/man/man1
  mv $PKG1/usr/man/man1/gcj.1.gz usr/man/man1
  mv $PKG1/usr/man/man1/gcjh.1.gz usr/man/man1
  mv $PKG1/usr/man/man1/gcj-dbtool.1.gz usr/man/man1
  mv $PKG1/usr/man/man1/gij.1.gz usr/man/man1
  mv $PKG1/usr/man/man1/gjar.1.gz usr/man/man1
  mv $PKG1/usr/man/man1/gjarsigner.1.gz usr/man/man1
  mv $PKG1/usr/man/man1/gjavah.1.gz usr/man/man1
  mv $PKG1/usr/man/man1/gjdoc.1.gz usr/man/man1
  mv $PKG1/usr/man/man1/gjnih.1.gz usr/man/man1
  mv $PKG1/usr/man/man1/gkeytool.1.gz usr/man/man1
  mv $PKG1/usr/man/man1/gnative2ascii.1.gz usr/man/man1
  mv $PKG1/usr/man/man1/gorbd.1.gz usr/man/man1
  mv $PKG1/usr/man/man1/grmic.1.gz usr/man/man1
  mv $PKG1/usr/man/man1/grmid.1.gz usr/man/man1
  mv $PKG1/usr/man/man1/grmiregistry.1.gz usr/man/man1
  mv $PKG1/usr/man/man1/gserialver.1.gz usr/man/man1
  mv $PKG1/usr/man/man1/gtnameserv.1.gz usr/man/man1
  mv $PKG1/usr/man/man1/jcf-dump.1.gz usr/man/man1
  mv $PKG1/usr/man/man1/jv-convert.1.gz usr/man/man1
  mv $PKG1/usr/man/man1/jv-scan.1.gz usr/man/man1
  mv $PKG1/usr/man/man1/rebuild-gcj-db.1.gz usr/man/man1
  mkdir -p usr/man/man3
  mv $PKG1/usr/man/man3/ffi* usr/man/man3
  mkdir -p usr/share
  mv $PKG1/usr/share/java usr/share

  # The ecj wrapper script:
  cat $CWD/ecj.sh | sed -e "s,@JAVADIR@,/usr/share/java," > usr/bin/ecj
  chmod 755 usr/bin/ecj
  # The JAVA_HOME compatibility links.
  # Caution: non-multilib arch-independent stuff! No lib64 here.
  mkdir -p usr/lib$LIBDIRSUFFIX
  mv $PKG1/usr/lib$LIBDIRSUFFIX/jvm* usr/lib$LIBDIRSUFFIX
  # And add the missing javac symlink:
  ln -vfs ../../../bin/ecj usr/lib$LIBDIRSUFFIX/jvm/bin/javac
  # Don't package libffi stuff anymore.  GCC will link the internal version
  # statically, and we'll need a newer one elsewhere.
  find . -name "ffi*.h" | xargs rm
  find . -name "libffi*" | xargs rm
  rm -f usr/man/man3/ffi*
  rm -f usr/info/libffi*
)

# gcc-objc:
echo "******************* Setting up $PKG6 **********************"
( cd $PKG6
  mkdir -p usr/lib${LIBDIRSUFFIX}
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/libobjc* usr/lib${LIBDIRSUFFIX}
  mkdir -p usr/libexec/gcc/$TARGET/$VERSION
  mv $PKG1/usr/libexec/gcc/$TARGET/$VERSION/cc1obj usr/libexec/gcc/$TARGET/$VERSION
  mkdir -p usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/include
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/include/objc usr/lib${LIBDIRSUFFIX}/gcc/$TARGET/$VERSION/include )

## NOTE: Thought about this, because the precompiled headers are so large.
## Probably easier to keep everything together, though.
## gcc-g++-gch (precompiled c++ headers)
#echo "****************** Setting up $PKG7 **********************"
#( cd $PKG7
#  mkdir -p usr/include/c++/$VERSION/$TARGET/bits
#  mv $PKG2/usr/include/c++/$VERSION/$TARGET/bits/stdc++.h.gch usr/include/c++/$VERSION/$TARGET/bits
#)

# gcc-go:
echo "******************* Setting up $PKG8 **********************"
( cd $PKG8
  mkdir -p usr/bin
  mv $PKG1/usr/bin/*gccgo* usr/bin
  mv $PKG1/usr/bin/go{,fmt} usr/bin
  mkdir -p usr/libexec/gcc/$TARGET/$VERSION
  mv $PKG1/usr/libexec/gcc/$TARGET/$VERSION/{cgo,go1} usr/libexec/gcc/$TARGET/$VERSION
  mkdir -p usr/info
  mv $PKG1/usr/info/gccgo.info.gz usr/info
  mkdir -p usr/lib${LIBDIRSUFFIX}
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/go usr/lib${LIBDIRSUFFIX}
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/{libgo.la,libgo.so*,libgobegin.a,libgolibbegin.a,libnetgo.a} usr/lib${LIBDIRSUFFIX} || exit 1
  # Ordinarily Slackware doesn't package static libraries, but in this case
  # it is useful for deploying compiled binaries on machines that do not yet
  # have libgo.so.0.0.0.
  mv $PKG1/usr/lib${LIBDIRSUFFIX}/libgo.a usr/lib${LIBDIRSUFFIX}
  mkdir -p usr/man/man1
  mv $PKG1/usr/man/man1/gccgo.1.gz usr/man/man1
  mv $PKG1/usr/man/man1/go.1.gz usr/man/man1
  mv $PKG1/usr/man/man1/gofmt.1.gz usr/man/man1
) || exit 1

# Filter all .la files:
( cd $TMP
  for file in $( find . -type f -name "*.la" ) ; do
    sed -i 's%-L/gcc-[[:graph:]]* % %g' "$file"
  done )

## Strip bloated binaries and libraries:
for dir in $PKG{1,2,3,4,5,6,8}; do
  ( cd $dir
    find . -name "lib*so*" -exec strip --strip-unneeded "{}" \;
    find . -name "lib*a" -exec strip -g "{}" \;
    strip --strip-unneeded usr/bin/* 2> /dev/null
    find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null
    find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null
  )
done

# Start the fakeroot server:
start_fakeroot

# Delete old packages - if you want the old ones, move them out
# of the way first!
rm -fv $PKGSTORE/$PKGSERIES/gcc-*.t*

# Don't delete old packages otherwise 'slackmp' wipes
# the base gcc package.
export DELETEOLDPKGS=No

# Build packages:
( echo "Building gcc package"
  cd $PKG1
  slackchown
  slack644docs
  export SLACKPACKAGE=gcc-$VERSION-$PKGARCH-$BUILD.txz
  slackmp )

( echo "Building g++ package"
  cd $PKG2
  slackchown
  slack644docs
  export SLACKPACKAGE=gcc-g++-$VERSION-$PKGARCH-$BUILD.txz
  slackmp )

( cd $PKG3
  slackchown
  slack644docs
  export SLACKPACKAGE=gcc-gfortran-$VERSION-$PKGARCH-$BUILD.txz
  slackmp )

if [ -x $PKG4/usr/bin/gnat ]; then
   ( cd $PKG4
     slackchown
     slack644docs
     export SLACKPACKAGE=gcc-gnat-$VERSION-$PKGARCH-$BUILD.txz
     slackmp )
fi

( cd $PKG5
  slackchown
  slack644docs
  export SLACKPACKAGE=gcc-java-$VERSION-$PKGARCH-$BUILD.txz
  slackmp )

( cd $PKG6
  slackchown
  slack644docs
  export SLACKPACKAGE=gcc-objc-$VERSION-$PKGARCH-$BUILD.txz
  slackmp )

#( cd $PKG7
#  slackchown
#  slack644docs
#  makepkg -l y -c n $PKGSTORE/$PKGSERIES/gcc-g++-gch-$VERSION-$PKGARCH-$BUILD.txz )

# Only build this if it's been built - it doesn't work on ARM for gcc 4.6.
if [ -x $PKG8/usr/bin/gccgo ]; then
  ( cd $PKG8
    makepkg -l y -c n $PKGSTORE/$PKGSERIES/gcc-go-$VERSION-$PKGARCH-$BUILD.txz )
fi

