SCons provides a number of platform-independent functions,
called factories,
that perform common file system manipulations
like copying, moving or deleting files and directories,
or making directories.
These functions are factories
because they don't perform the action
at the time they're called,
they each return an Action
object
that can be executed at the appropriate time.
Copy
Factory
Suppose you want to arrange to make a copy of a file,
and the Install
builder isn't appropriate
because it may make a hard link on POSIX systems.
One way would be to use the Copy
action factory
in conjunction with the Command
builder:
Command("file.out", "file.in", Copy("$TARGET", "$SOURCE"))
Notice that the action returned by the Copy
factory
will expand the $TARGET
and $SOURCE
strings
at the time file.out is built,
and that the order of the arguments
is the same as that of a builder itself--that is,
target first, followed by source:
% scons -Q Copy("file.out", "file.in")
You can, of course, name a file explicitly
instead of using $TARGET
or $SOURCE
:
Command("file.out", [], Copy("$TARGET", "file.in"))
Which executes as:
% scons -Q Copy("file.out", "file.in")
The usefulness of the Copy
factory
becomes more apparent when
you use it in a list of actions
passed to the Command
builder.
For example, suppose you needed to run a
file through a utility that only modifies files in-place,
and can't "pipe" input to output.
One solution is to copy the source file
to a temporary file name,
run the utility,
and then copy the modified temporary file to the target,
which the Copy
factory makes extremely easy:
Command("file.out", "file.in", [ Copy("tempfile", "$SOURCE"), "modify tempfile", Copy("$TARGET", "tempfile"), ])
The output then looks like:
% scons -Q Copy("tempfile", "file.in") modify tempfile Copy("file.out", "tempfile")