#!/bin/sh
# -*- text -*-
#
# $Id: makeM_all,v 1.70 2000/11/07 17:01:04 ballueder Exp $
# makeM_all script: Checkout, compile and package wxGTK and Mahogany.
# Tested on:    Linux/x86: Debian/Corel, RedHat
#               Linux/axp: Debian Slink
#               Solaris/Sparc
#		FreeBSD/x86
#
#
#
# Some quick notes how to adapt this script:
#
# What does it do?
#    - download/update wxGTK from cvs and compile/install it
#    - download/update Mahogany from cvs and compile/install it
#    - optionally upload stuff to Mahogany FTP server as packages
#      for various systems and tar balls for source and binary packages
#
# For uploads, SSH1 access is required on the ftp server.
# For everything, cvs read-only access is required and the user
# running this script must have done a "cvs login" manually with exactly 
# the same CVSROOT settings as used in this script. Otherwise cvs will 
# fail.
# Alternatively, without cvs, the script can build everything from
# source tarballs.
#
# Debian/RedHat should be detected automatically.
#
# Several options are set from the hostname, I have simply put in my
# favourite buildhosts and they set their build directories etc.
# Only the host designated as "DOCHOST" will build the documentation
# and upload it. All other hosts will use the pre-built docs from the
# FTP server.
#
# Most options are hard-coded at the top of the script in
# corresponding variables. A central config file is retrieved from the 
# FTP server and can be used to override the settings. Useful for
# changing version numbers, etc. Host-specific settings are set after
# that. 
#
#
# I know this script is fairly ugly, but it builds everything on a
# variety of different systems and *works*. Took a long time to get it 
# all right.
#
#
# Any problems, comments, improvements:  mailto:ballueder@gmx.net
#

CVSID='$Id: makeM_all,v 1.70 2000/11/07 17:01:04 ballueder Exp $'

echo "##############################################################################"
echo "makeM_deb running on " `hostname` " date: " `date`
echo "##############################################################################"

DOWXWIN=yes  # no or yes
DOINSTALL=yes
DOSHARED=no
DEBUG=no
USETARSRC=no
MKTARSRC=no
ADDON=

RESTARTED=no
ORIGINALSCRIPT=
SKIPRESTART=no

export DOWXWIN DOINSTALL DOSHARED DEBUG USETARSRC MKTARSRC ADDON
export RESTARTED ORIGINALSCRIPT SKIPRESTART

OPTIONS="$@"
echo "Called with options: $OPTIONS"

while [ ! -z "$1" ]
do
	case "x$1" in
	"x--Monly")
		DOWXWIN=no
		shift
	;;
	"x--debug")
		DEBUG=yes
		shift
	;;
	"x--noinst")
		DOINSTALL=no
		shift
	;;
	"x--shared")
		DOSHARED=yes
		shift
	;;
	"x--fromtar")
		USETARSRC=yes
		shift
	;;
	"x--mktar")
		MKTARSRC=yes
		shift
	;;
	"x--restart--")
                RESTARTED=yes
		ORIGINALSCRIPT=$2
		shift
		shift
	;;
	"x--norestart")
		SKIPRESTART=yes
		shift
	;;
	*)
	echo "Illegal argument $1"
	exit 1
	esac
done


PATH=$PATH:/usr/bin:/usr/local/bin
export PATH

CVS=cvs
export CVS

SCP=scp
export scp

BUILDDIR=/usr/local/src/Mbuild
export BUILDDIR

WXPREFIX=/usr/local/stow/wxWindows
export WXPREFIX

MPREFIX=/usr/local
export MPREFIX

DESTDIR=/tmp/Minst
export DESTDIR

USESTABLE=no

FTPLOCATION="ballueder@mahogany.sourceforge.net:FTP/daily/"
WWWDOCLOCATION="ballueder@mahogany.sourceforge.net:WWW/doc/"
WXCVSROOT=":pserver:anonymous@cvs.wxwindows.sourceforge.net:/cvsroot/wxwindows"
MCVSROOT=":pserver:anonymous@cvs.mahogany.sourceforge.net:/cvsroot/mahogany"

# Need to hardwire this as we run it as root for rpm/deb generation:
#if [ "$UID" = 0 ]
#then
#  REALHOME=$HOME
#  KBHOME=/home/karsten
#  HOME=$KBHOME
#else
  REALHOME=$HOME
#fi
WWWDIR=$HOME/WWW/Mahogany/daily
LOGNAME="karsten"
export LOGNAME

MNAME=mahogany
MVERSION=0.60
MTAG="-A"

WXNAME=wxGTK
WXVERSION=2.2

DOCHOST=phyw164

# This should be set to "yes" by the Mahogany compilation if it
# succeeds. Used in the debian compilation only for now.
UPLOADWXGTK=no


if [ $DOSHARED = yes ]
then
	ADDON="_wxshared"
else
	ADDON="_wxstatic"
fi

if [ $DEBUG = yes ]
then
	ADDON="${ADDON}_debug"
fi

if [ -f /etc/debian_version ]
then
  DEBIAN=yes
  OSTYPE_ADDON="-Debian"
  DEBIAN_FLAVOUR=Debian
else
  DEBIAN=no
fi

if [ -f /etc/redhat-release ]
then
  REDHAT=yes
  OSTYPE_ADDON="-RedHat"
else
  REDHAT=no
fi

CC=gcc
CXX=gcc

TMPDIR=/tmp
export TMPDIR

MCONFOPT="--with-modules=static"

#################################################################################
##
## Host/OS specific setups
##
#################################################################################
if [ `hostname` = caisteal -o `hostname` = dearg -o `hostname` = nevis ]
then
  OSTYPE=SunOS
  OSTYPE_ADDON="-sparc"
fi

if [ "$OSTYPE" = "SunOS" ]
then
  LD_LIBRARY_PATH=$HOME/arch/SunOS/lib:/opt/lib:/usr/openwin/lib:/usr/local/X11R5/lib:/usr/lib:/usr/ucblib:/opt/Fsfgcc/lib:/usr/dt/lib:/opt/GBxpm/lib:$HOME/bin
  LD_LIBRARY_PATH=/opt/lib:/usr/openwin/lib:/usr/local/X11R5/lib:/usr/lib:/usr/ucblib:/opt/Fsfgcc/lib:/usr/dt/lib:/opt/GBxpm/lib:$HOME/bin:$LD_LIBRARY_PATH:/usr/local/lib
  CC=/opt/FSFgcc-2.8.0/bin/gcc
  CXX=/opt/FSFgcc-2.8.0/bin/c++
  LDFLAGS="$LDFLAGS -L/opt/FSFstdc++/lib -L/opt/lib -L/home/karsten/arch/SunOS/lib"
  CPPFLAGS="$CPPFLAGS -I/home/karsten/arch/SunOS/include"
  CPPFLAGS="-I/opt/include -I/opt/FSFstdc++/include/g++ -I/home/karsten/arch/SunOS/include -I$HOME/opt/include" # -I/scratch/karsten/Python/include/python1.5"
  MAKE="gmake -s"
  PATH=/usr/ucb:/sbin:/usr/openwin/bin:/usr/bin:/usr/sbin:/opt/bin:/opt/SUNWspro/bin:/opt/hostsA:/usr/ccs/bin:$PATH:/usr/local/bin
  PATH=$HOME/arch/`uname`/bin:/opt/bin:$PATH
  BISON_SIMPLE=$HOME/arch/SunOS/lib/bison.simple 
  BISON_HAIRY=$HOME/arch/SunOS/lib/bison.hairy 
  export MAKE CPPFLAGS LDFLAGS CXX CC LD_LIBRARY_PATH PATH BISON_HAIRY BISON_SIMPLE
  BUILDDIR=/home/karsten/tmp

  WXPREFIX=/home/karsten/opt
  MPREFIX=/opt
fi

if [ `hostname` = dearg ]
then
  OSTYPE=SunOS
  OSTYPE_ADDON="-sparc"
  CC=gcc
  CXX=c++
  SCP=/usr/local/bin/ssh1/scp
  BUILDDIR=/home/karsten/tmp
fi

if [ `hostname` = phyw164 ]
then
  SCP=scp1
  OSTYPE_ADDON="-Slink"
  DEBIAN_FLAVOUR=Slink
fi

if [ `hostname` = ronnie ]
then
  PATH=$PATH:/usr/local/bin
fi

# RH box
if [ `hostname` = oxide.phy.hw.ac.uk ]
then
  WXPREFIX=/usr
  MPREFIX=/tmp/MOPT
  SCP=scp1
fi

# FreeBSD box
if [ `hostname` = Sendero.Simon-Shapiro.ORG ]
then
  BUILDDIR=/home/karsten/src
  WXPREFIX=/usr/local/wxWindows
  MPREFIX=/usr/local/Mahogany
  MAKE=gmake
  OSTYPE=FreeBSD
  CC=/usr/local/bin/gcc295
  CXX=$CC
  LDFLAGS="$LDFLAGS -lreadline -lstdc++ -L/usr/local/pilot/lib"
  export CC CXX OSTYPE LDFLAGS
  USESTABLE=no
  SCP=scp1
  MCONFOPT="$MCONFOPT --without-opt"
fi


if [ "x$MAKE" = x ] ; then MAKE=make; fi

RCNAME=.makeMrc    
# obtain local config file:
if [ -r $HOME/$RCNAME ]
then 
  echo "Reading $HOME/$RCNAME"
 . $HOME/$RCNAME 
else
  echo "$HOME/$RCNAME not found"
fi

# obtain 2nd local config file:
HOSTNAME=`hostname`
if [ -r $HOME/$RCNAME.$HOSTNAME ]
then
  echo "Reading $HOME/$RCNAME.$HOSTNAME"
  . $HOME/$RCNAME.$HOSTNAME
else
  echo "$HOME/$RCNAME.$HOSTNAME not found"
fi    

# obtain central options file from ftp server
echo "Retrieving central options file"
$SCP $FTPLOCATION/buildoptions /tmp/makeM_deb.$$
. /tmp/makeM_deb.$$
rm -f /tmp/makeM_deb.$$ 

if [ ! -d $BUILDDIR ] ; then  mkdir $BUILDDIR ; fi
if [ ! -d $WXPREFIX ] ; then mkdir $WXPREFIX ; fi
if [ ! -d $MPREFIX ] ; then mkdir $MPREFIX ; fi


#
# Ugly hack to allow auto-updating this script:
#
# Now that everything is set up we can copy the last obtained version
# of our script here and restart ourselves:
#
SCRIPT=$0 # where are we

if [ $SKIPRESTART = yes ]
then
  echo "Skipping script update."
else
if [ $RESTARTED = no ]
then
  echo "This is script $CVSID"
  echo "Checking for build script..."
  echo "  ($BUILDDIR/$MNAME-$MVERSION/extra/scripts/makeM_all)"
  if [ -f $BUILDDIR/$MNAME-$MVERSION/extra/scripts/makeM_all ]
  then
    echo "Updating build script..."
    ( cd $BUILDDIR/$MNAME-$MVERSION/extra/scripts && \
      $CVS update -d $MTAG )
    cp $BUILDDIR/$MNAME-$MVERSION/extra/scripts/makeM_all /tmp/makeM_all$$ && \
    chmod +x /tmp/makeM_all$$
    echo "Restarting script..."
    exec /tmp/makeM_all$$ --restart-- "$SCRIPT" $OPTIONS
    exit # not needed
  fi
else
  echo "Script was restarted, now replacing original (cp $0 $ORIGINALSCRIPT)."
  # now the script is run from /tmp/makeM_all$$, so we must copy it:
  cp "$0" "$ORIGINALSCRIPT" 
  echo "This is script $CVSID"
  echo "Continuing..."
fi
fi

echo "OSTYPE=$OSTYPE"
echo "OSTYPE_ADDON=$OSTYPE_ADDON"
echo "ADDON=$ADDON"
echo "BUILDDIR=$BUILDDIR"
echo "DEBIAN=$DEBIAN"
echo "REDHAT=$REDHAT"
echo "WXPREFIX=$WXPREFIX"
echo "MPREFIX=$MPREFIX"
echo "TAG=$TAG"
echo "DESTDIR=$DESTDIR"
echo "WXCVSROOT=$WXCVSROOT"
echo "MCVSROOT=$MCVSROOT"
echo "DOWXWIN=$DOWXWIN"
echo "DEBUG=$DEBUG"
echo "SCP=$SCP"
echo "DOSHARED=$DOSHARED"
echo "MCONFOPT=$MCONFOPT"
echo "DOINSTALL=$DOINSTALL"
echo "USETARSRC=$USETARSRC"
echo "MKTARSRC=$MKTARSRC"
echo "MVERSION=$MVERSION"
echo "MTAG=$MTAG"

export OSTYPE

cd $BUILDDIR
if [ $? != 0 ]
then
  echo "Cannot change to $BUILDDIR - exiting.";
  exit 1
fi

echo >cvs.log

OS=`uname -s`-`uname -m`
export OS
HOST=`hostname`.`domainname`

if [ $DOWXWIN = yes ]
then
  echo "##################################################################"
  echo "Building wxGTK."
  echo "##################################################################"


  NAME=$WXNAME
  VERSION="-$WXVERSION"
  if [ $USETARSRC = yes ]   # build from $HOME/wxWindows.tar.gz
  then 
    rm -r -f wxWindows
    cat $HOME/wxWindows.tar.gz | gzip -dc | tar xf -
    if [ $? != 0 ] 
    then
	echo "Failed to unpack $HOME/wxWindows.tar.gz"
	exit 1
    fi
  else   # build from cvs
    if [ "x$TAG" = "x" ]
    then
      if [ $USESTABLE = yes ]
        then
          TAG="-rM_STABLE"
          echo "Using stable version of wxGTK."
        else
          TAG="-A"
        echo "Using latest version of wxGTK."
      fi
    fi
    echo REALHOME=$HOME
    if [ ! -d wxWindows ]
    then
      echo "wxWindows directory does not exist. Doing fresh checkout."
      ( HOME=$REALHOME; $CVS -d"$WXCVSROOT" -Q checkout $TAG wxGTK 2>&1)
    else
      echo "Updating wxWindows sources."
      (HOME=$REALHOME; cd wxWindows && $CVS -d "$WXCVSROOT" -Q update $TAG 2>&1)
    fi
    if [ $? -gt 1 ]
    then
      echo "Calling CVS failed - exiting."
      exit 2
    fi
  fi # TARSRC

  if [ "$DEBUG" = "yes" ] ; then
  	DEBUGOPTS="--enable-debug_flag --enable-debug_info"
  else
	DEBUGOPTS="--disable-debug_flag --disable-debug_info"
  fi

  if [ "$DOSHARED" = yes ]
  then
 	SHAREDFLAG="--enable-shared --disable-static"
  else
	SHAREDFLAG="--disable-shared --enable-static"
  fi

  rm -f wxWindows/*.cache
  cd wxWindows && \
  ($MAKE clean || true ) && \
  autoconf && \
	./configure \
	$SHAREDFLAG \
	--with-gtk --disable-joystick \
	$DEBUGOPTS \
	--prefix=$WXPREFIX \
	--disable-optimise >config.output && \
  ($MAKE -k && $MAKE -k install) >/dev/null
  if [ $? != 0 ]
  then
    echo "Building wxWindows failed."
  fi
else
   echo "Skipping build of wxWindows."
fi	# if $DOWXWIN

echo "##################################################################"
echo "Setting up Mahogany build."
echo "##################################################################"

PATH="$WXPREFIX/bin:$PATH"
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$WXPREFIX/lib   
export LD_LIBRARY_PATH

NAME=$MNAME
VERSION=$MVERSION    

export NAME VERSION

cd $BUILDDIR

if [ $USETARSRC = yes ]
then
  rm -r -f M
  cat $HOME/Mahogany.tar.gz | gzip -dc | tar xf -
  if [ $? != 0 ] 
  then
    echo "Unpacking $HOME/Mahogany.tar.gz failed."
    exit 1
  fi
else # build from cvs
  if [ ! -d $NAME-$VERSION ]
  then
    echo "$NAME-$VERSION directory does not exist. Doing fresh checkout. $MTAG"
    rm -rf M
    (HOME=$REALHOME; $CVS -d "$MCVSROOT" -q checkout $MTAG M libmal 2>&1) && \
    mv M $NAME-$VERSION
  else
    echo "Updating Mahogany sources. $MTAG"
    (HOME=$REALHOME; cd $NAME-$VERSION && $CVS -d "$MCVSROOT" -q update -d $MTAG 2>&1)
  fi
  if [ $? -gt 1 ]
  then
    echo "Calling CVS failed - exiting."
    exit 2
  fi
fi

PATH="/sbin:/usr/sbin:$PATH:$WXPREFIX/bin"
export PATH

# Docs are only generated on our master doc host "$DOCHOST":
if [ `hostname` != $DOCHOST ]
then
  echo "Copying documentation Mdocs.tar.gz to $BUILDDIR/$NAME-$VERSION/doc"
  $SCP $FTPLOCATION/Mdocs.tar.gz $BUILDDIR/$NAME-$VERSION/doc
else
  if [ -f $BUILDDIR/$NAME-$VERSION/doc/Mdocs.tar.gz ]
  then
    echo "Removing old documentation archive."
    rm -f $BUILDDIR/$NAME-$VERSION/doc/Mdocs.tar.gz
  fi
fi
rm -f $NAME-$VERSION/*.cache

###########################
# DEBIAN
###########################
if [ "$DEBIAN" = "yes" ]
then
  echo "##################################################################"
  echo "Building Debian package."
  echo "##################################################################"
  DEBIAN_VERSION=`cat /etc/debian_version`
  if [ "$DEBIAN_VERSION" != "2.1" -a "$DEBIAN_VERSION" != "2.0" ]
  then
    DEBUILD="debuild"
  else
    DEBUILD="build"
  fi
  rm -f $NAME_$VERSION_*.deb
  (cd $NAME-$VERSION && $DEBUILD)
  test -f $NAME_$VERSION_*.deb
  if [ $? != 0 ]
  then
    echo "Build of $NAME-$VERSION failed."
  else
    if [ "$DEBIAN_FLAVOUR" != "Debian" ]
    then
      mv mahogany_*.deb `basename mahogany_*.deb .deb`-$DEBIAN_FLAVOUR.deb
    fi
    if [ "$DOINSTALL" = "yes" ] ; then
	# do not install locally        (cd $NAME-$VERSION && super debi)
        $SCP mahogany_* $FTPLOCATION
    fi
    echo "Build of $NAME-$VERSION, debian, successful."
    UPLOADWXGTK=yes # cause wxWindow snapshot to be generated
  fi
fi

############################
## RedHat Linux
############################
if [ $REDHAT = yes ]
then
  echo "##################################################################"
  echo "Building RedHat package"
  echo "##################################################################"
  cd $BUILDDIR && \
  (cd $NAME-$VERSION && make allclean 2>/dev/null 2>&1 || true) && \
  $SCP $FTPLOCATION/Mdocs.tar.gz $BUILDDIR/$NAME-$VERSION/doc && \
  tar czf /usr/src/redhat/SOURCES/$NAME-$VERSION.tar.gz $NAME-$VERSION && \
  cp $BUILDDIR/$NAME-$VERSION/redhat/M.spec /usr/src/redhat/SPECS/M.spec && \
  cp $BUILDDIR/$NAME-$VERSION/redhat/mahogany.gif /usr/src/redhat/SOURCES && \
  cd /usr/src/redhat/ && \
  rpm -ba SPECS/M.spec
  if [ "$DOINSTALL" = "yes" ] ; then
	  $SCP RPMS/i386/$NAME*.rpm $FTPLOCATION && rm RPMS/i386/$NAME*.rpm
	  $SCP SRPMS/$NAME*.rpm $FTPLOCATION && rm SRPMS/$NAME*.rpm
  fi
fi

###########################
# .tar.gz
###########################
if [ "$DEBUG" = "yes" ] ; then
	DEBUGOPTS="--with-debug --with-wxdebug"
else
	DEBUGOPTS="--without-debug"
fi
echo "##################################################################"
echo "Building tar.gz package."
echo "##################################################################"
cd $BUILDDIR
( cd $NAME-$VERSION && ( $MAKE clean >/dev/null 2>&1 ; \
  rm -f configure ; autoconf && ./configure $DEBUGOPTS --prefix=$MPREFIX $MCONFOPT>config.output && \
  ( $MAKE depend >/dev/null 2>&1 ; $MAKE all >/dev/null) ))

if [ $? = 0 ]
then
  rm -rf $DESTDIR; mkdir $DESTDIR
  if [ `hostname` = $DOCHOST ]
  then
    echo "Building and packaging documentation..."
    ( cd $BUILDDIR/$NAME-$VERSION && $MAKE doc && $MAKE install DESTDIR=$DESTDIR ) >/dev/null
    echo "Copying docs in $DESTDIR/share/Mahogany/doc to WWW..."
    ( cd $DESTDIR/share/Mahogany/doc &&  $SCP -r * $WWWDOCLOCATION )
    echo "Packing docs in $DESTDIR/share/Mahogany/doc..."
    (cd $DESTDIR/share/Mahogany/doc && \
	tar czvf /tmp/Mdocs.tar.gz * && $SCP /tmp/Mdocs.tar.gz $FTPLOCATION)
    rm -f /tmp/Mdocs.tar.gz
  else
    echo "Copying documentation from ftp server."
    $SCP $FTPLOCATION/Mdocs.tar.gz $BUILDDIR/$NAME-$VERSION/doc/
  fi

  cd $BUILDDIR/$NAME-$VERSION && $MAKE install DESTDIR=$DESTDIR  >/dev/null && \
  cd $DESTDIR && tar cvf $BUILDDIR/$NAME-$VERSION-$OSTYPE$OSTYPE_ADDON$ADDON.tar * && \
  gzip -f -9 $BUILDDIR/$NAME-$VERSION-$OSTYPE$OSTYPE_ADDON$ADDON.tar

else
  echo "Build of $NAME-$VERSION.tar.gz, failed."
fi

if [ "$DOINSTALL" = "yes" ] ; then
	(cd $BUILDDIR; $SCP $NAME-*.gz $FTPLOCATION) 
fi


#######################################
## Upload wxWindows shared lib to ftp
#######################################
if [ $DOSHARED = yes -a $DOINSTALL = yes ]
then
  echo "Uploading wxWindows shared library to ftp server"
  cd $WXPREFIX && \
  tar cvf wxGTK-SharedLibs-$OSTYPE$OSTYPE_ADDON$ADDON.tar lib/libwx_gtk* && \
  gzip -f -9 wxGTK-SharedLibs-$OSTYPE$OSTYPE_ADDON$ADDON.tar && \
  $SCP wxGTK-SharedLibs-$OSTYPE$OSTYPE_ADDON$ADDON.tar.gz $FTPLOCATION && \
  rm -f wxGTK-SharedLibs-$OSTYPE$OSTYPE_ADDON$ADDON.tar*
fi

##########################################################
## Build $HOME/wxWindows.tar.gz and $HOME/Mahogany.tar.gz
##########################################################
if [ $MKTARSRC = yes ]
then
  echo "Cleaning and building $HOME/wxWindows.tar.gz"
  cd $BUILDDIR/wxWindows && ($MAKE clean; rm -f *cache ) >/dev/null 2>&1
  cd $BUILDDIR && \
  (tar cf $HOME/wxWindows.tar wxWindows && gzip -f -9 $HOME/wxWindows.tar)
  echo "Cleaning and building $HOME/Mahogany.tar.gz"
	
  cd $BUILDDIR/$MNAME-$MVERSION && ($MAKE allclean; rm -f *cache ) >/dev/null 2>&1
  # before packaging source, remove libmal:
  echo "Removing libmal from source tree"
  (cd $BUILDDIR/$NAME-$VERSION/extra/src && \
    rm -rf libmal )
  
    cd $BUILDDIR && \
      (mv $MNAME-$MVERSION M && tar cf $HOME/Mahogany.tar M && gzip -f -9 $HOME/Mahogany.tar)
  	mv $BUILDDIR/M $BUILDDIR/$MNAME-$MVERSION
fi

############################
## Upload wxWindows to ftp
############################
if [ $UPLOADWXGTK = yes -a $DOINSTALL = yes ]
then
  echo "Cleaning and uploading wxGTK snapshot"
  cd $BUILDDIR/wxWindows && ($MAKE clean; rm -f *cache ) >/dev/null 2>&1
  cd $BUILDDIR && \
    (tar cf wxWindows.tar wxWindows && gzip -f -9 wxWindows.tar) && \
    $SCP wxWindows.tar.gz $FTPLOCATION && rm -f wxWindows.tar.gz
fi
