Nordlöw
Nordlöw

Reputation: 12138

Optional Environment Arguments to SCons Builders

I've noticed that calls to Object and Library builders sometimes take optional arguments at the end such as

Object('hello.c', CCFLAGS='-DHELLO')
Object('goodbye.c', CCFLAGS='-DGOODBYE')

Can Object, Library and SharedLibrary all take an arbitrary set of them or are they limited to a specific set of variables? If so this should save our current very large SCons build at work some time I hope.

Upvotes: 1

Views: 915

Answers (2)

bdbaddog
bdbaddog

Reputation: 3511

What Brady said is mostly correct. However, you can append any (number of) Environment() variables to the end of any builder. These create an OverrideEnvironment() which is then what is used to run the builder.

If you were to change the value of CCCOM and/or any variable which feeds into the command line for running the compiler then adding those variables to builder call would also have some impact.

If you specify a variable which has no impact on the current builder or even one which is not defined anywhere in SCons or any builders you may have created SCons will not issue a warning or an error.

Upvotes: 0

Brady
Brady

Reputation: 10357

The C/C++ builders recognize a specific set of arguments, called Construction Variables.

These variables can either be set on the environment or when calling the builder as you do in your question. Its often easier to set them on the environment, thus making the calls to the builders simpler, and then only modify the variables when necessary.

Here is an example:

env = Environment()

# Notice that CPPPATH, CPPDEFINES, LIBS, and LIBPATH dont include the
# compiler flags -I, -D, -l, and -L respectively, SCons will add those
# in a platform independent manner
env.Append(CCFLAGS=['-g', '-O2'])
env.Append(CPPPATH=['some/include/path'])
env.Append(CPPDEFINES=['YOUR_DEFINE'])
env.Append(LIBS=['pthread'])
env.Append(LIBPATH=['some/lib/path'])

# All of these builder calls use the construction  
# variables set on the environment above
env.Object('hello.c')
env.Object('goodbye.c')
env.Program('main.cc')

If you want to override a specific variable, you can do the following

env.Object('hello.c', CPPDEFINES='HELLO')

Or, if you want to append to a specific variable, with just one call, you can do the following:

env.Object('hello.c', CPPDEFINES=[env['CPPDEFINES'], 'HELLO'])

Upvotes: 2

Related Questions