Add support to build with ccache in the build system
authorPatrick Georgi <patrick.georgi@coresystems.de>
Thu, 25 Mar 2010 21:45:25 +0000 (21:45 +0000)
committerPatrick Georgi <patrick.georgi@coresystems.de>
Thu, 25 Mar 2010 21:45:25 +0000 (21:45 +0000)
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@5297 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1

Makefile
src/Kconfig
src/arch/i386/Makefile.bootblock.inc
src/arch/i386/Makefile.inc
util/abuild/abuild
util/romcc/romcc.c

index f2fa6fc313f0f7039918b9c9ba779a45b49318c6..2e594e3ffde714424dcaa0d40bcdd28091d0b5b7 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -61,6 +61,7 @@ endif
 endif
 
 CPP:= $(CC) -x assembler-with-cpp -DASSEMBLY -E
+ROMCC:= $(obj)/romcc
 HOSTCC = gcc
 HOSTCXX = g++
 HOSTCFLAGS := -I$(srck) -I$(objk) -g
@@ -85,6 +86,17 @@ HOSTCC:=clang
 endif
 endif
 
+ifeq ($(CONFIG_CCACHE),y)
+CCACHE:=CCACHE_COMPILERCHECK=content $(wildcard $(addsuffix /ccache,$(subst :, ,$(PATH))))
+ifeq ($(CCACHE),)
+$(error ccache selected, but not found in PATH)
+endif
+CC := $(CCACHE) $(CC)
+HOSTCC := $(CCACHE) $(HOSTCC)
+HOSTCXX := $(CCACHE) $(HOSTCXX)
+ROMCC := $(CCACHE) $(ROMCC)
+endif
+
 strip_quotes = $(subst ",,$(subst \",,$(1)))
 
 ARCHDIR-$(CONFIG_ARCH_X86)    := i386
index 5da2973d073d180495c5b9a52e8c6cda5c9c86b5..d9c46076aecc3078ae23268bb4b51e40a19dd292 100644 (file)
@@ -62,6 +62,7 @@ endchoice
 config SCANBUILD_ENABLE
        bool "Build with scan-build for static analysis"
        default n
+       depends on !CCACHE
        help
          Changes the build process to scan-build is used.
          Requires scan-build in path.
@@ -73,6 +74,13 @@ config SCANBUILD_REPORT_LOCATION
        help
          Where the scan-build report should be stored
 
+config CCACHE
+       bool "ccache"
+       default n
+       help
+         Enables the use of ccache for faster builds.
+         Requires ccache in path.
+
 endmenu
 
 source src/mainboard/Kconfig
index 365ef35fd1bcac2e6e50c3b1fcf6e7fa2baaeabd..e767f30458ddf8e61af3e12bf3daa2c0c59b8a14 100644 (file)
@@ -71,7 +71,7 @@ $(obj)/mainboard/$(MAINBOARDDIR)/bootblock.inc: $(src)/arch/i386/init/$(subst ",
        @printf "    ROMCC      $(subst $(obj)/,,$(@))\n"
        $(CC) -MM -MT$(obj)/mainboard/$(MAINBOARDDIR)/bootblock.inc \
                $< > $(obj)/mainboard/$(MAINBOARDDIR)/bootblock.inc.d
-       $(obj)/romcc $(bootblock_romccflags) $(ROMCCFLAGS) $(INCLUDES) $< -o $@
+       $(ROMCC) -c -S $(bootblock_romccflags) $(ROMCCFLAGS) -I. $(INCLUDES) $< -o $@
 
 $(obj)/bootblock.elf: $(obj)/mainboard/$(MAINBOARDDIR)/bootblock.o $(obj)/bootblock/ldscript.ld
        @printf "    LINK       $(subst $(obj)/,,$(@))\n"
index e09a70cda7b20777343159d5f88799ad952299b4..02fafba086e27575d1657de3359ab842267bf555 100644 (file)
@@ -195,7 +195,7 @@ ROMCCFLAGS ?= -mcpu=p2 -O2
 
 $(obj)/mainboard/$(MAINBOARDDIR)/romstage.inc: $(src)/mainboard/$(MAINBOARDDIR)/romstage.c $(obj)/romcc $(OPTION_TABLE_H) $(obj)/build.h
        printf "    ROMCC      romstage.inc\n"
-       $(obj)/romcc $(ROMCCFLAGS) -include $(obj)/build.h $(INCLUDES) $< -o $@
+       $(ROMCC) -c -S $(ROMCCFLAGS) -include $(obj)/build.h -I. $(INCLUDES) $< -o $@
 
 else
 
index 5aeca0f1f01028c2d240536e3583fb30ea048402..d982835983a0bb7145823a4038a9a7b7ca6f6bf0 100755 (executable)
@@ -55,6 +55,9 @@ silent=
 # clang mode enabled by -sb option.
 scanbuild=false
 
+# use ccache
+ccache=false
+
 # stackprotect mode enabled by -ns option.
 stackprotect=false
 
@@ -174,6 +177,11 @@ function create_config
                        echo "CONFIG_DEFAULT_CONSOLE_LOGLEVEL=$loglevel" >> .config
                fi
 
+               if [ "$ccache" = "true" ]; then
+                       printf "(ccache enabled) "
+                       echo "CONFIG_CCACHE=y" >> .config
+               fi
+
                if [ "$scanbuild" = "true" ]; then
                        printf "(scan-build enabled) "
                        echo "CONFIG_SCANBUILD_ENABLE=y" >> .config
@@ -495,6 +503,7 @@ function myhelp
        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 "    [-y|--ccache]                 use ccache\n"
        printf "    [-C|--config]                 configure-only mode\n"
        printf "    [-l|--loglevel <num>]         set loglevel\n"
        printf "    [lbroot]                      absolute path to coreboot sources\n"
@@ -530,11 +539,11 @@ test "$ROOT" = "" && ROOT=$( cd ../..; pwd )
 getoptbrand="`getopt -V`"
 if [ "${getoptbrand:0:6}" == "getopt" ]; then
        # Detected GNU getopt that supports long options.
-       args=`getopt -l version,verbose,help,all,target:,broken,payloads:,test,cpus:,silent,xml,config,loglevel: Vvhat:bp:Tc:sxCl: -- "$@"`
+       args=`getopt -l version,verbose,help,all,target:,broken,payloads:,test,cpus:,silent,xml,config,loglevel:,ccache Vvhat:bp:Tc:sxCl:y -- "$@"`
        eval set "$args"
 else
        # Detected non-GNU getopt
-       args=`getopt Vvhat:bp:Tc:sxCl:o $*`
+       args=`getopt Vvhat:bp:Tc:sxCl:y $*`
        set -- $args
 fi
 
@@ -559,6 +568,7 @@ while true ; do
                -s|--silent)    shift; silent="-s";;
                -ns|--nostackprotect) shift; stackprotect=true;;
                -sb|--scan-build) shift; scanbuild=true;;
+               -y|--ccache)    shift; ccache=true;;
                -C|--config)    shift; configureonly=1;;
                -l|--loglevel)  shift; loglevel="$1"; shift;;
                --)             shift; break;;
index aee86968af766e8bcff77860d0da8df94cdb49f6..b7c7a01d354bc4a879dda89bc583ff7cd45e5f52 100644 (file)
@@ -24968,10 +24968,14 @@ static void compile(const char *filename,
        state.errout = stderr;
        state.dbgout = stdout;
        /* Remember the output filename */
-       state.output    = fopen(state.compiler->ofilename, "w");
-       if (!state.output) {
-               error(&state, 0, "Cannot open output file %s\n",
-                       state.compiler->ofilename);
+       if ((state.compiler->flags & COMPILER_PP_ONLY) && (strcmp("auto.inc",state.compiler->ofilename) == 0)) {
+               state.output    = stdout;
+       } else {
+               state.output    = fopen(state.compiler->ofilename, "w");
+               if (!state.output) {
+                       error(&state, 0, "Cannot open output file %s\n",
+                               state.compiler->ofilename);
+               }
        }
        /* Make certain a good cleanup happens */
        exit_state = &state;
@@ -25146,6 +25150,12 @@ int main(int argc, char **argv)
                        else if (strncmp(argv[1], "-m", 2) == 0) {
                                result = arch_encode_flag(&arch, argv[1]+2);
                        }
+                       else if (strncmp(argv[1], "-c", 2) == 0) {
+                               result = 0;
+                       }
+                       else if (strncmp(argv[1], "-S", 2) == 0) {
+                               result = 0;
+                       }
                        else if (strncmp(argv[1], "-include", 10) == 0) {
                                struct filelist *old_head = include_filelist;
                                include_filelist = malloc(sizeof(struct filelist));