From: liljeber@klaava.Helsinki.FI (Mika Pekka Liljeberg)
Newsgroups: comp.os.linux
Subject: Re: WANT GCC? FORGET FAQ.GCC AND README??  lets end this, plz!
Date: 5 Sep 92 08:07:51 GMT
	<186a86INNcsb@usenet.INS.CWRU.Edu> <1880h6INNfoh@usenet.INS.CWRU.Edu>
	<188sooINNc6f@usenet.INS.CWRU.Edu>
Organization: Department of Computer Science, University of Helsinki, Finland

In article <188sooINNc6f@usenet.INS.CWRU.Edu> mal11@po.CWRU.Edu (Matthew A. Lewis) wrote:

> again....my apologies to anyone I offended. i guess I was a little too
> excited. BUT LINUX IS WORTH GETTING EXCITED ABOUT. thanx to all the
> testers, ftp admins, and linus himself.
> later......and any help would be appreciated......I'm still stuck with gcc

Sigh. Ok, here's a modified install script I used. I needed to modify it,
because I installed gcc from a DOS partition, where the filename conflict
was a real problem. Just copy all the gcc .tar.Z files into a single directory
along with this install script (use any names you like), configure the file
names at the start of the script and run it. If you still can't get it to work,
please don't flame me. HLU's script was ok, and so is this one. If you get a
mangled file system, your problem is probably somewhere else. Any one of the
utilities used in the script could be broken.

> -- 
> MaThiEu a. LeWis      "There is no middle ground/Or that's how it seems/For 
> Thieves Like Us        us to walk or to take/Instead we tumble down/Either
> mal11@po.cwru.edu      side left or right/To love or to hate."
> 					-A Strange Kind of Love

	Mika

----- install.2x --------------------------------------------------------------
#!/bin/sh
# installation of gcc 2.xxx

# Configure these filenames to suit you
MISCFILE=222dmisc.tz
LIBFILE=222dlib.tz
DBFILE=222ddb.tz
KERNELINC=097p1inc.tz
BINUTILS=binutils.tz

# 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}*`
WORKDIR=yeah
if [ "${WORKDIR}" = "${VERSION}""*" ]
then
  echo No files to install. You need at least
  echo "1. ${MISCFILE}"
  echo "2. ${DBFILE}"
  echo "3. ${LIBFILE}"
  if [ ${VERSION} = 2.2.2d ]; then
    echo "4. ${BINUTILS}"
  else
    echo "4. ${BINUTILS} (optional)"
  fi
  echo "5. ${KERNELINC} (header files also used by kernel source)"
  exit 1
fi

#KERNELINC=`echo *inc.ta*`
if [ ! -f ${KERNELINC} ]
then
  echo You need ${KERNELINC} for the whole set of the header files
  echo to use gcc ${VERSION}.
  exit 1
fi

echo Check ${DBFILE} and ${MISCFILE}
checkfile ${DBFILE} ${MISCFILE}

# 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}
fi

#LIBFILE=

# optional in gcc 2.2.2d. false.
if [ ${VERSION} != xxxxxxx ]
then
  checkfile ${LIBFILE}
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} ]
then
  echo installing ${BINUTILS}
#  tar xvvofz ${WORKDIR}/binutils.tar.Z
#  zcat ${WORKDIR}/binutils.tar.Z | tar xvvof -
  compress -d < ${WORKDIR}/${BINUTILS} | tar xvvof -
fi

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

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

echo installing ${MISCFILE}.
#tar xvvofz ${WORKDIR}/${VERSION}misc.tar.Z
#zcat ${WORKDIR}/${VERSION}misc.tar.Z | tar xvvof -
compress -d < ${WORKDIR}/${MISCFILE} | 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 -
compress -d < ${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 ${KERNELINC} 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".
--
Mika Liljeberg			Email:	liljeber@kruuna.Helsinki.FI
Helsinki University			Mika.Liljeberg@Helsinki.FI
Dept. of Computer Science
Newsgroups: comp.os.linux