3 Apr 2011 timj   » (Master)

25.06.2010 Using distcheck with ccache + colorgcc

Waiting for unit compilations to finish during development, particularly with G++ and heavy optimizations can be quite time consuming. A run of make distcheck escalates the problem, because all files during a dist need to be rebuilt. Small errors triggered late in the dist build might require several time consuming restarts of the build process.

With ccache, a tool exists that can majorly speed up this process. I’ve been using it successfully for several years now. A related development aid is colorgcc which is a colorization wrapper for gcc. This also is under heavy use for my development. It turns out that some tweaks are needed to get it working together with ccache though.

Here’s how to use the tools in combination to speed up regular project builds and also distcheck:

  • Get and install ccache.
    Wrapping compiler invocations with ccache will cache recompilations of the same units. ccache needs a directory to store the cache contents; this defaults to ~/.ccache which might not be the best choice for network homes or encrypted homes. Using /tmp is also suboptimal since it is usually cleaned upon reboots. So I’d recommend to put this into your .bashrc:
    export CCACHE_DIR="/var/tmp/ccache-$USER"
    

    This will retain the compiler cache across reboots in /var/tmp.

  • Get and install colorgcc.
    Then some patching is in order, especially if you use multiple versions of gcc and need ccache integration. Based on colorgcc from Ubuntu-9.10, I’ve prepared a patch for this (it has been sent to Jamie Moyers some while ago) to be found here: http://testbit.eu/~timj/blogstuff/xyv-colorgcc.diff

    To briefly summarize its effects:

    • This allows colorgcc to be used through a bunch of links, e.g. by creating:
      ln -s colorgcc colorg++
      ln -s colorgcc colorgcc-4.4
      ln -s colorgcc colorg++-4.4
      

      Invoking the script through those links will cause it to strip the ‘^color’ prefix and invoke the respective compiler.

    • Using this patch, /usr/bin/ccache will be used to wrap the compiler invocation if it exists.
    • The patch also contains some UTF-8 quotation fixes needed for gcc-4.4 support.
    • Finally, the patch enables colorgcc to correctly deal with g++ error message that span multiple lines (e.g. template error messages).
  • Use colorgcc as a compiler replacement for project builds:
    rm -f config.cache
    ./autogen.sh CC=colorgcc-4.4 CXX=colorg++-4.4
    nice make all -j4
    
  • Use colorgcc as a compiler replacement for distcheck builds:
    CC=colorgcc CXX=colorg++ nice make all distcheck
    

Finally, you might want to tweak the colors of colorgcc’s output which can be adjusted in /etc/colorgcc/colorgccrc. FYI, here’s the color setup I prefer to use in a black terminal window:

  srcColor:             bold white
  introColor:           bold magenta
  warningFileNameColor: cyan
  warningNumberColor:   bold cyan
  warningMessageColor:  yellow
  errorFileNameColor:   cyan
  errorNumberColor:     bold cyan
  errorMessageColor:    bold yellow

UPDATE: Fixed ccache default dir thanks to anonymous.

flattr this!

Syndicated 2010-06-25 17:17:16 from Tim Janik

Latest blog entries     Older blog entries

New Advogato Features

New HTML Parser: The long-awaited libxml2 based HTML parser code is live. It needs further work but already handles most markup better than the original parser.

Keep up with the latest Advogato features by reading the Advogato status blog.

If you're a C programmer with some spare time, take a look at the mod_virgule project page and help us with one of the tasks on the ToDo list!