Add scan-build support to the build system.
authorPatrick Georgi <patrick.georgi@coresystems.de>
Sun, 14 Mar 2010 21:25:03 +0000 (21:25 +0000)
committerPatrick Georgi <patrick.georgi@coresystems.de>
Sun, 14 Mar 2010 21:25:03 +0000 (21:25 +0000)
When configured in Kconfig, just running "make"
calls scan-build as appropriate (however, it does not
check for the presence of scan-build)

The target directory for the scan-build report is configurable
and defaults to the scan-build default of /tmp/scan-build-$date-$num

abuild is adapted to properly run scanbuild when ran
with the -sb option.

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@5208 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1

Makefile
src/Kconfig
src/arch/i386/Makefile.inc
src/cpu/x86/smm/Makefile.inc
util/abuild/abuild

index 9de0fe5efec383bdadc6d26d89f0a9082bdce9a5..cb556e7f1ddcba6afe9af83d076f94934a09a0f2 100644 (file)
--- a/Makefile
+++ b/Makefile
 ## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
 ##
 
+ifeq ($(INNER_SCANBUILD),y)
+CC_real:=$(CC)
+endif
 $(if $(wildcard .xcompile),,$(eval $(shell bash util/xcompile/xcompile > .xcompile)))
 include .xcompile
+ifeq ($(INNER_SCANBUILD),y)
+CC:=$(CC_real)
+HOSTCC:=$(CC_real) --hostcc
+HOSTCXX:=$(CC_real) --hostcxx
+endif
 
 export top := $(PWD)
 export src := $(top)/src
@@ -90,7 +98,25 @@ endif
 # The primary target needs to be here before we include the
 # other files
 
+ifeq ($(INNER_SCANBUILD),y)
+CONFIG_SCANBUILD_ENABLE:=
+endif
+
+ifeq ($(CONFIG_SCANBUILD_ENABLE),y)
+ifneq ($(CONFIG_SCANBUILD_REPORT_LOCATION),)
+CONFIG_SCANBUILD_REPORT_LOCATION:=-o $(CONFIG_SCANBUILD_REPORT_LOCATION)
+endif
+all:
+       echo '#!/bin/sh' > .ccwrap
+       echo 'CC="$(CC)"' >> .ccwrap
+       echo 'if [ "$$1" = "--hostcc" ]; then shift; CC="$(HOSTCC)"; fi' >> .ccwrap
+       echo 'if [ "$$1" = "--hostcxx" ]; then shift; CC="$(HOSTCXX)"; fi' >> .ccwrap
+       echo 'eval $$CC $$*' >> .ccwrap
+       chmod +x .ccwrap
+       scan-build $(CONFIG_SCANBUILD_REPORT_LOCATION) -analyze-headers --use-cc=$(top)/.ccwrap --use-c++=$(top)/.ccwrap $(MAKE) INNER_SCANBUILD=y
+else
 all: coreboot
+endif
 
 
 #######################################################################
@@ -110,7 +136,12 @@ $(obj)/mainboard/$(MAINBOARDDIR)/static.c: $(src)/mainboard/$(MAINBOARDDIR)/devi
        (cd $(obj)/mainboard/$(MAINBOARDDIR) ; PYTHONPATH=$(top)/util/sconfig export PYTHONPATH; python config.py  $(MAINBOARDDIR) $(top) $(obj)/mainboard/$(MAINBOARDDIR))
 
 $(obj)/mainboard/$(MAINBOARDDIR)/static.o: $(obj)/mainboard/$(MAINBOARDDIR)/static.c
-#
+       @printf "    CC         $(subst $(obj)/,,$(@))\n"
+       $(CC) $(CFLAGS) -c -o $@ $<
+
+$(obj)/arch/i386/../../option_table.o: $(obj)/arch/i386/../../option_table.c
+       @printf "    CC         $(subst $(obj)/,,$(@))\n"
+       $(CC) $(CFLAGS) -c -o $@ $<
 
 objs:=$(obj)/mainboard/$(MAINBOARDDIR)/static.o
 initobjs:=
@@ -325,7 +356,7 @@ clean-for-update: doxygen-clean
        $(MAKE) -C util/sconfig clean
 
 clean: clean-for-update
-       rm -f $(obj)/coreboot*
+       rm -f $(obj)/coreboot* .ccwrap
 
 distclean: clean
        rm -rf $(obj)
index 1331f557e92661b6d979eed5071c520b17e45e15..d361315540780f6a4015673a99d793e9650a05f6 100644 (file)
@@ -46,6 +46,20 @@ config CBFS_PREFIX
          Select the prefix to all files put into the image. It's "fallback"
          by default, "normal" is a common alternative.
 
+config SCANBUILD_ENABLE
+       bool "build with scan-build for static analysis"
+       default n
+       help
+         Changes the build process to scan-build is used.
+         Requires scan-build in path.
+
+config SCANBUILD_REPORT_LOCATION
+       string "directory to put scan-build report in"
+       default ""
+       depends on SCANBUILD_ENABLE
+       help
+         Where the scan-build report should be stored
+
 endmenu
 
 source src/mainboard/Kconfig
index e9a9225d20c2900e426c09e71745e9f8a40ac3ce..018dc9a1001a1a22774b09072060ca84ae2df074 100644 (file)
@@ -60,7 +60,7 @@ $(obj)/coreboot_ram: $(obj)/coreboot_ram.o $(src)/arch/i386/coreboot_ram.ld #ldo
 
 $(obj)/coreboot_ram.o: $(obj)/arch/i386/lib/c_start.o $(drivers) $(obj)/coreboot.a $(LIBGCC_FILE_NAME)
        @printf "    CC         $(subst $(obj)/,,$(@))\n"
-       $(CC) -nostdlib -r -o $@ $(obj)/arch/i386/lib/c_start.o $(drivers) -Wl,-\( $(obj)/coreboot.a $(LIBGCC_FILE_NAME) -Wl,-\)
+       $(CC) -nostdlib -r -o $@ $(obj)/arch/i386/lib/c_start.o $(drivers) -Wl,--start-group $(obj)/coreboot.a $(LIBGCC_FILE_NAME) -Wl,--end-group
 
 $(obj)/coreboot.a: $(objs)
        @printf "    AR         $(subst $(obj)/,,$(@))\n"
index de21d624ce7b377a8dbc3d1e09637a7e1e77666e..014c2c792d886e7cdbf6fe3cdf7df88b801f1974 100644 (file)
@@ -38,5 +38,9 @@ $(obj)/cpu/x86/smm/smm: $(obj)/cpu/x86/smm/smm.o $(src)/cpu/x86/smm/smm.ld $(obj
 $(obj)/cpu/x86/smm/smm_bin.c: $(obj)/cpu/x86/smm/smm
        (echo 'unsigned char smm[] = {'; od -vtx1 $(obj)/cpu/x86/smm/smm | sed -e 's,^[0-9]* *,,' -e 's:[0-9a-f][0-9a-f] :0x&,:g' -e 's:[0-9a-f][0-9a-f]$$:0x&,:'; echo '}; unsigned int smm_len = '; wc -c $(obj)/cpu/x86/smm/smm |awk '{print $$1;}' ; echo ';')  > $@
 
+$(obj)/cpu/x86/smm/smm_bin.o: $(obj)/cpu/x86/smm/smm_bin.c
+       @printf "    CC         $(subst $(obj)/,,$(@))\n"
+       $(CC) $(CFLAGS) -c -o $@ $<
+
 endif
 
index a9633c921591e4504b0829e4e2a487c720827596..1e67685ffbb438e8a485d160fcc4c53908fc10e5 100755 (executable)
@@ -173,6 +173,12 @@ function create_config
                        echo "CONFIG_DEFAULT_CONSOLE_LOGLEVEL_$loglevel=y" >> .config
                        echo "CONFIG_DEFAULT_CONSOLE_LOGLEVEL=$loglevel" >> .config
                fi
+
+               if [ "$scanbuild" = "true" ]; then
+                       printf "(scan-build enabled) "
+                       echo "CONFIG_SCANBUILD_ENABLE=y" >> .config
+                       echo "CONFIG_SCANBUILD_REPORT_LOCATION=\"$TARGET/scan-build-results-tmp\"" >> .config
+               fi
        fi
 
        yes "" | $MAKE oldconfig obj=${build_dir} > ${build_dir}/config.log
@@ -364,21 +370,6 @@ function build_target
                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"