The env.AddMethod(function, [name]) function is used to add a method to an environment. It's typically used to add a "pseudo-builder" or wrap up a call to multiple builders. In the first example, we want to install the program into the standard bin dir, but also copy it into a local install/bin dir that might be used to build a package from.
def install_in_bin_dirs(env, source): """Install source in both bin dirs""" i1 = env.Install("$BIN", source) i2 = env.Install("$LOCALBIN", source) return [i1[0], i2][0] # Return a list, like a normal builder env = Environment(BIN='/usr/bin', LOCALBIN='#install/bin') env.AddMethod(install_in_bin_dirs, "InstallInBinDirs") env.InstallInBinDirs(Program('hello.c')) # installs hello in both bin dirs
This produces the following:
% scons -Q cc -o hello.o -c hello.c cc -o hello hello.o Install file: "hello" as "install/bin/hello"
It also gives more flexibility in parsing arguments than you can get with a builder. The next example shows a pseudo-builder with a named argument that modifies the filename, and a separate argument for the resource file (rather than having the builder figure it out by file extension). Also this example demonstrates using the global AddMethod function to add a method to the global Environment class, so it will be used in all subsequently created environments.
import sys def BuildTestProg(env, testfile, resourcefile, testdir="tests"): """Build the test program; prepends "test_" to src and target, and puts target into testdir.""" srcfile="test_%s.c"%testfile if sys.platform=='win32': target="%s/test_%s$EXESUFFIX"%(testdir,[testfile, resourcefile]) else: target="%s/test_%s$EXESUFFIX"%(testdir,testfile) p = env.Program(target, srcfile) return p AddMethod(Environment, BuildTestProg) # Now use it env=Environment() env.BuildTestProg('stuff', resourcefile='res.rc')
This produces the following (on Linux, anyway; Windows would include the resource file):
% scons -Q cc -o test_stuff.o -c test_stuff.c cc -o tests/test_stuff test_stuff.o