OpenEmbedded is a framework for building (linux based) distributions. It's something like "Gentoo for embedded systems".
Ccache is a tool that allows to reuse building results thus gives big speed improvements for frequent rebuilds (>10x faster or more then full rebuild).
For the current project I was given responsiblity for existing build system reorganisation. We have many hardware targets and sometimes full rebuild of whole operating system can take many hours even on strong machine (16 cores in our case).
Of course you can reuse existing build artefacts (*.o files), but sometimes it can be dangerous (we cannot gurantee header dependencies are properly tracked between projects). Thus "whole rebuild" sometimes is necessary.
I need every build will be created using ccache: native (for x86) and for target platform (sh4, mipsel). Ccache allows "integration by symlink": you create symlink from /usr/bin/ccache to /usr/local/bin/cc and ccache will discover compiler binary on PATH (/usr/bin/cc) and call it if necessary (rebuild of given artifact is needed). I used that method of ccache integration.
On the other hand OpenEmbedded allows to insert arbitrary commands before every build using so called "bbclasses" and "*_prepend" methods. Below you will find integration methid applied to very basic OE base class: base.bbclass, thus ensuring every build will use ccache:
openembedded/classes/base.bbclass: (...) do_compile_prepend() { rm -rf ${WORKDIR}/bin ln -sf `which ccache` ${WORKDIR}/bin/`echo ${CC} | awk '{print $1}'` ln -sf `which ccache` ${WORKDIR}/bin/`echo ${CXX} | awk '{print $1}'` export PATH=${WORKDIR}/bin:$PATH export CCACHE_BASEDIR="`pwd`" export CCACHE_LOGFILE=/tmp/ccache.log export CCACHE_SLOPPINESS="file_macro,include_file_mtime,time_macros" export CCACHE_COMPILERCHECK="none" }
As a result you will receive pretty good hit rate during frequent rebuilds:
$ ccache -s cache directory /home/sdk/.ccache cache hit (direct) 50239 cache hit (preprocessed) 27 cache miss 889 called for link 3965 no input file 33506 files in cache 182673 cache size 9.6 Gbytes max cache size 20.0 Gbytes