From: hlu@phys1.physics.wsu.edu (Hongjiu Lu)
Newsgroups: comp.os.linux
Subject: another bug in install.2.x
Date: 17 Aug 92 19:51:39 GMT
Organization: Washington State University

shared/libm.a is deleted by mistake. This is the new one.

-- 
H.J.
Gcc/libc maintainer for Linux.
----
#!/bin/sh
# installation of gcc 2.xxx

# do something to kernel souce
kernelstuff ()
{
  workdir=$1
  srcdir=$2

# we may have something in there.

  for d in asm linux; do
    if [ -d /usr/include/${d} ]; then
      for f in /usr/include/${d}/*.h; do
	if [ -f $f ]; then 
	  mv $f ${srcdir}/include/$d
	fi
      done
      /bin/rm -rf /usr/include/${d}
    fi
  done
}

# install jump table
jumptable ()
{
  DIR=$1
  VER=$2
  REL=$3
  M=$4

  mv $DIR/libc.so.${REL} /lib
  mv $DIR/lib${M}.so.${REL} /lib/libm.so.${REL}

  ln -s -f /lib/libc.so.${REL} /lib/libc.so.${VER}
  ln -s -f /lib/libm.so.${REL} /lib/libm.so.${VER}
}

checkreturn ()
{
  if [ $? != 0 ]
  then
    echo Failed to $1.
    exit 1
  fi
}

fixfiles ()
{
  VERBOSE=$1
  VER=$2
  BINS=$3

  if [ $VERBOSE = yes ]; then set -x; fi

  cd /usr/bin
  chown bin:bin $BINS
  chmod 755 $BINS

  chown -R bin:bin /usr/include /usr/g++-include /lib /usr/lib/gcc-lib
  chmod -R 755 /lib /usr/lib/gcc-lib

  # this is for the header files
  chmod 755 /usr/include /usr/g++-include
  # Yes, 'find' would be cleaner and faster, but it is not on rootdisk
  cd /usr/include
  chmod 775 *
  chmod 664 *.h
  chmod 664 */*
  cd /usr/g++-include
  chmod 775 *
  chmod 664 *.h
  chmod 664 */*

  chmod 664 /usr/lib/gcc-lib/i386-linux/${VER}/*.?
  chmod 664 /usr/lib/gcc-lib/i386-linux/${VER}/shared/*.?
}

# check if it is a directory.
checkdir ()
{
  if [ x${1}x = xx ]
  then
    echo No directory to check.
    return 1
  fi

  for f in $*
  do
    if [ ! -d $f ]; then
      echo There is no such a directory, $f.
      echo Please make sure there is one and it has right stuffs in it.
      exit 1
    fi
  done
  return 0
}

checkbinfile ()
{
  for f in $*
  do
    if [ ! -f /bin/$f -a ! -f /usr/bin/$f ]; then
      echo There is no such a file, $f.
      return 1
    fi
  done
  return 0
}

checkfile ()
{
  if [ x${1}x = xx ]
  then
    echo No file to check.
    return 1
  fi

  for f in $*
  do
    if [ ! -f $f ]; then
      echo There is no such a file, $f.
      echo Please make sure there is one and it has right stuffs in it.
      exit 1
    fi
  done
  return 0
}

checkroot ()
{
  uid=`id | sed -e 's/uid=\([0-9]*\)/\1/' -e 's/[^a-z0-9=].*//'`
  if [ $? != 0 ]
  then
    echo Fail to get \"root\" id. You may need a working \"id\" and
    echo \"sed\".
    exit 1
  fi

  if [ x${uid}x != x0x ]
  then
    echo You have to be root to run this script.
    exit 1
  fi
}

usage ()
{
  echo Usage: sh $1 [-v] version {kernel src dir}
  echo Note: \"sh\" must be zsh or bash.
  exit 1
}

checkroot

VERBOSE=no

if [ $# != 2 -a $# != 3 ]
then
  usage $0
fi

case $1 in
-v)
  shift
  set -x
  VERBOSE=yes
  ;;
esac

if [ $# != 2 ]
then
  usage $0
fi

VERSION=$1
echo Installing gcc ${VERSION} ......

# kernel src dir
KERNELSRCDIR=$2

#ln is not on rootdisk, let's use cp
#LN="cp -s"
#HDLN="cp -l"
LN="ln -s"
HDLN="ln"
MV="mv -f"
RM=/bin/rm
PREFIX=/usr
#LN="echo ln"
#MV="echo mv"
#PREFIX=/local
LIBDIR=${PREFIX}/lib/gcc-lib/i386-linux/${VERSION}
SHAREDLIBDIR=${LIBDIR}/shared
JUMPLIBDIR=${LIBDIR}/jump
SHIMAGEDIR=/lib

# change it by hand
JUMP_VERSION=2
JUMP_RELEASE=${JUMP_VERSION}.2

#create directories first

if [ -f $SHIMAGEDIR ]
then
  echo $SHIMAGEDIR should be directory. Remove it first!
  exit 1
fi

if [ ! -d $SHIMAGEDIR ]
then
  mkdir $SHIMAGEDIR
 if [ $? != 0 ]
 then
   echo Unable to create directory: $SHIMAGEDIR. You may have to create
   echo some paths in $SHIMAGEDIR first by hand.
   exit 1
  fi
fi

echo gcc ${VERSION} will only work with a 387 or the kernel above 0.95.
# ask if there is a 387.
echo "Do you have a 387? [y/n] "
read MATH
if [ x${MATH}x = "xyx" ]
then
  MATH=hard
else
  MATH=soft
fi

echo Check if we get the files.
WORKDIR=`echo ${VERSION}*`
if [ "${WORKDIR}" = "${VERSION}""*" ]
then
  echo No files to install. You need at least
  echo 1. ${VERSION}misc.tar.Z
  echo 2. ${VERSION}db.tar.Z
  echo "3. ${VERSION}lib.tar.Z"
  if [ ${VERSION} = 2.2.2d ]; then
    echo "4. binutils.tar.Z"
  else
    echo "4. binutils.tar.Z (optional)"
  fi
  echo "5. xxxinc.tar.Z (header files also used by kernel source)"
  exit 1
fi

KERNELINC=`echo *inc.ta*`
if [ "${KERNELINC}" = "*"inc.ta"*" ]
then
  echo You need xxxinc.tar.Z for the whole set of the header files
  echo to use gcc ${VERSION}.
  exit 1
fi

echo Check ${VERSION}db.tar.Z and ${VERSION}misc.tar.Z
checkfile ${VERSION}db.tar.Z ${VERSION}misc.tar.Z

# check those
BINS="as86 ld86 ar as gprof ld nm objdump ranlib size strip"
echo Check binaries.
checkbinfile "${BINS}"
if [ $? != 0 -o ${VERSION} = 2.2.2d ]
then
  checkfile binutils.tar.Z
fi

LIBFILE=

# optional in gcc 2.2.2d. false.
if [ ${VERSION} != xxxxxxx ]
then
  checkfile ${VERSION}lib.tar.Z
  LIBFILE=${VERSION}lib.tar.Z
else
  # maybe it has gcc 2.2.2 file.
  if [ -f 2.2.2lib.tar.Z ]; then
    BBFILE=2.2.2lib.tar.Z
  else
    OLDLIBDIR=/usr/lib/gcc-lib/i386-linux/2.2.2
    # it neens gcc 2.2.2d file.
    if [ ! -d ${OLDLIBIR} ]; then
      checkfile ${VERSION}lib.tar.Z
      LIBFILE=${VERSION}lib.tar.Z
    else
      # can I use gcc 2.2.2
      if [ ! -f ${OLDLIBDIR}/cc1 -o ! -f ${OLDLIBDIR}/cc1plus ]
      then
	checkfile ${VERSION}lib.tar.Z
	LIBFILE=${VERSION}lib.tar.Z
      fi
    fi
  fi
fi

# double check the kernel sources
checkdir $KERNELSRCDIR
checkdir $KERNELSRCDIR/include/linux $KERNELSRCDIR/include/asm

WORKDIR=`pwd`

cd /usr

# optional
if [ -f ${WORKDIR}/binutils.tar.Z ]
then
  echo installing binutils.tar.Z
#  tar xvvofz ${WORKDIR}/binutils.tar.Z
  zcat ${WORKDIR}/binutils.tar.Z | tar xvvof -
fi

# optional
if [ x${LIBFILE}x != xx ]
then
  echo installing ${LIBFILE}
# tar xvvofz ${WORKDIR}/${LIBFILE}
  zcat ${WORKDIR}/${LIBFILE} | tar xvvof -
fi

echo installing ${VERSION}db.tar.Z.
#tar xvvofz ${WORKDIR}/${VERSION}db.tar.Z
zcat ${WORKDIR}/${VERSION}db.tar.Z | tar xvvof -

echo installing ${VERSION}misc.tar.Z.
#tar xvvofz ${WORKDIR}/${VERSION}misc.tar.Z
zcat ${WORKDIR}/${VERSION}misc.tar.Z | tar xvvof -

$RM -rf /usr/include/const.h /usr/include/asm /usr/include/linux

echo installing ${KERNELINC}
#tar xvvofz ${WORKDIR}/${KERNELINC}
zcat ${WORKDIR}/${KERNELINC} | tar xvvof -

$RM -rf /usr/include/sys/asy.h

if [ ${VERSION} = xxxxx ]
then
  if [ ! -f ${LIBDIR}/cc1 -o ! -f ${LIBDIR}/cc1plus ]
  then
    if [ x${OLDLIBDIR}x = xx ]
    then
      echo While installing gcc 2.2.2d, you don't have cc1/cc1plus
      echo and you don't have gcc 2.2.2. This installation script is
      echo wrong. Please use
      echo "	sh $0 -v verson [kernel src dir]"
      echo "	Note: \"sh\" must be zsh or bash."
      echo to see what is wrong and report it to hlu@eecs.wsu.edu.
      echo Thanks.
      exit 1
    else
      $HDLN ${OLDLIBDIR}/cc1 ${OLDLIBDIR}/cc1plus ${LIBDIR}
    fi
  fi
fi

#checkfile $LIBDIR/lib$MATH.a
checkfile $LIBDIR/lib$MATH.a \
	$LIBDIR/cpp $JUMPLIBDIR/libc.so.${JUMP_RELEASE} \
	$JUMPLIBDIR/lib${MATH}.so.${JUMP_RELEASE}

# not used
#	$SHAREDLIBDIR/libc.${VERSION} 
#	$SHAREDLIBDIR/lib${MATH}.${VERSION}

if [ -f $SHIMAGEDIR/libc.${VERSION} -o -f $SHIMAGEDIR/libm.${VERSION} ]
then
  echo There is a libc.${VERSION} or libm.${VERSION} in $SHIMAGEDIR.
  echo Do you want to deleted them? [y/n]
  read answer
  if [ x${answer}x = "xyx" ]
  then
    $RM -f $SHIMAGEDIR/libc.${VERSION} $SHIMAGEDIR/libm.${VERSION}
  else
    echo Give up.
    exit 1
  fi
fi

if [ -f $SHIMAGEDIR/libc.so.${JUMP_RELEASE} -o -f $SHIMAGEDIR/libm.so.${JUMP_RELEASE} ]
then
  echo There is a libc.so.${JUMP_RELEASE} or libm.so.${JUMP_RELEASE} in $SHIMAGEDIR.
  echo Do you want to deleted them? [y/n]
  read answer
  if [ x${answer}x = "xyx" ]; then
    $RM -f $SHIMAGEDIR/libc.so.${JUMP_RELEASE} $SHIMAGEDIR/libm.so.${JUMP_RELEASE}
  else
    echo Give up.
    exit 1
  fi
fi

#echo moving the shared image.
#$MV $SHAREDLIBDIR/libc.${VERSION} $SHIMAGEDIR
#$MV $SHAREDLIBDIR/lib${MATH}.${VERSION} $SHIMAGEDIR/libm.${VERSION}

$RM -f $LIBDIR/libm.a
$HDLN $LIBDIR/lib$MATH.a $LIBDIR/libm.a
checkreturn "$HDLN $LIBDIR/lib$MATH.a $LIBDIR/libm.a"

#$HDLN $SHAREDLIBDIR/lib$MATH.a $SHAREDLIBDIR/libm.a
#checkreturn "$HDLN $SHAREDLIBDIR/lib$MATH.a $SHAREDLIBDIR/libm.a"

echo install jump table.
jumptable $JUMPLIBDIR $JUMP_VERSION $JUMP_RELEASE $MATH

$RM -rf /usr/lib/cpp /lib/cpp

$LN $LIBDIR/cpp /usr/lib/cpp
checkreturn "$LN $LIBDIR/cpp /usr/lib/cpp"
$LN $LIBDIR/cpp /lib/cpp
checkreturn "$LN $LIBDIR/cpp /lib/cpp"

if [ -f /usr/include/stddef.h -o -f /usr/include/stdarg.h ]
then
  echo The version-dependent stddef.h and stdarg.h should not be in
  echo /usr/include. Please take a look at
  echo "	/usr/lib/gcc-lib/i386-linux/${VERSION}/include"
  exit 1
fi

if [ ! -f /usr/include/time.h ]
then
  echo You have to install xxxxinc.tar.Z first!
  exit 1
fi

echo "Do you have kernel source on line? [y/n] "
read MATH
if [ $MATH = "n" ]
then
   echo Oops. gcc ${VERSION} needs at least the header files from
   echo the kernel source, i.e. linux/include/linux.
   exit 1
fi

echo Ignore the error message.

$RM -rf ${KERNELSRCDIR}/include/*.h  ${KERNELSRCDIR}/include/sys
if [ -f ${KERNELSRCDIR}/include/a.out.h ]
then
  echo 'Fail to clean ${KERNELSRCDIR}/include/*.h and'
  echo '${KERNELSRCDIR}/include/sys.'
  exit 1
fi

checkdir ${KERNELSRCDIR}/include/asm ${KERNELSRCDIR}/include/linux

kernelstuff $WORKDIR $KERNELSRCDIR

$LN  ${KERNELSRCDIR}/include/asm /usr/include
if [ $? != 0 ]
then
   echo Fail to make a link from ${KERNELSRCDIR}/include/asm to
   echo /usr/include/asm.
   exit 1
fi

$LN ${KERNELSRCDIR}/include/linux /usr/include
if [ $? != 0 ]
then
   echo Fail to make a link from ${KERNELSRCDIR}/include/linux to
   echo /usr/include/linux.
   exit 1
fi

echo No more error messages.

echo Fixing the files.
fixfiles ${VERBOSE} ${VERSION} "${BINS}"

# for future use
# gcc -V 2.xxx will read this file.
cd $LIBDIR
chmod 755 /usr/bin/gcc
/usr/bin/gcc -dumpspecs > specs

if [ $? != 0 ]
then
  echo Error during the installation of gcc ${VERSION}
  exit 1
fi

echo Done! gcc ${VERSION} has been installed.
echo Please get rid of all the \"-nostdinc -I\" from Makefiles in
echo kernel source and then do a fresh "make dep".
Newsgroups: comp.os.linux