#!/bin/bash -e

# NOTE: should be invoked as either:
#    ./msys-build-tar tar-VER.tar.bz2
#    which will unpack the "pristine" source distribution, patch it, 
#    and begin the build,
# OR, as
#    ../msys-build-tar
#    where the current working directory is the unpacked and patched
#    source distribution.

# displays error message and exits
error() {
        case $? in
                0) local errorcode=1 ;;
                *) local errorcode=$? ;;
        esac

        echo -e "\e[1;31m*** ERROR:\e[0;0m ${1:-no error message provided}";
        exit ${errorcode};
}

# displays information message
inform() {
        echo -e "\e[1;32m*** Info:\e[0;0m ${1}";
}

# displays warning message only
warning() {
        echo -e "\e[1;33m*** Warning:\e[0;0m ${1}";
}

# displays command to stdout before execution
verbose() {
        echo "${@}"
        "${@}"
        return $?
}
export -f verbose warning inform error


if [ "x" != "x$1" ]; then
  if [ -d "$1" ]; then
    savedir="$PWD"
    cd "$1"
    srcdir="$PWD"
  elif [ -f "$1" ]; then
    case "$1" in
    *.tar.bz2 ) srcdir=`echo $1 | sed -e 's/\.tar\.bz2$//'`
                unpack=tbz
                savedir="$PWD" ;;
    *.tar.gz  ) srcdir=`echo $1 | sed -e 's/\.tar\.gz$//'`
                unpack=tgz
                savedir="$PWD" ;;
    *.zip     ) srcdir=`echo $1 | sed -e 's/\.zip$//'`
                unpack=zip
                savedir="$PWD" ;;
    * ) error "Bad src directory specified: $1" ;;
    esac
  else
    error "Bad src directory specified: $1"
  fi
else
  savedir="$PWD"
  srcdir="$PWD"
fi
if [ -n "$unpack" ] ; then
  case "$unpack" in
  tbz ) inform "unpacking $1" ; tar xjf $1 ;;
  tgz ) inform "unpacking $1" ; tar xzf $1 ;;
  zip ) inform "unpacking $1" ; unzip -q $1 ;;
  * ) error "unknown pack format" ;;
  esac
  if [ ! -d "$srcdir" ]; then
    echo "src package $1 does not unpack into assumed srcdir $srcdir"
    exit 1
  fi

  cd ${savedir}
  PKG=`basename $srcdir`
  for fn in ${PKG}.cygwin.patch ${PKG}.msys.patch ${PKG}.msys-test.patch
  do
    if [ -e ${fn} ]
    then
      cd ${srcdir}
      inform "applying patch: $fn"
      if ! patch -p2 < ${savedir}/$fn
      then
        error "unable to apply patch!"
      fi
      cd ${savedir}
    fi
  done
  srcdir=`cd $srcdir; pwd`
fi


abovedir=`cd ${srcdir}/..; pwd`
export PKG=`basename $srcdir`

opt_flags="-fnative-struct -O3 -s -mcpu=pentium"
export CFLAGS=${CFLAGS:-"${opt_flags}"};
export CPPFLAGS="${CPPFLAGS} -D__CYGWIN__" 
export CXXFLAGS=${CXXFLAGS:-"${opt_flags}"};
export F77FLAGS=${F77FLAGS:-"${opt_flags}"};
export GCJFLAGS=${GCJFLAGS:-"${opt_flags}"};
export LDFLAGS="${LDFLAGS} -Wl,--enable-auto-import";
export PATH=`pwd`:/msys/bin:/bin:/usr/local/bin:/mingw/bin

confargs="--prefix=/usr --sbindir=/usr/sbin --libexecdir=/usr/sbin \
          --localstatedir=/var --sysconfdir=/etc \
          --without-libintl-prefix --without-libiconv-prefix --enable-backup-scripts" 

mkdir -p ${abovedir}/_build
builddir=${abovedir}/_build
mkdir -p ${abovedir}/_inst
instdir=${abovedir}/_inst

cd ${srcdir}
rm build-aux/config.guess
rm build-aux/config.sub
autoreconf -f -v -i

cd ${builddir}
export ac_cv_func_fchdir=no
${srcdir}/configure --srcdir=${srcdir} ${confargs} \
   CFLAGS="${CFLAGS}" \
   CPPFLAGS="${CPPFLAGS}" \
   LDFLAGS="${LDFLAGS}"

make
make install DESTDIR=${instdir}	
verbose /usr/bin/install -d ${instdir}/usr/share/doc/${PKG}
for fn in ABOUT-NLS AUTHORS ChangeLog COPYING INSTALL NEWS README THANKS TODO
do
  verbose /usr/bin/install -m 644 ${srcdir}/${fn} ${instdir}/usr/share/doc/${PKG}/
done

cd ${instdir}/usr
rm -f share/info/dir
rm -f lib/charset.alias
rmdir lib || /bin/true
cd ${instdir}/usr
tar cvzf ${abovedir}/${PKG}-MSYS-1.0.11-2-bin.tar.gz *

cd ${abovedir}
tar cvzf ./${PKG}-MSYS-1.0.11-2-src.tar.gz \
  ${PKG}.tar.bz2 \
  ${PKG}.cygwin.patch \
  ${PKG}.msys.patch \
  ${PKG}.msys-test.patch \
  msys-build-tar

cd "$savedir"

