In SCons, you don't have to call an external command
to build a file.
You can, instead, define a Python function
that a Builder
object can invoke
to build your target file (or files).
Such a builder function
definition looks like:
def build_function(target, source, env): # Code to build "target" from "source" return None
The arguments of a builder function
are:
A list of Node objects representing
the target or targets to be
built by this builder function.
The file names of these target(s)
may be extracted using the Python str
function.
A list of Node objects representing
the sources to be
used by this builder function to build the targets.
The file names of these source(s)
may be extracted using the Python str
function.
The construction environment
used for building the target(s).
The builder function may use any of the
environment's construction variables
in any way to affect how it builds the targets.
The builder function must
return a 0
or None
value
if the target(s) are built successfully.
The builder function
may raise an exception
or return any non-zero value
to indicate that the build is unsuccessful,
Once you've defined the Python function
that will build your target file,
defining a Builder
object for it is as
simple as specifying the name of the function,
instead of an external command,
as the Builder
's
action
argument:
def build_function(target, source, env): # Code to build "target" from "source" return None bld = Builder(action = build_function, suffix = '.foo', src_suffix = '.input') env = Environment(BUILDERS = {'Foo' : bld}) env.Foo('file')
And notice that the output changes slightly, reflecting the fact that a Python function, not an external command, is now called to build the target file:
% scons -Q
build_function(["file.foo"], ["file.input"])