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