SCons User Guide 0.96 | ||
---|---|---|
<<< Previous | Construction Environments | Next >>> |
SCons provides various methods that support modifying existing values in a construction environment.
You can replace existing construction variable values using the Replace method:
env = Environment(CCFLAGS = '-DDEFINE1') env.Replace(CCFLAGS = '-DDEFINE2') env.Program('foo.c') |
The replacing value (-DDEFINE2 in the above example) completely replaces the value in the construction environment:
% scons -Q cc -DDEFINE2 -c -o foo.o foo.c cc -o foo foo.o |
You can safely call Replace for construction variables that don't exist in the construction environment:
env = Environment() env.Replace(NEW_VARIABLE = 'xyzzy') print "NEW_VARIABLE =", env['NEW_VARIABLE'] |
In this case, the construction variable simply gets added to the construction environment:
% scons -Q NEW_VARIABLE = xyzzy scons: `.' is up to date. |
Because the variables aren't expanded until the construction environment is actually used to build the targets, and because SCons function and method calls are order-independent, the last replacement "wins" and is used to build all targets, regardless of the order in which the calls to Replace() are interspersed with calls to builder methods:
env = Environment(CCFLAGS = '-DDEFINE1') print "CCFLAGS =", env['CCFLAGS'] env.Program('foo.c') env.Replace(CCFLAGS = '-DDEFINE2') print "CCFLAGS =", env['CCFLAGS'] env.Program('bar.c') |
The timing of when the replacement actually occurs relative to when the targets get built becomes apparent if we run scons without the -Q option:
% scons scons: Reading SConscript files ... CCFLAGS = -DDEFINE1 CCFLAGS = -DDEFINE2 scons: done reading SConscript files. scons: Building targets ... cc -DDEFINE2 -c -o bar.o bar.c cc -o bar bar.o cc -DDEFINE2 -c -o foo.o foo.c cc -o foo foo.o scons: done building targets. |
Because the replacement occurs while the SConscript files are being read, the $CCFLAGS variable has already been set to -DDEFINE2 by the time the foo.o target is built, even though the call to the Replace method does not occur until later in the SConscript file.
You can append a value to an existing construction variable using the Append method:
env = Environment(CCFLAGS = '-DMY_VALUE') env.Append(CCFLAGS = ' -DLAST') env.Program('foo.c') |
SCons then supplies both the -DMY_VALUE and -DLAST flags when compiling the object file:
% scons -Q cc -DMY_VALUE -DLAST -c -o foo.o foo.c cc -o foo foo.o |
If the construction variable doesn't already exist, the Append method will create it:
env = Environment() env.Append(NEW_VARIABLE = 'added') print "NEW_VARIABLE =", env['NEW_VARIABLE'] |
Which yields:
% scons -Q NEW_VARIABLE = added scons: `.' is up to date. |
You can append a value to the beginning an existing construction variable using the Prepend method:
env = Environment(CCFLAGS = '-DMY_VALUE') env.Prepend(CCFLAGS = '-DFIRST ') env.Program('foo.c') |
SCons then supplies both the -DFIRST and -DMY_VALUE flags when compiling the object file:
% scons -Q cc -DFIRST -DMY_VALUE -c -o foo.o foo.c cc -o foo foo.o |
If the construction variable doesn't already exist, the Prepend method will create it:
env = Environment() env.Prepend(NEW_VARIABLE = 'added') print "NEW_VARIABLE =", env['NEW_VARIABLE'] |
Which yields:
% scons -Q NEW_VARIABLE = added scons: `.' is up to date. |
<<< Previous | Home | Next >>> |
Expanding Values From a Construction Environment | Up | Controlling the External Environment Used to Execute Build Commands |