1#!/bin/sh 2 3# Test GCC. 4# Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. 5 6# This program is free software; you can redistribute it and/or modify 7# it under the terms of the GNU General Public License as published by 8# the Free Software Foundation; either version 2 of the License, or 9# (at your option) any later version. 10 11# This program is distributed in the hope that it will be useful, 12# but WITHOUT ANY WARRANTY; without even the implied warranty of 13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14# GNU General Public License for more details. 15 16# You should have received a copy of the GNU General Public License 17# along with this program; if not, write to the Free Software 18# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 20# INPUT: 21# btest <target> <source> <prefix> <state> <build> 22# TARGET is the target triplet. It should be the same one as used in 23# constructing PREFIX. Or it can be the keyword 'native', indicating 24# a target of whatever platform the script is running on. 25TARGET=$1 26# SOURCE is the directory containing the toplevel configure. 27SOURCE=$2 28 29# PREFIX is the directory for the --prefix option to configure. 30# For cross compilers, it needs to contain header files, 31# libraries, and binutils. PATH should probably include 32# $PREFIX/bin. 33PREFIX=$3 34# This script also needs to include the GDB testsuite in 35# $PREFIX/share/gdb-testsuite. 36GDB_TESTSUITE=$PREFIX/share/gdb-testsuite 37 38# STATE is where the tester maintains its internal state, 39# described below. 40STATE=$4 41 42# BUILD is a temporary directory that this script will 43# delete and recreate, containing the build tree. 44BUILD=$5 45 46# you also probably need to set these variables: 47# PATH: should contain a native gcc, and a cross gdb. 48# DEJAGNU: should point to a site.exp suitable for testing 49# the compiler and debugger. 50 51 52# OUTPUT: in $RESULT, one of the following keywords: 53# error the script failed due to 54# a misconfiguration or resource limitation 55# build the build failed 56# regress-<n> the build succeeded, but there were <n> 57# testsuite regressions, listed in $REGRESS 58# pass build succeeded and there were no regressions 59RESULT=$STATE/RESULT 60# in BUILD_LOG, the output of the build 61BUILD_LOG=$STATE/build_log 62# in FAILED, a list of failing testcases 63FAILED=$STATE/failed 64# in PASSES, the list of testcases we expect to pass 65PASSES=$STATE/passes 66# in REGRESS, a list of testcases we expected to pass but that failed 67REGRESS=$STATE/regress 68 69# Make sure various files exist. 70[ -d $STATE ] || mkdir $STATE 71[ -f $PASSES ] || touch $PASSES 72 73# These lines should stay in this order, because 74# that way if something is badly wrong and $RESULT can't 75# be modified then cron will mail the error message. 76# The reverse order could lead to the testsuite claiming that 77# everything always passes, without running any tests. 78echo error > $RESULT || exit 1 79exec > $BUILD_LOG 2>&1 || exit 1 80 81set -x 82 83# Nuke $BUILD and recreate it. 84rm -rf $BUILD $REGRESS $FAILED 85mkdir $BUILD || exit 1 86cd $BUILD || exit 1 87 88H_BUILD=`$SOURCE/config.guess || exit 1` 89H_HOST=$H_BUILD 90if [ $TARGET = native ] ; then 91 H_TARGET=$H_HOST 92else 93 H_TARGET=$TARGET 94fi 95H_REAL_TARGET=`$SOURCE/config.sub $H_TARGET || exit 1` 96 97# TESTLOGS is the list of dejagnu .sum files that the tester should 98# look at. 99TESTLOGS="gcc/testsuite/gcc.sum 100gcc/testsuite/g++.sum 101gcc/testsuite/g77.sum 102gcc/testsuite/objc.sum" 103# $H_TARGET/libstdc++-v3/testsuite/libstdc++-v3.sum 104 105# Build. 106echo build > $RESULT 107if [ $H_HOST = $H_TARGET ] ; then 108 $SOURCE/configure --prefix=$PREFIX --target=$H_TARGET || exit 1 109 if ! make bootstrap ; then 110 [ -s gcc/.bad_compare ] || exit 1 111 cat gcc/.bad_compare >> $REGRESS || exit 1 112 make all || exit 1 113 fi 114else 115 $SOURCE/configure --prefix=$PREFIX --target=$H_TARGET \ 116 --with-gnu-ld --with-gnu-as --with-newlib || exit 1 117 make || exit 1 118fi 119echo error > $RESULT || exit 1 120 121# Test GCC against its internal testsuite. 122make -k check-gcc 123 124# Test libstd++-v3 125make check-target-libstdc++-v3 126 127# Test the just-built GCC with the GDB testsuite. 128if [ -d $GDB_TESTSUITE ] ; then 129 mkdir test-gdb || exit 1 130 cd $GDB_TESTSUITE || exit 1 131 for i in gdb.* ; do 132 if [ -d $i ] ; then 133 mkdir $BUILD/test-gdb/$i 134 fi 135 done 136 cd $BUILD/test-gdb || exit 1 137 echo "set host_alias $H_HOST" > site.exp 138 echo "set host_triplet $H_HOST" >> site.exp 139 echo "set target_alias $H_TARGET" >> site.exp 140 echo "set target_triplet $H_REAL_TARGET" >> site.exp 141 echo "set build_alias $H_BUILD" >> site.exp 142 echo "set build_triplet $H_BUILD" >> site.exp 143 echo "set srcdir $GDB_TESTSUITE" >> site.exp 144 runtest --tool gdb 145 TESTLOGS="$TESTLOGS test-gdb/gdb.sum" 146fi 147 148# Sanity-check the testlogs. They should contain at least one PASS. 149cd $BUILD || exit 1 150for LOG in $TESTLOGS ; do 151 if ! grep ^PASS: $LOG > /dev/null ; then 152 echo build > $RESULT 153 exit 1 154 fi 155done 156 157# Work out what failed 158for LOG in $TESTLOGS ; do 159 L=`basename $LOG` 160 awk '/^FAIL: / { print "'$L'",$2; }' $LOG || exit 1 161done | sort | uniq > $FAILED || exit 1 162comm -12 $FAILED $PASSES >> $REGRESS || exit 1 163NUMREGRESS=`wc -l < $REGRESS | tr -d ' '` 164if [ $NUMREGRESS -ne 0 ] ; then 165 echo regress-$NUMREGRESS > $RESULT 166 exit 1 167fi 168 169# It passed. Update the state. 170for LOG in $TESTLOGS ; do 171 L=`basename $LOG` 172 awk '/^PASS: / { print "'$L'",$2; }' $LOG || exit 1 173done | sort | uniq | comm -23 - $FAILED > ${PASSES}~ || exit 1 174[ -s ${PASSES}~ ] || exit 1 175mv ${PASSES}~ ${PASSES} || exit 1 176echo pass > $RESULT 177exit 0 178