20090310-3-scanbuild:
authorPatrick Georgi <patrick.georgi@coresystems.de>
Wed, 11 Mar 2009 15:43:02 +0000 (15:43 +0000)
committerStefan Reinauer <stepan@openbios.org>
Wed, 11 Mar 2009 15:43:02 +0000 (15:43 +0000)
Add support for clang's scan-build utility to abuild. scan-build wraps
the compiler and runs its own compiler on the same sources to do some
static analysis on them. It adds an option "-sb" or "--scan-build" that
creates a coreboot-builds/$target-scanbuild directory for every $target,
containing the output of scan-build, which is a HTML documentation on
its results.
Be aware, that scanbuild significantly increases build time: A board
that takes 6-7 seconds normally requires 60 seconds with that option
enabled on my test system.
The patch also moves the stack-protector option down a bit, so it
applies to crosscompiled targets, too (which overwrote the compiler
settings before)

Signed-off-by: Patrick Georgi <patrick.georgi@coresystems.de>
Acked-by: Stefan Reinauer <stepan@coresystems.de>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3996 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1

util/abuild/abuild

index ae4129fa434698c92a21a65cfdf06093a8ac06c7..fe8f8fd0315350d5ad4e5556b9c998421cb3ee47 100755 (executable)
@@ -46,6 +46,9 @@ mode=text
 # this is disabled per default but can be enabled with -s
 silent=
 
+# clang mode enabled by -sb option.
+scanbuild=false
+
 # stackprotect mode enabled by -ns option.
 stackprotect=false
 
@@ -334,9 +337,7 @@ function build_target
                CROSS_COMPILE="$TARCH-elf-"
                found_crosscompiler=true
        fi
-       if  [ "$stackprotect" = "true" ]; then
-               CC="$CC -fno-stack-protector"
-       fi
+
        HOSTCC='gcc'
 
        printf "Processing mainboard/$VENDOR/$MAINBOARD"
@@ -396,6 +397,25 @@ function build_target
                fi
        fi
 
+       if  [ "$stackprotect" = "true" ]; then
+               CC="$CC -fno-stack-protector"
+       fi
+
+       if  [ "$scanbuild" = "true" ]; then
+               ccwrap=`mktemp`
+               mkdir -p $TARGET/${VENDOR}_${MAINBOARD}
+               mkdir -p $TARGET/scan-build-results-tmp
+               mv $ccwrap $TARGET/${VENDOR}_${MAINBOARD}
+               ccwrap=$TARGET/${VENDOR}_${MAINBOARD}/`basename $ccwrap`
+               echo '#!/bin/sh' > $ccwrap
+               echo $CC' "$@"' >> $ccwrap
+               chmod +x $ccwrap
+               origMAKE=$MAKE
+               MAKE="scan-build --use-cc=$ccwrap -o $TARGET/scan-build-results-tmp -analyze-headers $MAKE GCC=$ccwrap"
+               CC="\$(CC)"
+               HOSTCC="CCC_CC=$HOSTCC \$(CC)"
+       fi
+
        built_successfully $VENDOR $MAINBOARD && \
        {
                printf " ( mainboard/$VENDOR/$MAINBOARD previously ok )\n\n"
@@ -419,6 +439,10 @@ function build_target
                compile_target $VENDOR $MAINBOARD && 
                        xml "  <status>ok</status>" ||
                        xml "<status>broken</status>"
+               if [ "$scanbuild" = "true" ]; then
+                       mv `dirname $TARGET/scan-build-results-tmp/*/index.html` $TARGET/${VENDOR}_${MAINBOARD}-scanbuild
+                       MAKE=$origMAKE
+               fi
        fi
 
        xml ""
@@ -484,6 +508,7 @@ function myhelp
        printf "    [-c|--cpus <numcpus>]         build on <numcpus> at the same time\n"
        printf "    [-s|--silent]                 omit compiler calls in logs\n"
        printf "    [-ns|--nostackprotect]        use gcc -fno-stack-protector option\n"
+       printf "    [-sb|--scan-build]            use clang's static analyzer\n"
        printf "    [-C|--config]                 configure-only mode\n"
        printf "    [lbroot]                      absolute path to coreboot sources\n"
        printf "                                  (defaults to $LBROOT)\n\n"
@@ -542,6 +567,7 @@ while true ; do
                -c|--cpus)      shift; cpus="$1"; test "$cpus" == "max" && cpus=""; shift;;
                -s|--silent)    shift; silent="-s";;
                -ns|--nostackprotect) shift; stackprotect=true;;
+               -sb|--scan-build) shift; scanbuild=true;;
                -C|--config)    shift; configureonly=1;;
                --)             shift; break;;
                -*)             printf "Invalid option\n\n"; myhelp; exit 1;;