Files
2024-02-19 00:21:16 -05:00

487 lines
9.9 KiB
Bash
Executable File

#!/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".