#!/bin/sh
# set -v 
# set -x
#
# Installation script for the tools of the lab that plug on Alliance
#
# Author: Frédéric Pétrot (fred@pasta.fr.ea)
#         for version 0
#
# $Id: instool,v 1.4 1999/09/24 13:24:57 czo Exp $
#

PATH=/asim/gnu/bin:/usr/ucb:/usr/etc:/bin:/usr/bin:/usr/local/bin:${PATH}
export PATH

#rsh ssh et .profile ...

DATE=`/asim/gnu/bin/date +"%Y.%m.%d_%H.%M.%S"`

LOG=$HOME/`basename $0`.$$
BUG=$HOME/`basename $0`_bug.$$

ALCTEAM="alliance-programmers@asim.lip6.fr"
BUGTEAM="fred ludo czo"


# rep par defaut : alliance/archi/$MACHINE
#                  alliance/share/...
TARGET="SunOS Solaris Linux_elf Linux"
LABO=/users/soft5/newlabo/alliance
CELL_EXTENSIONS="al ap vst vbe cp hns edi spi db dat IDX"
CELLS=$LABO/share/cells
ETC=$LABO/share/etc
MANS=$LABO/share/man


echo "    @@@@@@                      @@@@@@@@@@                      @@@@"
echo "      @@                        @   @@   @                        @@"
echo "      @@                       @    @@    @                       @@"
echo "      @@   @@@ @@@     @@@@@@       @@         @@@       @@@      @@"
echo "      @@    @@@   @   @@    @       @@       @@   @@   @@   @@    @@"
echo "      @@    @@    @@  @@@           @@      @@     @@ @@     @@   @@"
echo "      @@    @@    @@   @@@@         @@      @@     @@ @@     @@   @@"
echo "      @@    @@    @@     @@@@       @@      @@     @@ @@     @@   @@"
echo "      @@    @@    @@  @    @@@      @@      @@     @@ @@     @@   @@"
echo "      @@    @@    @@  @@    @@      @@       @@   @@   @@   @@    @@"
echo "    @@@@@@ @@@@  @@@@ @ @@@@@     @@@@@@       @@@       @@@    @@@@@@"
echo
echo "                    Alliance Tools Installation Script"
echo
echo "                  Alliance CAD System 3.2, instool beta0"
echo "                  Copyright (c) now, MASI, CAO-VLSI Team"
echo "                  E-mail support:       cao-vlsi@lip6.fr"
echo
echo "News: "
echo "   the installed binaries are now suffixed '.new'"
echo "   the include are shared"
echo "   the authorized cells extensions are $CELL_EXTENSIONS"
echo "   a log of all installations is available in $HOME/log"
echo "   a message MUST be given for each installation"
echo "   the default shell is now sh"

   if [ $# -lt 2 -o $# -gt 4 ] ; then
      echo "Syntax: `basename $0` [-v] tool-home-directory message"
      exit 1
   fi

   if [ $1 = "-v" ]; then
      verbose=1
      shift
   else 
      verbose=0
   fi

   if [ -z $1 -o -z "${2:-''}" ] ; then
      echo "Syntax: `basename $0` [-v] tool-home-directory message"
      exit 1
   fi

   if [ $verbose -ne 0 ] ; then
      echo "`basename $0` : Checking directories"
   fi

   if [ ! -d $1 ] ; then
      echo "`basename $0` cannot install tool $1"
      echo "Directory $1 doesn't exist!"
      exit 2
   fi

   if [ ! -d $1/labo ] ; then
      echo "`basename $0` cannot install tool $1"
      echo "Directory $1/labo doesn't exist!"
      exit 3
   fi

   for i in $TARGET ; do
      if [ ! -d $1/labo/$i ] ; then
         echo "`basename $0` cannot install tool $1"
         echo "Directory $1/labo/$i doesn't exist!"
         exit 4
      fi
   done

   bin=0; lib=0; inc=0
   for i in $TARGET ; do
      if [ -d $1/labo/$i/bin ] ; then
         bin=`expr $bin + 1`
      fi
      if [ -d $1/labo/$i/lib ] ; then
         lib=`expr $lib + 1`
      fi
      if [ -d $1/labo/$i/include ] ; then
         inc=`expr $inc + 1`
      fi
   done

   if [ $bin  -eq 0 ]; then
      echo "No binaries to install, ..."
      unset bin
   elif [ ! $bin  -eq 3 ]; then
      echo "`basename $0` cannot install tool $1"
      echo "Directory $1/labo/archi/bin doesn't exist on all architectures"
      exit 5
   fi

   if [ $lib  -eq 0 -a $inc -eq 0 ]; then
      echo "No libraries to install, ..."
      unset lib inc
   elif [ ! \( $lib  -eq 3 -a $inc -eq 3 \) ]; then
      echo "`basename $0` cannot install tool $1"
      echo "Directory $1/labo/archi/lib or/and $1/labo/archi/include "
      echo "doesn't exist on all architectures"
      exit 6
   fi

   if [ ${bin:-0} -eq 0 -a ${lib:-0} -eq 0 -a ${inc:-0} -eq 0 ] ; then
      echo "`basename $0` cannot install tool $1"
      echo "Nothing to be installed"
      exit 0
   fi

   trap "rm -f $HOME/*.$$ $LOG; exit 0" 0 1 2 15
   #trap "exit 12" 0 1 2 15

   if [ $verbose -ne 0 ] ; then
      echo "`basename $0` : Checking directories contents for consistency"
   fi

   b=0
   if [ ! ${bin:-0} -eq 0 ]; then
      for i in $TARGET ; do
         ls -1 $1/labo/$i/bin > $HOME/$i.bin.$$ 2> /dev/null
         if [ ! -s $HOME/$i.bin.$$ ] ; then
            b=`expr $b + 1`
         fi
      done
      if [ $b -eq 3 ] ; then
         for i in $TARGET ; do
            echo "Please remove $1/labo/$i/bin since it is empty"
         done
         unset bin
      fi
   fi
   l=0
   h=0
   if [ ! ${lib:-0} -eq 0 ]; then
      for i in $TARGET ; do
         ls -1 $1/labo/$i/lib   > $HOME/$i.lib.$$ 2> /dev/null
         ls -1 $1/labo/$i/lib/*.a | awk -F/ '{print $NF}' > $HOME/$i.lib.a.$$ 2> /dev/null
         diff $HOME/$i.lib.$$ $HOME/$i.lib.a.$$ > /dev/null 2>&1
         if [ ! $? -eq 0 ] ; then
            echo "`basename $0` cannot install tool $1"
            echo "directory $1/labo/$i/lib contains files "
            echo "that do not end with .a"
            exit 7
         fi
         ls -1 $1/labo/$i/include > $HOME/$i.inc.$$ 2> /dev/null
         ls -1 $1/labo/$i/include/*.h | awk -F/ '{print $NF}' > $HOME/$i.inc.h.$$ 2> /dev/null
         diff $HOME/$i.inc.$$ $HOME/$i.inc.h.$$ > /dev/null 2>&1
         if [ ! $? -eq 0 ] ; then
            echo "`basename $0` cannot install tool $1"
            echo "directory $1/labo/$i/include contains files "
            echo "that do not end with .h"
            exit 7
         fi
         if [ ! -s $HOME/$i.lib.$$ ] ; then
            l=`expr $l + 1`
         fi
         if [ ! -s $HOME/$i.inc.$$ ] ; then
            h=`expr $h + 1`
         fi
         if [ \( ! -s $HOME/$i.lib.$$ -a -s $HOME/$i.inc.$$ \) -o \
                \( -s $HOME/$i.lib.$$ -a ! -s $HOME/$i.inc.$$ \) ] ; then
            echo "`basename $0` cannot install tool $1"
            echo "Libraries requires includes and vice-versa"
            exit 7
         fi
      done
      if [ $l -eq 3 ] ; then
            echo "Please remove $1/labo/archi/lib since it is empty "
            unset lib
      fi
      if [ $h -eq 3 ] ; then
            echo "Please remove $1/labo/archi/include since it is empty "
            unset inc
      fi
   fi

   if [ ${bin:-0} -eq 0 -a ${lib:-0} -eq 0 -a ${inc:-0} -eq 0 ] ; then
      echo "`basename $0` cannot install tool $1"
      echo "Nothing to install"
      exit 1
   fi

   DIR=`echo ${bin:+bin} ${lib:+lib} ${inc:+include}`

   bins=0; libs=0; incs=0
   for i in $TARGET ; do
      for j in $TARGET ; do
         if [ ! ${bin:-0} -eq 0 ]; then
            diff $HOME/$j.bin.$$ $HOME/$i.bin.$$ > /dev/null 2>&1
            bins=`expr $bins + $?`
         fi
         if [ ! ${lib:-0} -eq 0 ]; then
            diff $HOME/$j.lib.$$ $HOME/$i.lib.$$ > /dev/null 2>&1
            libs=`expr $libs + $?`
            diff $HOME/$j.inc.$$ $HOME/$i.inc.$$ > /dev/null 2>&1
            incs=`expr $incs + $?`
         fi
      done
   done
   
   if [ $bins -gt 0 -o $libs -gt 0 -o $incs -gt 0 ] ; then
      echo "`basename $0` cannot install tool $1"
      echo "all bin/lib/include directories do not contain the same files"
      echo "for all target architectures"
      exit 8
   fi

   echo "`basename $0`: Checking for space on disk :"
   s=`du -s $1/labo/cells $1/labo/etc $1/labo/man \
               2>/dev/null | tail -1 | cut -f 1`
   for i in $TARGET; do
      for j in $DIR; do
         d=`du -s $1/labo/$i/$j | tail -1 | cut -f 1`
         s=`expr $s + $d`
      done
   done
   a=`df $LABO | sed -e 's/  */	/g' | tail -1 | cut -f 4`

   if [ $verbose -ne 0 ] ; then
      echo "Available disk space $a"
      echo "Required disk space $s"
   fi

   if [ $s -gt $a ] ; then
      echo "`basename $0`: cannot install tool $1"
      echo "Not enough space on device for the installation"
      echo "Ring me again in a few days, ..."
      exit 23
   fi

   if [ $verbose -ne 0 ] ; then
      echo "The real stuff right now, ..."
   fi

   for i in $TARGET ; do
      echo "+---------------------------------------------------" >> $LOG
      echo "Target $i " >> $LOG
      for j in $DIR ; do
         echo "+---------------------" >> $LOG
         echo "directory $j " >> $LOG
         if [ $j = "bin" ] ; then
            for k in $1/labo/$i/$j/*; do
               cp $k $LABO/archi/$i/$j/`basename $k`.$DATE
               if [ $? -ne 0 ] ; then 
                  echo "`basename $0`: cp returned a non-zero exit status"
                  echo "that sucks pretty much so I quit leaving things as is"
                  exit 17
               fi
               rm -f $LABO/archi/$i/$j/`basename $k` > /dev/null 2>&1
               ln -s $LABO/archi/$i/$j/`basename $k`.$DATE $LABO/archi/$i/$j/`basename $k`
               if [ $? -ne 0 ] ; then 
                  echo "`basename $0`: ln returned a non-zero exit status"
                  echo "that sucks pretty much so I quit leaving things as is"
                  exit 17
               fi
            done
         elif [ $j = "lib" ] ; then
            for k in $1/labo/$i/$j/*; do
               cp $k $LABO/archi/$i/$j >> $BUG 2>&1
               if [ $? -ne 0 ] ; then 
                  echo "`basename $0`: cp returned a non-zero exit status"
                  echo "that sucks pretty much so I quit leaving things as is"
                  exit 17
               fi
               if [ $i = "SunOS" ] ; then
                  rsh heavy ranlib $LABO/archi/$i/$j/`basename $k`
               fi
            done
         else
            cp $1/labo/$i/$j/* $LABO/archi/$i/$j >> $BUG 2>&1
            if [ $? -ne 0 ] ; then 
               echo "`basename $0`: cp returned a non-zero exit status"
               echo "that sucks pretty much so I quit leaving things as is"
               exit 17
            fi
         fi
         ls -1 $1/labo/$i/$j | fmt -70 >> $LOG
      done
   done
   for i in $DIR; do
      if [ $i = "lib" ] ; then 
         if [ -f $HOME/libraries.mk.* ] ; then
            echo "`basename $0`: Sorry, somebody is updating libraries.mk"
            echo "waiting until the update is done to finish"
         fi
         while [ -f $HOME/libraries.mk.$$ ]; do
            sleep 2
            echo "Still waiting, ..."
         done
         $HOME/bin/updatelibmk $LABO/archi/SunOS > $HOME/libraries.mk.$$
         mv $ETC/libraries.mk $ETC/libraries.mk.$DATE
         if [ $? -ne 0 ] ; then 
            echo "`basename $0`: mv returned a non-zero exit status"
            echo "while copying libraries.mk to libraries.mk.$$"
            echo "that sucks pretty much so I quit leaving things as is"
            exit 17
         fi
         mv $HOME/libraries.mk.$$ $ETC/libraries.mk
         if [ $? -ne 0 ] ; then 
            echo "`basename $0`: mv returned a non-zero exit status"
            echo "while copying libraries.mk to libraries.mk.$$"
            echo "that sucks pretty much so I quit leaving things as is"
            exit 17
         fi
      fi
   done
   echo >> $LOG
   if [ -s $BUG ] ; then
      mail -s "ALC : Problem while installing `basename $1`" $BUGTEAM < $BUG
   fi
   echo $* | mail -s "ALC : Install of `basename $1`" $ALCTEAM
   cat $LOG >> $HOME/log/`basename $1`.log
   exit 0