Chapter 20. Not Writing a Builder: the Command Builder

Creating a Builder and attaching it to a construction environment allows for a lot of flexibility when you want to re-use actions to build multiple files of the same type. This can, however, be cumbersome if you only need to execute one specific command to build a single file (or group of files). For these situations, SCons supports a Command Builder that arranges for a specific action to be executed to build a specific file or files. This looks a lot like the other builders (like Program, Object, etc.), but takes as an additional argument the command to be executed to build the file:


     env = Environment()
     env.Command('foo.out', 'foo.in', "sed 's/x/y/' < $SOURCE > $TARGET")
  

When executed, SCons runs the specified command, substituting $SOURCE and $TARGET as expected:


    % scons -Q
    sed 's/x/y/' < foo.in > foo.out
  

This is often more convenient than creating a Builder object and adding it to the $BUILDERS variable of a construction environment

Note that the action you specify to the Command Builder can be any legal SCons Action, such as a Python function:


     env = Environment()
     def build(target, source, env):
         # Whatever it takes to build
         return None
     env.Command('foo.out', 'foo.in', build)
  

Which executes as follows:


    % scons -Q
    build(["foo.out"], ["foo.in"])
  

Note that $SOURCE and $TARGET are expanded in the source and target as well as of SCons 1.1, so you can write:


     env.Command('${SOURCE.basename}.out', 'foo.in', build)
  

which does the same thing as the previous example, but allows you to avoid repeating yourself.