summaryrefslogblamecommitdiffstats
path: root/coverity/do_coverity
blob: 1a7fdd788a141225888b0c89052f850cf4f8db17 (plain) (tree)






































































                                                                         
                                                        
                                               
                                                        































































                                                                           
#! /bin/sh
#
#  This script automates running Coverity on RTEMS and submitting
#  the results.
#
#       + Instructions: http://scan.coverity.com/self-build/
#       + Results:      http://scan2.coverity.com:9104/
#
#  You have to have an account to view the results
# 
# NOTE:
#    + You have to be joel to run and submit official results.
#    + build.raw is very important if something goes wrong
# 
#  $Id$
#

#
# TODO:
#   + parse arguments for some of the hard-coded items.
#   + better instructions on setup. Where to download, etc.
#

RTEMS_BIN=/opt/rtems-4.11/bin
COVERITY=${HOME}/prevent-linux-2.4.6
RTEMS_TARGET=sparc-rtems4.11
RTEMS_BSP=sis
#RTEMS_TARGET=i386-rtems4.11
#RTEMS_BSP=pc386

do_mail="yes"

#
#  Checks the status returned by executables and exits if it is non-zero.
#
check_fatal()
{
  if [ $1 -ne 0 ] ; then
    shift
    echo "ERROR: $*" >&2
    exit 1
  fi
}

type ${RTEMS_TARGET}-gcc
check_fatal $? "gcc not in path"

test -d ${COVERITY}
check_fatal $? "Coverity path not right"

test -d ${COVERITY}/bin
check_fatal $? "${COVERITY}/bin does not exist"

test ${LOGNAME} = "joel"
check_fatal $? "For now, Coverity must be run by joel"

# Prepend Coverity to our PATH
export PATH=${COVERITY}/bin:$PATH

# Configure Coverity for this target compiler
rm -rf ${COVERITY}/config/coverity_config.xml
rm -rf ${COVERITY}/config/gcc-config-? ${COVERITY}/config/g++-config-?

cov-configure -co ${RTEMS_BIN}/${RTEMS_TARGET}-gcc
check_fatal $? "could not coverity configure GCC"
cov-configure -co ${RTEMS_BIN}/${RTEMS_TARGET}-g++
check_fatal $? "could not coverity configure g++"

# Clean build directory and start over
rm     -rf  b-coverity-${RTEMS_TARGET}
check_fatal $? "Could not remove build directory"
mkdir  -p   b-coverity-${RTEMS_TARGET}/b-${RTEMS_TARGET}
check_fatal $? "Could not make build directory"
cd          b-coverity-${RTEMS_TARGET}/b-${RTEMS_TARGET}
check_fatal $? "Could not cd to build directory"

# Configure RTEMS
$r/configure --target=${RTEMS_TARGET} --enable-multilib \
  --disable-networking --disable-itron --disable-tests \
  --enable-rtemsbsp=${RTEMS_BSP} >c.log 2>&1
check_fatal $? "could not configure RTEMS"

# Build RTEMS
cov-build -e emit -o output make -C ${RTEMS_TARGET}/cpukit >b.log 2>&1
check_fatal $? "could not make RTEMS"

# Did we have problems loading the Coverity dynamic library?
grep -i "ERROR: ld.so:.*" b.log >/dev/null
if [ $? -ne 1 ] ; then
  check_fatal 1 "Looks like you have dynamic library issues with Coverity."
fi

# Did Coverity report something bad?
grep -i cata output/build.raw >/dev/null
if [ $? -ne 1 ] ; then
  check_fatal 1 "Catastrophic failures reported by coverity."
fi

# Did Coverity report that it had no results?
grep -i "No files were emitted" output/build.raw >/dev/null
if [ $? -ne 1 ] ; then
  check_fatal 1 "No output from Coverity.  Something went wrong."
fi

# Construct the README that is needed in project.tgz
cat <<EOF >README
Joel Sherrill
joel.sherrill@gmail.com
RTEMS
EOF

# Now create the tar file that Coverity wants
tar czvf project.tgz README emit output
check_fatal $? "could not make project.tgz"

# If running inside OAR and RTEMS lab, then you will be able to
# copy the results file to the ftp site and submit it to Coverity.
if [ ${do_mail} = "yes" ] ; then
  if [ -d /home/ftp/private/coverity ] ; then
    echo "Placing project.tgz on RTEMS ftp site."
    cp project.tgz /home/ftp/private/coverity/
    echo "Emailing analysis request to Coverity."
    do_mail_coverity
  else
    # There are unfortunately some by hand steps
    cat <<EOF
You do not have NFS access to the RTEMS.org ftp site. So you will have
to copy the project.tgz and email Coverity by hand.
  
(1) scp */project.tgz joel@www.rtems.org:/home/ftp/private/coverity/

(2) Send email to Coverity to request a run. (e.g. do_mail_coverity)
EOF
  fi
fi

# Ran completed OK
exit 0