On multi-developer software projects, you can sometimes speed up every developer's builds a lot by allowing them to share the derived files that they build. &SCons; makes this easy, as well as reliable.
Specifying the Shared Cache Directory To enable sharing of derived files, use the &CacheDir; function in any &SConscript; file: env = Environment() env.Program('hello.c') CacheDir('cache') hello.c CacheDir('/usr/local/build_cache') Note that the directory you specify must already exist and be readable and writable by all developers who will be sharing derived files. It should also be in some central location that all builds will be able to access. In environments where developers are using separate systems (like individual workstations) for builds, this directory would typically be on a shared or NFS-mounted file system. Here's what happens: When a build has a &CacheDir; specified, every time a file is built, it is stored in the shared cache directory along with its MD5 build signature. On subsequent builds, before an action is invoked to build a file, &SCons; will check the shared cache directory to see if a file with the exact same build signature already exists. If so, the derived file will not be built locally, but will be copied into the local build directory from the shared cache directory, like so: scons -Q scons -Q -c scons -Q
Keeping Build Output Consistent One potential drawback to using a shared cache is that your build output can be inconsistent from invocation to invocation, because any given file may be rebuilt one time and retrieved from the shared cache the next time. This can make analyzing build output more difficult, especially for automated scripts that expect consistent output each time. If, however, you use the --cache-show option, &SCons; will print the command line that it would have executed to build the file, even when it is retrieving the file from the shared cache. This makes the build output consistent every time the build is run: scons -Q scons -Q -c scons -Q --cache-show The trade-off, of course, is that you no longer know whether or not &SCons; has retrieved a derived file from cache or has rebuilt it locally.
Not Retrieving Files From a Shared Cache Retrieving an already-built file from the shared cache is usually a significant time-savings over rebuilding the file, but how much of a savings (or even whether it saves time at all) can depend a great deal on your system or network configuration. For example, retrieving cached files from a busy server over a busy network might end up being slower than rebuilding the files locally. In these cases, you can specify the --cache-disable command-line option to tell &SCons; to not retrieve already-built files from the shared cache directory: scons -Q scons -Q -c scons -Q scons -Q -c scons -Q --cache-disable
Populating a Shared Cache With Already-Built Files Sometimes, you may have one or more derived files already built in your local build tree that you wish to make available to other people doing builds. For example, you may find it more effective to perform integration builds with the cache disabled (per the previous section) and only populate the shared cache directory with the built files after the integration build has completed successfully. This way, the cache will only get filled up with derived files that are part of a complete, successful build not with files that might be later overwritten while you debug integration problems. In this case, you can use the the --cache-force option to tell &SCons; to put all derived files in the cache, even if the files had already been built by a previous invocation: scons -Q --cache-disable scons -Q -c scons -Q --cache-disable scons -Q --cache-force scons -Q -c scons -Q Notice how the above sample run demonstrates that the --cache-disable option avoids putting the built hello.o and hello files in the cache, but after using the --cache-force option, the files have been put in the cache for the next invocation to retrieve.