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.