Update $VSWHERE description. [skip appveyor]
[scons.git] / doc / generated / functions.gen
blobc7617c1011c3bee733657dd5cda905f321eb36ad
1 <!DOCTYPE sconsdoc [
2     <!ENTITY % scons SYSTEM "../scons.mod">
3     %scons;
4     <!ENTITY % builders-mod SYSTEM "builders.mod">
5     %builders-mod;
6     <!ENTITY % functions-mod SYSTEM "functions.mod">
7     %functions-mod;
8     <!ENTITY % tools-mod SYSTEM "tools.mod">
9     %tools-mod;
10     <!ENTITY % variables-mod SYSTEM "variables.mod">
11     %variables-mod;
14 <variablelist xmlns="http://www.scons.org/dbxsd/v1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
15   <varlistentry id="f-Action">
16     <term><function>Action</function>(<parameter>action, [output, [var, ...]] [key=value, ...]</parameter>)</term>
17     <term><replaceable>env</replaceable>.<methodname>Action</methodname>(<parameter>action, [output, [var, ...]] [key=value, ...]</parameter>)</term>
18     <listitem><para>
19 A factory function to create an Action object for
20 the specified
21 <parameter>action</parameter>.
22 See the manpage section "Action Objects"
23 for a complete explanation of the arguments and behavior.
24 </para>
26 <para>
27 Note that the &f-env-Action;
28 form of the invocation will expand
29 construction variables in any argument strings,
30 including the
31 <parameter>action</parameter>
32 argument, at the time it is called
33 using the construction variables in the
34 <replaceable>env</replaceable>
35 construction environment through which
36 &f-env-Action; was called.
37 The &f-Action; global function
38 form delays all variable expansion
39 until the Action object is actually used.
40 </para>
41 </listitem>
42   </varlistentry>
43   <varlistentry id="f-AddMethod">
44     <term><function>AddMethod</function>(<parameter>object, function, [name]</parameter>)</term>
45     <term><replaceable>env</replaceable>.<methodname>AddMethod</methodname>(<parameter>function, [name]</parameter>)</term>
46     <listitem><para>
47 Adds <parameter>function</parameter> to an object as a method.
48 <parameter>function</parameter> will be called with an instance
49 object as the first argument as for other methods.
50 If <parameter>name</parameter> is given, it is used as
51 the name of the new method, else the name of
52 <parameter>function</parameter> is used.
53 </para>
54 <para>
55 When the global function &f-AddMethod; is called,
56 the object to add the method to must be passed as the first argument;
57 typically this will be &Environment;,
58 in order to create a method which applies to all &consenvs;
59 subsequently constructed.
60 When called using the &f-env-AddMethod; form,
61 the method is added to the specified &consenv; only.
62 Added methods propagate through &f-env-Clone; calls.
63 </para>
65 <para>
66 More examples:
67 </para>
69 <example_commands>
70 # Function to add must accept an instance argument.
71 # The Python convention is to call this 'self'.
72 def my_method(self, arg):
73     print("my_method() got", arg)
75 # Use the global function to add a method to the Environment class:
76 AddMethod(Environment, my_method)
77 env = Environment()
78 env.my_method('arg')
80 # Use the optional name argument to set the name of the method:
81 env.AddMethod(my_method, 'other_method_name')
82 env.other_method_name('another arg')
83 </example_commands>
84 </listitem>
85   </varlistentry>
86   <varlistentry id="f-AddOption">
87     <term><function>AddOption</function>(<parameter>arguments</parameter>)</term>
88     <listitem><para>
89 Adds a local (project-specific) command-line option.
90 <parameter>arguments</parameter>
91 are the same as those supported by the <function>add_option</function>
92 method in the standard Python library module <systemitem>optparse</systemitem>,
93 with a few additional capabilities noted below.
94 See the documentation for
95 <systemitem>optparse</systemitem>
96 for a thorough discussion of its option-processing capabities.
97 </para>
99 <para>
100 In addition to the arguments and values supported by the
101 <systemitem>optparse</systemitem>
102 <function>add_option</function>
103 method, &f-AddOption;
104 allows setting the
105 <parameter>nargs</parameter>
106 keyword value to
107 a string consisting of a question mark
108 (<literal>'?'</literal>)
109 to indicate that the option argument for
110 that option string is optional.
111 If the option string is present on the
112 command line but has no matching option
113 argument, the value of the
114 <parameter>const</parameter>
115 keyword argument is produced as the value
116 of the option.
117 If the option string is omitted from
118 the command line, the value of the
119 <parameter>default</parameter>
120 keyword argument is produced, as usual;
121 if there is no
122 <parameter>default</parameter>
123 keyword argument in the &f-AddOption; call,
124 <constant>None</constant> is produced.
125 </para>
127 <para>
128 <systemitem>optparse</systemitem> recognizes
129 abbreviations of long option names,
130 as long as they can be unambiguously resolved.
131 For example, if
132 <function>add_option</function> is called to
133 define a <option>--devicename</option> option,
134 it will recognize <option>--device</option>,
135 <option>--dev</option>
136 and so forth as long as there is no other option
137 which could also match to the same abbreviation.
138 Options added via
139 &f-AddOption; do not support
140 the automatic recognition of abbreviations.
141 Instead, to allow specific abbreviations,
142 include them as synonyms in the &f-AddOption; call itself.
143 </para>
145 <para>
146 Once a new command-line option has been added with
147 &f-AddOption;,
148 the option value may be accessed using
149 &f-link-GetOption;
151 &f-link-env-GetOption;.
152 If the <parameter>settable=True</parameter> argument
153 was supplied in the &AddOption; call,
154 the value may also be set later using
155 &f-link-SetOption;
157 &f-link-env-SetOption;,
158 if conditions in an
159 &SConscript; file
160 require overriding any default value.
161 Note however that a
162 value specified on the command line will
163 <emphasis>always</emphasis>
164 override a value set in an SConscript file.
165 </para>
167 <para>
168 <emphasis>Changed in 4.8.0</emphasis>: added the
169 <parameter>settable</parameter> keyword argument
170 to enable an added option to be settable via &SetOption;.
171 </para>
173 <para>
174 Help text for an option is a combination
175 of the string supplied in the
176 <parameter>help</parameter> keyword
177 argument to &f-AddOption; and information
178 collected from the other keyword arguments.
179 Such help is displayed if the
180 <option>-h</option> command line option
181 is used (but not with <option>-H</option>).
182 Help for all local options is displayed
183 under the separate heading
184 <emphasis role="bold">Local Options</emphasis>.
185 The options are unsorted - they will appear
186 in the help text in the order in which the
187 &f-AddOption;
188 calls occur.
189 </para>
191 <para>
192 Example:
193 </para>
195 <example_commands>
196 AddOption(
197     '--prefix',
198     dest='prefix',
199     nargs=1,
200     type='string',
201     action='store',
202     metavar='DIR',
203     help='installation prefix',
205 env = Environment(PREFIX=GetOption('prefix'))
206 </example_commands>
208 <para>For that example,
209 the following help text would be produced:</para>
211 <screen>
212 Local Options:
213   --prefix=DIR                installation prefix
214 </screen>
216 <para>
217 Help text for local options may be unavailable if
218 the &f-link-Help; function has been called,
219 see the &f-Help; documentation for details.
220 </para>
222 <note>
223 <para>
224 As an artifact of the internal implementation,
225 the behavior of options added by &AddOption;
226 which take option arguments is undefined
227 <emphasis>if</emphasis> whitespace
228 (rather than an <literal>=</literal> sign) is used as
229 the separator on the command line.
230 Users should avoid such usage; it is recommended
231 to add a note to this effect to project documentation
232 if the situation is likely to arise.
233 In addition, if the <parameter>nargs</parameter>
234 keyword is used to specify more than one following
235 option argument (that is, with a value of <constant>2</constant>
236 or greater), such arguments would necessarily
237 be whitespace separated, triggering the issue.
238 Developers should not use &AddOption; this way.
239 Future versions of &SCons; will likely forbid such usage.
240 </para>
241 </note>
243 </listitem>
244   </varlistentry>
245   <varlistentry id="f-AddPostAction">
246     <term><function>AddPostAction</function>(<parameter>target, action</parameter>)</term>
247     <term><replaceable>env</replaceable>.<methodname>AddPostAction</methodname>(<parameter>target, action</parameter>)</term>
248     <listitem><para>
249 Arranges for the specified
250 <parameter>action</parameter>
251 to be performed
252 after the specified
253 <parameter>target</parameter>
254 has been built.
255 <parameter>action</parameter> may be
256 an Action object, or anything that
257 can be converted into an Action object.
258 See the manpage section "Action Objects"
259 for a complete explanation.
260 </para>
262 <para>
263 When multiple targets are supplied,
264 the action may be called multiple times,
265 once after each action that generates
266 one or more targets in the list.
267 </para>
269 <example_commands>
270 foo = Program('foo.c')
271 # remove execute permission from binary:
272 AddPostAction(foo, Chmod('$TARGET', "a-x"))
273 </example_commands>
275 </listitem>
276   </varlistentry>
277   <varlistentry id="f-AddPreAction">
278     <term><function>AddPreAction</function>(<parameter>target, action</parameter>)</term>
279     <term><replaceable>env</replaceable>.<methodname>AddPreAction</methodname>(<parameter>target, action</parameter>)</term>
280     <listitem><para>
281 Arranges for the specified
282 <parameter>action</parameter>
283 to be performed
284 before the specified
285 <parameter>target</parameter>
286 is built.
287 <parameter>action</parameter> may be
288 an Action object, or anything that
289 can be converted into an Action object.
290 See the manpage section "Action Objects"
291 for a complete explanation.
292 </para>
294 <para>
295 When multiple targets are specified,
296 the action(s) may be called multiple times,
297 once before each action that generates
298 one or more targets in the list.
299 </para>
301 <para>
302 Note that if any of the targets are built in multiple steps,
303 the action will be invoked just
304 before the "final" action that specifically
305 generates the specified target(s).
306 For example, when building an executable program
307 from a specified source
308 <filename>.c</filename>
309 file via an intermediate object file:
310 </para>
312 <example_commands>
313 foo = Program('foo.c')
314 AddPreAction(foo, 'pre_action')
315 </example_commands>
317 <para>
318 The specified
319 <literal>pre_action</literal>
320 would be executed before
321 &scons;
322 calls the link command that actually
323 generates the executable program binary
324 <filename>foo</filename>,
325 not before compiling the
326 <filename>foo.c</filename>
327 file into an object file.
328 </para>
329 </listitem>
330   </varlistentry>
331   <varlistentry id="f-Alias">
332     <term><function>Alias</function>(<parameter>alias, [source, [action]]</parameter>)</term>
333     <term><replaceable>env</replaceable>.<methodname>Alias</methodname>(<parameter>alias, [source, [action]]</parameter>)</term>
334     <listitem><para>
335 Creates an <firstterm>alias</firstterm> target that
336 can be used as a reference to zero or more other targets,
337 specified by the optional <parameter>source</parameter> parameter.
338 Aliases provide a way to give a shorter or more descriptive
339 name to specific targets,
340 and to group multiple targets under a single name.
341 The alias name, or an Alias Node object,
342 may be used as a dependency of any other target,
343 including another alias.
344 </para>
346 <para>
347 <parameter>alias</parameter> and <parameter>source</parameter>
348 may each be a string or Node object,
349 or a list of strings or Node objects;
350 if Nodes are used for
351 <parameter>alias</parameter>
352 they must be Alias nodes.
353 If <parameter>source</parameter> is omitted,
354 the alias is created but has no reference;
355 if selected for building this will result in a
356 <quote>Nothing to be done.</quote> message.
357 An empty alias can be used to define the alias
358 in a visible place in the project;
359 it can later be appended to in a subsidiary SConscript file
360 with the actual target(s) to refer to.
361 The optional
362 <parameter>action</parameter>
363 parameter specifies an action or list of actions
364 that will be executed
365 whenever the any of the alias targets are out-of-date.
366 </para>
368 <para>
369 &f-Alias; can be called for an existing alias,
370 which appends the <parameter>alias</parameter>
371 and/or <parameter>action</parameter> arguments
372 to the existing lists for that alias.
373 </para>
375 <para>
376 Returns a list of Alias Node objects representing the alias(es),
377 which exist outside of any physical file system.
378 The alias name space is separate from the name space for
379 tangible targets; to avoid confusion do not reuse
380 target names as alias names.
381 </para>
383 <para>
384 Examples:
385 </para>
387 <example_commands>
388 Alias('install')
389 Alias('install', '/usr/bin')
390 Alias(['install', 'install-lib'], '/usr/local/lib')
392 env.Alias('install', ['/usr/local/bin', '/usr/local/lib'])
393 env.Alias('install', ['/usr/local/man'])
395 env.Alias('update', ['file1', 'file2'], "update_database $SOURCES")
396 </example_commands>
397 </listitem>
398   </varlistentry>
399   <varlistentry id="f-AllowSubstExceptions">
400     <term><function>AllowSubstExceptions</function>(<parameter>[exception, ...]</parameter>)</term>
401     <listitem><para>
402 Specifies the exceptions that will be allowed
403 when expanding construction variables.
404 By default,
405 any construction variable expansions that generate a
406 <literal>NameError</literal>
408 <literal>IndexError</literal>
409 exception will expand to a
410 <literal>''</literal>
411 (an empty string) and not cause scons to fail.
412 All exceptions not in the specified list
413 will generate an error message
414 and terminate processing.
415 </para>
417 <para>
419 &f-AllowSubstExceptions;
420 is called multiple times,
421 each call completely overwrites the previous list
422 of allowed exceptions.
423 </para>
425 <para>
426 Example:
427 </para>
429 <example_commands>
430 # Requires that all construction variable names exist.
431 # (You may wish to do this if you want to enforce strictly
432 # that all construction variables must be defined before use.)
433 AllowSubstExceptions()
435 # Also allow a string containing a zero-division expansion
436 # like '${1 / 0}' to evalute to ''.
437 AllowSubstExceptions(IndexError, NameError, ZeroDivisionError)
438 </example_commands>
439 </listitem>
440   </varlistentry>
441   <varlistentry id="f-AlwaysBuild">
442     <term><function>AlwaysBuild</function>(<parameter>target, ...</parameter>)</term>
443     <term><replaceable>env</replaceable>.<methodname>AlwaysBuild</methodname>(<parameter>target, ...</parameter>)</term>
444     <listitem><para>
445 Marks each given
446 <parameter>target</parameter>
447 so that it is always assumed to be out of date,
448 and will always be rebuilt if needed.
449 Note, however, that
450 &f-AlwaysBuild;
451 does not add its target(s) to the default target list,
452 so the targets will only be built
453 if they are specified on the command line,
454 or are a dependent of a target specified on the command line--but
455 they will
456 <emphasis>always</emphasis>
457 be built if so specified.
458 Multiple targets can be passed in to a single call to
459 &f-AlwaysBuild;.
460 </para>
461 </listitem>
462   </varlistentry>
463   <varlistentry id="f-Append">
464     <term><replaceable>env</replaceable>.<methodname>Append</methodname>(<parameter>key=val, [...]</parameter>)</term>
465     <listitem><para>
466 Appends value(s) intelligently to &consvars; in
467 <varname>env</varname>.
468 The &consvars; and values to add to them are passed as
469 <parameter>key=val</parameter> pairs (&Python; keyword arguments).
470 &f-env-Append; is designed to allow adding values
471 without having to think about the data type of an existing &consvar;.
472 Regular &Python; syntax can also be used to manipulate the &consvar;,
473 but for that you may need to know the types involved,
474 for example pure &Python; lets you directly "add" two lists of strings,
475 but adding a string to a list or a list to a string requires
476 different syntax - things &f-Append; takes care of.
477 Some pre-defined &consvars; do have type expectations
478 based on how &SCons; will use them:
479 for example &cv-link-CPPDEFINES; is often a string or a list of strings,
480 but can also be a list of tuples or a dictionary;
481 while &cv-link-LIBEMITTER;
482 is expected to be a callable or list of callables,
483 and &cv-link-BUILDERS; is expected to be a dictionary.
484 Consult the documentation for the various &consvars; for more details.
485 </para>
487 <para>
488 The following descriptions apply to both the &f-Append;
489 and &f-Prepend; methods, as well as their
490 <emphasis role="bold">Unique</emphasis> variants,
491 with the differences being the insertion point of the added values
492 and whether duplication is allowed.
493 </para>
495 <para>
496 <parameter>val</parameter> can be almost any type.
497 If <varname>env</varname> does not have a &consvar;
498 named <parameter>key</parameter>,
499 then <parameter>key</parameter> is simply
500 stored with a value of <parameter>val</parameter>.
501 Otherwise, <parameter>val</parameter> is
502 combinined with the existing value,
503 possibly converting into an appropriate type
504 which can hold the expanded contents.
505 There are a few special cases to be aware of.
506 Normally, when two strings are combined,
507 the result is a new string containing their concatenation
508 (and you are responsible for supplying any needed separation);
509 however, the contents of &cv-link-CPPDEFINES; will
510 will be postprocessed by adding a prefix and/or suffix
511 to each entry when the command line is produced,
512 so &SCons; keeps them separate -
513 appending a string will result in a separate string entry,
514 not a combined string.
515 For &cv-CPPDEFINES;. as well as
516 &cv-link-LIBS;, and the various <literal>*PATH</literal> variables,
517 &SCons; will amend the variable by supplying the compiler-specific
518 syntax (e.g. prepending a <literal>-D</literal> or <literal>/D</literal>
519 prefix for &cv-CPPDEFINES;), so you should omit this syntax when
520 adding values to these variables.
521 Examples (gcc syntax shown in the expansion of &CPPDEFINES;):
522 </para>
524 <example_commands>
525 env = Environment(CXXFLAGS="-std=c11", CPPDEFINES="RELEASE")
526 print(f"CXXFLAGS = {env['CXXFLAGS']}, CPPDEFINES = {env['CPPDEFINES']}")
527 # notice including a leading space in CXXFLAGS addition
528 env.Append(CXXFLAGS=" -O", CPPDEFINES="EXTRA")
529 print(f"CXXFLAGS = {env['CXXFLAGS']}, CPPDEFINES = {env['CPPDEFINES']}")
530 print("CPPDEFINES will expand to", env.subst('$_CPPDEFFLAGS'))
531 </example_commands>
533 <screen>
534 $ scons -Q
535 CXXFLAGS = -std=c11, CPPDEFINES = RELEASE
536 CXXFLAGS = -std=c11 -O, CPPDEFINES = deque(['RELEASE', 'EXTRA'])
537 CPPDEFINES will expand to -DRELEASE -DEXTRA
538 scons: `.' is up to date.
539 </screen>
541 <para>
542 Because &cv-link-CPPDEFINES; is intended for command-line
543 specification of C/C++ preprocessor macros,
544 additional syntax is accepted when adding to it.
545 The preprocessor accepts arguments to predefine a macro name by itself
546 (<computeroutput>-DFOO</computeroutput> for most compilers,
547 <computeroutput>/DFOO</computeroutput> for Microsoft C++),
548 which gives it an implicit value of <constant>1</constant>,
549 or can be given with a replacement value
550 (<computeroutput>-DBAR=TEXT</computeroutput>).
551 &SCons; follows these rules when adding to &cv-CPPDEFINES;:
552 </para>
553 <itemizedlist>
554 <listitem>
555 <para>A string is split on spaces,
556 giving an easy way to enter multiple macros in one addition.
557 Use an <literal>=</literal> to specify a valued macro.</para>
558 </listitem>
559 <listitem>
560 <para>A tuple is treated as a valued macro.
561 Use the value <constant>None</constant> if the macro should not have a value.
562 It is an error to supply more than two elements in such a tuple.</para>
563 </listitem>
564 <listitem>
565 <para>A list is processed in order,
566 adding each item without further interpretation.
567 In this case, space-separated strings are not split.</para>
568 </listitem>
569 <listitem>
570 <para>A dictionary is processed in order,
571 adding each key-value pair as a valued macro.
572 Use the value <constant>None</constant> if the macro should not have a value.
573 </para>
574 </listitem>
575 </itemizedlist>
577 <para>
578 Examples:
579 </para>
581 <example_commands>
582 env = Environment(CPPDEFINES="FOO")
583 print("CPPDEFINES =", env['CPPDEFINES'])
584 env.Append(CPPDEFINES="BAR=1")
585 print("CPPDEFINES =", env['CPPDEFINES'])
586 env.Append(CPPDEFINES=[("OTHER", 2)])
587 print("CPPDEFINES =", env['CPPDEFINES'])
588 env.Append(CPPDEFINES={"EXTRA": "arg"})
589 print("CPPDEFINES =", env['CPPDEFINES'])
590 print("CPPDEFINES will expand to", env.subst('$_CPPDEFFLAGS'))
591 </example_commands>
593 <screen>
594 $ scons -Q
595 CPPDEFINES = FOO
596 CPPDEFINES = deque(['FOO', 'BAR=1'])
597 CPPDEFINES = deque(['FOO', 'BAR=1', ('OTHER', 2)])
598 CPPDEFINES = deque(['FOO', 'BAR=1', ('OTHER', 2), ('EXTRA', 'arg')])
599 CPPDEFINES will expand to -DFOO -DBAR=1 -DOTHER=2 -DEXTRA=arg
600 scons: `.' is up to date.
601 </screen>
603 <para>
604 Examples of adding multiple macros:
605 </para>
607 <example_commands>
608 env = Environment()
609 env.Append(CPPDEFINES=[("ONE", 1), "TWO", ("THREE", )])
610 print("CPPDEFINES =", env['CPPDEFINES'])
611 env.Append(CPPDEFINES={"FOUR": 4, "FIVE": None})
612 print("CPPDEFINES =", env['CPPDEFINES'])
613 print("CPPDEFINES will expand to", env.subst('$_CPPDEFFLAGS'))
614 </example_commands>
616 <screen>
617 $ scons -Q
618 CPPDEFINES = [('ONE', 1), 'TWO', ('THREE',)]
619 CPPDEFINES = deque([('ONE', 1), 'TWO', ('THREE',), ('FOUR', 4), ('FIVE', None)])
620 CPPDEFINES will expand to -DONE=1 -DTWO -DTHREE -DFOUR=4 -DFIVE
621 scons: `.' is up to date.
622 </screen>
624 <para>
625 <emphasis>Changed in version  4.5</emphasis>:
626 clarifined the use of tuples vs. other types,
627 handling is now consistent across the four functions.
628 </para>
630 <example_commands>
631 env = Environment()
632 env.Append(CPPDEFINES=("MACRO1", "MACRO2"))
633 print("CPPDEFINES =", env['CPPDEFINES'])
634 env.Append(CPPDEFINES=[("MACRO3", "MACRO4")])
635 print("CPPDEFINES =", env['CPPDEFINES'])
636 print("CPPDEFINES will expand to", env.subst('$_CPPDEFFLAGS'))
637 </example_commands>
639 <screen>
640 $ scons -Q
641 CPPDEFINES = ('MACRO1', 'MACRO2')
642 CPPDEFINES = deque(['MACRO1', 'MACRO2', ('MACRO3', 'MACRO4')])
643 CPPDEFINES will expand to -DMACRO1 -DMACRO2 -DMACRO3=MACRO4
644 scons: `.' is up to date.
645 </screen>
647 <para>
648 See &cv-link-CPPDEFINES; for more details.
649 </para>
651 <para>
652 Appending a string <parameter>val</parameter>
653 to a dictonary-typed &consvar; enters
654 <parameter>val</parameter> as the key in the dictionary,
655 and <literal>None</literal> as its value.
656 Using a tuple type to supply a key-value pair
657 only works for the special case of &cv-CPPDEFINES;
658 described above.
659 </para>
661 <para>
662 Although most combinations of types work without
663 needing to know the details, some combinations
664 do not make sense and &Python; raises an exception.
665 </para>
667 <para>
668 When using &f-env-Append; to modify &consvars;
669 which are path specifications (conventionally,
670 the names of such end in <literal>PATH</literal>),
671 it is recommended to add the values as a list of strings,
672 even if you are only adding a single string.
673 The same goes for adding library names to &cv-LIBS;.
674 </para>
676 <example_commands>
677 env.Append(CPPPATH=["#/include"])
678 </example_commands>
680 <para>
681 See also &f-link-env-AppendUnique;,
682 &f-link-env-Prepend; and &f-link-env-PrependUnique;.
683 </para>
685 </listitem>
686   </varlistentry>
687   <varlistentry id="f-AppendENVPath">
688     <term><replaceable>env</replaceable>.<methodname>AppendENVPath</methodname>(<parameter>name, newpath, [envname, sep, delete_existing=False]</parameter>)</term>
689     <listitem><para>
690 Append path elements specified by <parameter>newpath</parameter>
691 to the given search path string or list <parameter>name</parameter>
692 in mapping <parameter>envname</parameter> in the &consenv;.
693 Supplying <parameter>envname</parameter> is optional:
694 the default is the execution environment &cv-link-ENV;.
695 Optional <parameter>sep</parameter> is used as the search path separator,
696 the default is the platform's separator (<systemitem>os.pathsep</systemitem>).
697 A path element will only appear once.
698 Any duplicates in <parameter>newpath</parameter> are dropped,
699 keeping the last appearing (to preserve path order).
700 If <parameter>delete_existing</parameter>
701 is <constant>False</constant> (the default)
702 any addition duplicating an existing path element is ignored;
703 if <parameter>delete_existing</parameter>
704 is <constant>True</constant> the existing value will
705 be dropped and the path element will be added at the end.
706 To help maintain uniqueness all paths are normalized (using
707 <systemitem>os.path.normpath</systemitem>
709 <systemitem>os.path.normcase</systemitem>).
710 </para>
712 <para>
713 Example:
714 </para>
716 <example_commands>
717 print('before:', env['ENV']['INCLUDE'])
718 include_path = '/foo/bar:/foo'
719 env.AppendENVPath('INCLUDE', include_path)
720 print('after:', env['ENV']['INCLUDE'])
721 </example_commands>
723 <para>Yields:</para>
724 <screen>
725 before: /foo:/biz
726 after: /biz:/foo/bar:/foo
727 </screen>
729 <para>
730 See also &f-link-env-PrependENVPath;.
731 </para>
733 </listitem>
734   </varlistentry>
735   <varlistentry id="f-AppendUnique">
736     <term><replaceable>env</replaceable>.<methodname>AppendUnique</methodname>(<parameter>key=val, [...], [delete_existing=False]</parameter>)</term>
737     <listitem><para>
738 Append values to &consvars; in the current &consenv;,
739 maintaining uniqueness.
740 Works like &f-link-env-Append;,
741 except that values that would become duplicates
742 are not added.
743 If <parameter>delete_existing</parameter>
744 is set to a true value, then for any duplicate,
745 the existing instance of <parameter>val</parameter> is first removed,
746 then <parameter>val</parameter> is appended,
747 having the effect of moving it to the end.
748 </para>
750 <para>
751 Example:
752 </para>
754 <example_commands>
755 env.AppendUnique(CCFLAGS='-g', FOO=['foo.yyy'])
756 </example_commands>
758 <para>
759 See also &f-link-env-Append;,
760 &f-link-env-Prepend;
761 and &f-link-env-PrependUnique;.
762 </para>
763 </listitem>
764   </varlistentry>
765   <varlistentry id="f-Builder">
766     <term><function>Builder</function>(<parameter>action, [arguments]</parameter>)</term>
767     <term><replaceable>env</replaceable>.<methodname>Builder</methodname>(<parameter>action, [arguments]</parameter>)</term>
768     <listitem><para>
769 Creates a Builder object for
770 the specified
771 <parameter>action</parameter>.
772 See the manpage section "Builder Objects"
773 for a complete explanation of the arguments and behavior.
774 </para>
776 <para>
777 Note that the
778 <function>env.Builder</function>()
779 form of the invocation will expand
780 construction variables in any arguments strings,
781 including the
782 <parameter>action</parameter>
783 argument,
784 at the time it is called
785 using the construction variables in the
786 <varname>env</varname>
787 construction environment through which
788 &f-env-Builder; was called.
790 &f-Builder;
791 form delays all variable expansion
792 until after the Builder object is actually called.
793 </para>
794 </listitem>
795   </varlistentry>
796   <varlistentry id="f-CacheDir">
797     <term><function>CacheDir</function>(<parameter>cache_dir, custom_class=None</parameter>)</term>
798     <term><replaceable>env</replaceable>.<methodname>CacheDir</methodname>(<parameter>cache_dir, custom_class=None</parameter>)</term>
799     <listitem><para>
800 Direct
801 &scons;
802 to maintain a derived-file cache in
803 <parameter>cache_dir</parameter>.
804 The derived files in the cache will be shared
805 among all the builds specifying the same
806 <parameter>cache_dir</parameter>.
807 Specifying a
808 <parameter>cache_dir</parameter>
810 <constant>None</constant>
811 disables derived file caching.
812 </para>
814 <para>
815 Calling the environment method
816 &f-link-env-CacheDir;
817 limits the effect to targets built
818 through the specified construction environment.
819 Calling the global function
820 &f-link-CacheDir;
821 sets a global default
822 that will be used by all targets built
823 through construction environments
824 that do not set up environment-specific
825 caching by calling &f-env-CacheDir;.
826 </para>
828 <para>
829 Caching behavior can be configured by passing a specialized cache
830 class as the optional <parameter>custom_class</parameter> parameter.
831 This class must be a subclass of
832 <classname>SCons.CacheDir.CacheDir</classname>.
833 &SCons; will internally invoke the custom class for performing
834 caching operations.
835 If the parameter is omitted or set to
836 <constant>None</constant>, &SCons; will use the default
837 <classname>SCons.CacheDir.CacheDir</classname> class.
838 </para>
840 <para>
841 When derived-file caching
842 is being used and
843 &scons;
844 finds a derived file that needs to be rebuilt,
845 it will first look in the cache to see if a
846 file with matching &buildsig; exists
847 (indicating the input file(s) and build action(s)
848 were identical to those for the current target),
849 and if so, will retrieve the file from the cache.
850 &scons;
851 will report
852 <computeroutput>Retrieved `file' from cache</computeroutput>
853 instead of the normal build message.
854 If the derived file is not present in the cache,
855 &scons;
856 will build it and
857 then place a copy of the built file in the cache,
858 identified by its &buildsig;, for future use.
859 </para>
861 <para>
863 <computeroutput>Retrieved `file' from cache</computeroutput>
864 messages are useful for human consumption,
865 but less useful when comparing log files between
866 &scons; runs which will show differences that are
867 noisy and not actually significant.
868 To disable,
869 use the <option>--cache-show</option> option.
870 With this option, &scons; changes printing
871 to always show the action that would
872 have been used to build the file without caching.
873 </para>
875 <para>
876 Derived-file caching
877 may be disabled for any invocation
878 of &scons; by giving the
879 <option>--cache-disable</option>
880 command line option;
881 cache updating may be disabled, leaving cache
882 fetching enabled, by giving the
883 <option>--cache-readonly</option> option.
884 </para>
886 <para>
887 If the
888 <option>--cache-force</option>
889 option is used,
890 &scons;
891 will place a copy of
892 <emphasis>all</emphasis>
893 derived files into the cache,
894 even if they already existed
895 and were not built by this invocation.
896 This is useful to populate a cache
897 the first time a
898 <parameter>cache_dir</parameter>
899 is used for a build,
900 or to bring a cache up to date after
901 a build with cache updating disabled
902 (<option>--cache-disable</option>
903 or <option>--cache-readonly</option>)
904 has been done.
905 </para>
907 <para>
909 &f-link-NoCache;
910 method can be used to disable caching of specific files.  This can be
911 useful if inputs and/or outputs of some tool are impossible to
912 predict or prohibitively large.
913 </para>
915 <para>
916 Note that (at this time) &SCons; provides no facilities
917 for managing the derived-file cache. It is up to the developer
918 to arrange for cache pruning, expiry, access control, etc. if needed.
919 </para>
921 </listitem>
922   </varlistentry>
923   <varlistentry id="f-Clean">
924     <term><function>Clean</function>(<parameter>targets, files_or_dirs</parameter>)</term>
925     <term><replaceable>env</replaceable>.<methodname>Clean</methodname>(<parameter>targets, files_or_dirs</parameter>)</term>
926     <listitem><para>
927 This specifies a list of files or directories which should be removed
928 whenever the targets are specified with the
929 <option>-c</option>
930 command line option.
931 The specified targets may be a list
932 or an individual target.
933 Multiple calls to
934 &f-Clean;
935 are legal,
936 and create new targets or add files and directories to the
937 clean list for the specified targets.
938 </para>
940 <para>
941 Multiple files or directories should be specified
942 either as separate arguments to the
943 &f-Clean;
944 method, or as a list.
945 &f-Clean;
946 will also accept the return value of any of the construction environment
947 Builder methods.
948 Examples:
949 </para>
951 <para>
952 The related
953 &f-link-NoClean;
954 function overrides calling
955 &f-Clean;
956 for the same target,
957 and any targets passed to both functions will
958 <emphasis>not</emphasis>
959 be removed by the
960 <option>-c</option>
961 option.
962 </para>
964 <para>
965 Examples:
966 </para>
968 <example_commands>
969 Clean('foo', ['bar', 'baz'])
970 Clean('dist', env.Program('hello', 'hello.c'))
971 Clean(['foo', 'bar'], 'something_else_to_clean')
972 </example_commands>
974 <para>
975 In this example,
976 installing the project creates a subdirectory for the documentation.
977 This statement causes the subdirectory to be removed
978 if the project is deinstalled.
979 </para>
980 <example_commands>
981 Clean(docdir, os.path.join(docdir, projectname))
982 </example_commands>
983 </listitem>
984   </varlistentry>
985   <varlistentry id="f-Clone">
986     <term><replaceable>env</replaceable>.<methodname>Clone</methodname>(<parameter>[key=val, ...]</parameter>)</term>
987     <listitem><para>
988 Returns an independent copy of a &consenv;.
989 If there are any unrecognized keyword arguments specified,
990 they are added as &consvars; in the copy,
991 overwriting any existing values
992 for those keywords.
993 See the manpage section "Construction Environments" for more details.
994 </para>
996 <para>
997 Example:
998 </para>
1000 <example_commands>
1001 env2 = env.Clone()
1002 env3 = env.Clone(CCFLAGS='-g')
1003 </example_commands>
1005 <para>
1006 A list of <parameter>tools</parameter>
1007 and a <parameter>toolpath</parameter> may be specified,
1008 as in the &f-link-Environment; constructor:
1009 </para>
1011 <example_commands>
1012 def MyTool(env):
1013     env['FOO'] = 'bar'
1015 env4 = env.Clone(tools=['msvc', MyTool])
1016 </example_commands>
1018 <para>
1020 <parameter>parse_flags</parameter>
1021 keyword argument is also recognized, to allow merging command-line
1022 style arguments into the appropriate construction
1023 variables (see &f-link-env-MergeFlags;).
1024 </para>
1026 <example_commands>
1027 # create an environment for compiling programs that use wxWidgets
1028 wx_env = env.Clone(parse_flags='!wx-config --cflags --cxxflags')
1029 </example_commands>
1031 <para>
1032 The <parameter>variables</parameter>
1033 keyword argument is also recognized, to allow (re)initializing
1034 &consvars; from a <literal>Variables</literal> object.
1035 </para>
1037 <para>
1038 <emphasis>Changed in version 4.8.0:</emphasis>
1039 the <parameter>variables</parameter> parameter was added.
1040 </para>
1041 </listitem>
1042   </varlistentry>
1043   <varlistentry id="f-Command">
1044     <term><function>Command</function>(<parameter>target, source, action, [key=val, ...]</parameter>)</term>
1045     <term><replaceable>env</replaceable>.<methodname>Command</methodname>(<parameter>target, source, action, [key=val, ...]</parameter>)</term>
1046     <listitem><para>
1047 Creates an anonymous builder and calls it,
1048 thus recording <parameter>action</parameter>
1049 to build <parameter>target</parameter>
1050 from <parameter>source</parameter>
1051 into the dependency tree.
1052 This can be more convenient for a single special-case build
1053 than having to define and add a new named Builder.
1054 </para>
1056 <para>
1058 &Command; function accepts the
1059 <parameter>source_scanner</parameter> and
1060 <parameter>target_scanner</parameter>
1061 keyword arguments which are used to specify
1062 custom scanners for the specified sources or targets.
1063 The value must be a Scanner object.
1064 For example, the global
1065 <literal>DirScanner</literal>
1066 object can be used
1067 if any of the sources will be directories
1068 that must be scanned on-disk for
1069 changes to files that aren't
1070 already specified in other Builder or function calls.
1071 </para>
1073 <para>
1075 &Command; function also accepts the
1076 <parameter>source_factory</parameter> and
1077 <parameter>target_factory</parameter>
1078 keyword arguments which are used to specify
1079 factory functions to create &SCons; Nodes
1080 from any sources or targets specified as strings.
1081 If any sources or targets are already Node objects,
1082 they are not further transformed even if
1083 a factory is specified for them.
1084 The default for each is the &Entry; factory.
1085 </para>
1087 <para>
1088 These four arguments, if given, are used
1089 in the creation of the Builder.
1090 Other Builder-specific keyword arguments
1091 are not recognized as such.
1092 See the manpage section "Builder Objects"
1093 for more information about how these
1094 arguments work in a Builder.
1095 </para>
1097 <para>
1098 Any remaining keyword arguments are passed on to the
1099 generated builder when it is called,
1100 and behave as described in the manpage section "Builder Methods",
1101 in short:
1102 recognized arguments have their specified meanings,
1103 while the rest are used to override
1104 any same-named existing &consvars;
1105 from the &consenv;.
1106 </para>
1108 <para>
1109 <parameter>action</parameter> can be an external command,
1110 specified as a string,
1111 or a callable &Python; object;
1112 see the manpage section "Action Objects"
1113 for more complete information.
1114 Also note that a string specifying an external command
1115 may be preceded by an at-sign
1116 (<literal>@</literal>)
1117 to suppress printing the command in question,
1118 or by a hyphen
1119 (<literal>-</literal>)
1120 to ignore the exit status of the external command.
1121 </para>
1123 <para>
1124 Examples:
1125 </para>
1127 <example_commands>
1128 env.Command(
1129     target='foo.out',
1130     source='foo.in',
1131     action="$FOO_BUILD &lt; $SOURCES &gt; $TARGET"
1134 env.Command(
1135     target='bar.out',
1136     source='bar.in',
1137     action=["rm -f $TARGET", "$BAR_BUILD &lt; $SOURCES &gt; $TARGET"],
1138     ENV={'PATH': '/usr/local/bin/'},
1142 import os
1143 def rename(env, target, source):
1144     os.rename('.tmp', str(target[0]))
1147 env.Command(
1148     target='baz.out',
1149     source='baz.in',
1150     action=["$BAZ_BUILD &lt; $SOURCES &gt; .tmp", rename],
1152 </example_commands>
1154 <para>
1155 Note that the
1156 &Command;
1157 function will usually assume, by default,
1158 that the specified targets and/or sources are Files,
1159 if no other part of the configuration
1160 identifies what type of entries they are.
1161 If necessary, you can explicitly specify
1162 that targets or source nodes should
1163 be treated as directories
1164 by using the
1165 &f-link-Dir;
1167 &f-link-env-Dir;
1168 functions.
1169 </para>
1171 <para>
1172 Examples:
1173 </para>
1175 <example_commands>
1176 env.Command('ddd.list', Dir('ddd'), 'ls -l $SOURCE &gt; $TARGET')
1178 env['DISTDIR'] = 'destination/directory'
1179 env.Command(env.Dir('$DISTDIR')), None, make_distdir)
1180 </example_commands>
1182 <para>
1183 Also note that SCons will usually
1184 automatically create any directory necessary to hold a target file,
1185 so you normally don't need to create directories by hand.
1186 </para>
1187 </listitem>
1188   </varlistentry>
1189   <varlistentry id="f-Configure">
1190     <term><function>Configure</function>(<parameter>env, [custom_tests, conf_dir, log_file, config_h]</parameter>)</term>
1191     <term><replaceable>env</replaceable>.<methodname>Configure</methodname>(<parameter>[custom_tests, conf_dir, log_file, config_h]</parameter>)</term>
1192     <listitem><para>
1193 Creates a &Configure; object for integrated
1194 functionality similar to GNU <command>autoconf</command>.
1195 See the manpage section "Configure Contexts"
1196 for a complete explanation of the arguments and behavior.
1197 </para>
1198 </listitem>
1199   </varlistentry>
1200   <varlistentry id="f-DebugOptions">
1201     <term><function>DebugOptions</function>(<parameter>[json]</parameter>)</term>
1202     <listitem><para>
1203 Allows setting options for SCons debug options. Currently the only supported value is
1204   <emphasis>json</emphasis> which sets the path to the json file created when
1205   <literal>--debug=json</literal> is set.
1206 </para>
1207   <example_commands>
1208 DebugOptions(json='#/build/output/scons_stats.json')
1209 </example_commands>
1210 <para><emphasis>New in version 4.6.0.</emphasis></para>
1211 </listitem>
1212   </varlistentry>
1213   <varlistentry id="f-Decider">
1214     <term><function>Decider</function>(<parameter>function</parameter>)</term>
1215     <term><replaceable>env</replaceable>.<methodname>Decider</methodname>(<parameter>function</parameter>)</term>
1216     <listitem><para>
1217 Specifies that all up-to-date decisions for
1218 targets built through this construction environment
1219 will be handled by the specified
1220 <parameter>function</parameter>.
1221 <parameter>function</parameter> can be the name of
1222 a function or one of the following strings
1223 that specify the predefined decision function
1224 that will be applied:
1225 </para>
1227 <para>
1228 <variablelist>
1229 <varlistentry>
1230 <term><literal>"content"</literal></term>
1231 <listitem>
1232 <para>
1233 Specifies that a target shall be considered out of date and rebuilt
1234 if the dependency's content has changed since the last time
1235 the target was built,
1236 as determined by performing a checksum
1237 on the dependency's contents using the selected hash function,
1238 and comparing it to the checksum recorded the
1239 last time the target was built.
1240 <literal>content</literal> is the default decider.
1241 </para>
1242 <para>
1243 <emphasis>Changed in version 4.1:</emphasis>
1244 The decider was renamed to <literal>content</literal>
1245 since the hash function is now selectable.
1246 The former name, <literal>MD5</literal>,
1247 can still be used as a synonym, but is deprecated.
1248 </para>
1249 </listitem>
1250 </varlistentry>
1251 <varlistentry>
1252 <term><literal>"content-timestamp"</literal></term>
1253 <listitem>
1254 <para>
1255 Specifies that a target shall be considered out of date and rebuilt
1256 if the dependency's content has changed since the last time
1257 the target was built,
1258 except that dependencies with a timestamp that matches
1259 the last time the target was rebuilt will be
1260 assumed to be up-to-date and
1261 <emphasis>not</emphasis>
1262 rebuilt.
1263 This provides behavior very similar
1264 to the
1265 <literal>content</literal>
1266 behavior of always checksumming file contents,
1267 with an optimization of not checking
1268 the contents of files whose timestamps haven't changed.
1269 The drawback is that SCons will
1270 <emphasis>not</emphasis>
1271 detect if a file's content has changed
1272 but its timestamp is the same,
1273 as might happen in an automated script
1274 that runs a build,
1275 updates a file,
1276 and runs the build again,
1277 all within a single second.
1278 </para>
1279 <para>
1280 <emphasis>Changed in version 4.1:</emphasis>
1281 The decider was renamed to <literal>content-timestamp</literal>
1282 since the hash function is now selectable.
1283 The former name, <literal>MD5-timestamp</literal>,
1284 can still be used as a synonym, but is deprecated.
1285 </para>
1286 </listitem>
1287 </varlistentry>
1288 <varlistentry>
1289 <term><literal>"timestamp-newer"</literal></term>
1290 <listitem>
1291 <para>
1292 Specifies that a target shall be considered out of date and rebuilt
1293 if the dependency's timestamp is newer than the target file's timestamp.
1294 This is the behavior of the classic Make utility,
1296 <literal>make</literal>
1297 can be used a synonym for
1298 <literal>timestamp-newer</literal>.
1299 </para>
1300 </listitem>
1301 </varlistentry>
1302 <varlistentry>
1303 <term><literal>"timestamp-match"</literal></term>
1304 <listitem>
1305 <para>
1306 Specifies that a target shall be considered out of date and rebuilt
1307 if the dependency's timestamp is different than the
1308 timestamp recorded the last time the target was built.
1309 This provides behavior very similar to the classic Make utility
1310 (in particular, files are not opened up so that their
1311 contents can be checksummed)
1312 except that the target will also be rebuilt if a
1313 dependency file has been restored to a version with an
1314 <emphasis>earlier</emphasis>
1315 timestamp, such as can happen when restoring files from backup archives.
1316 </para>
1317 </listitem>
1318 </varlistentry>
1319 </variablelist>
1320 </para>
1322 <para>
1323 Examples:
1324 </para>
1326 <example_commands>
1327 # Use exact timestamp matches by default.
1328 Decider('timestamp-match')
1330 # Use hash content signatures for any targets built
1331 # with the attached construction environment.
1332 env.Decider('content')
1333 </example_commands>
1335 <para>
1336 In addition to the above already-available functions, the
1337 <parameter>function</parameter>
1338 argument may be a &Python; function you supply.
1339 Such a function must accept the following four arguments:
1340 </para>
1342 <para>
1343 <variablelist>
1344 <varlistentry>
1345 <term><parameter>dependency</parameter></term>
1346 <listitem>
1347 <para>
1348 The Node (file) which
1349 should cause the
1350 <parameter>target</parameter>
1351 to be rebuilt
1352 if it has "changed" since the last tme
1353 <parameter>target</parameter>
1354 was built.
1355 </para>
1356 </listitem>
1357 </varlistentry>
1358 <varlistentry>
1359 <term><parameter>target</parameter></term>
1360 <listitem>
1361 <para>
1362 The Node (file) being built.
1363 In the normal case,
1364 this is what should get rebuilt
1365 if the
1366 <parameter>dependency</parameter>
1367 has "changed."
1368 </para>
1369 </listitem>
1370 </varlistentry>
1371 <varlistentry>
1372 <term><parameter>prev_ni</parameter></term>
1373 <listitem>
1374 <para>
1375 Stored information about the state of the
1376 <parameter>dependency</parameter>
1377 the last time the
1378 <parameter>target</parameter>
1379 was built.
1380 This can be consulted to match various
1381 file characteristics
1382 such as the timestamp,
1383 size, or &contentsig;.
1384 </para>
1385 </listitem>
1386 </varlistentry>
1387     <varlistentry>
1388 <term><parameter>repo_node</parameter></term>
1389 <listitem>
1390 <para>
1391 If set, use this Node instead of the one specified by
1392 <parameter>dependency</parameter>
1393 to determine if the dependency has changed.
1394 This argument is optional so should be written
1395 as a default argument (typically it would be
1396 written as <parameter>repo_node=None</parameter>).
1397 A caller will normally only set this if the
1398 target only exists in a Repository.
1399 </para>
1400 </listitem>
1401 </varlistentry>
1403 </variablelist>
1404 </para>
1406 <para>
1408 <parameter>function</parameter>
1409 should return a value which evaluates
1410 <constant>True</constant>
1411 if the
1412 <parameter>dependency</parameter>
1413 has "changed" since the last time
1415 <parameter>target</parameter>
1416 was built
1417 (indicating that the target
1418 <emphasis>should</emphasis>
1419 be rebuilt),
1420 and a value which evaluates
1421 <constant>False</constant>
1422 otherwise
1423 (indicating that the target should
1424 <emphasis>not</emphasis>
1425 be rebuilt).
1426 Note that the decision can be made
1427 using whatever criteria are appopriate.
1428 Ignoring some or all of the function arguments
1429 is perfectly normal.
1430 </para>
1432 <para>
1433 Example:
1434 </para>
1436 <example_commands>
1437 def my_decider(dependency, target, prev_ni, repo_node=None):
1438     return not os.path.exists(str(target))
1440 env.Decider(my_decider)
1441 </example_commands>
1442 </listitem>
1443   </varlistentry>
1444   <varlistentry id="f-Default">
1445     <term><function>Default</function>(<parameter>target[, ...]</parameter>)</term>
1446     <term><replaceable>env</replaceable>.<methodname>Default</methodname>(<parameter>target[, ...]</parameter>)</term>
1447     <listitem><para>
1448 Specify default targets to the &SCons; target selection mechanism.
1449 Any call to &f-Default; will cause &SCons; to use the
1450 defined default target list instead of
1451 its built-in algorithm for determining default targets
1452 (see the manpage section "Target Selection").
1453 </para>
1455 <para>
1456 <parameter>target</parameter> may be one or more strings,
1457 a list of strings,
1458 a <classname>NodeList</classname> as returned by a Builder,
1459 or <constant>None</constant>.
1460 A string <parameter>target</parameter> may be the name of
1461 a file or directory, or a target previously defined by a call to
1462 &f-link-Alias; (defining the alias later will still create
1463 the alias, but it will not be recognized as a default).
1464 Calls to &f-Default; are additive.
1465 A <parameter>target</parameter> of
1466 <literal>None</literal>
1467 will clear any existing default target list;
1468 subsequent calls to
1469 &f-Default;
1470 will add to the (now empty) default target list
1471 like normal.
1472 </para>
1474 <para>
1475 Both forms of this call affect the
1476 same global list of default targets; the
1477 construction environment method applies
1478 construction variable expansion to the targets.
1479 </para>
1481 <para>
1482 The current list of targets added using
1483 &f-Default; is available in the
1484 &DEFAULT_TARGETS; list (see below).
1485 </para>
1487 <para>
1488 Examples:
1489 </para>
1491 <example_commands>
1492 Default('foo', 'bar', 'baz')
1493 env.Default(['a', 'b', 'c'])
1494 hello = env.Program('hello', 'hello.c')
1495 env.Default(hello)
1496 </example_commands>
1498 </listitem>
1499   </varlistentry>
1500   <varlistentry id="f-DefaultEnvironment">
1501     <term><function>DefaultEnvironment</function>(<parameter>[**kwargs]</parameter>)</term>
1502     <listitem><para>
1503 Instantiates and returns the global &consenv; object.
1504 This environment is used internally by SCons
1505 when it executes many of the global functions listed in this section
1506 (that is, those not called as methods of a specific &consenv;).
1507 The &defenv; is a singleton:
1508 the keyword arguments are used only on the first call;
1509 on subsequent calls the already-constructed object is returned
1510 and any keyword arguments are silently ignored.
1511 The &defenv; can still be modified after instantiation
1512 in the same way as any other &consenv;.
1513 The &defenv; is independent:
1514 modifying it has no effect on any other &consenv;
1515 constructed by an &f-link-Environment; or &f-link-Clone; call.
1516 </para>
1518 <para>
1519 It is not mandatory to call &f-DefaultEnvironment;:
1520 the &defenv; is instantiated automatically when the
1521 build phase begins if this function has not been called;
1522 however calling it explicitly gives the opportunity to
1523 affect and examine the contents of the &defenv;.
1524 Instantiation happens even if no build instructions
1525 appar to use it, as there are internal uses.
1526 If there are no uses in the project &SConscript; files,
1527 a small performance gain may be seen by calling
1528 &f-DefaultEnvironment; with an empty tools list,
1529 thus avoiding that part of the initialization cost.
1530 This is mainly of interest in testing when &scons; is
1531 launched repeatedly in a short time period:
1532 </para>
1533 <example_commands>
1534 DefaultEnvironment(tools=[])
1535 </example_commands>
1536 </listitem>
1537   </varlistentry>
1538   <varlistentry id="f-Depends">
1539     <term><function>Depends</function>(<parameter>target, dependency</parameter>)</term>
1540     <term><replaceable>env</replaceable>.<methodname>Depends</methodname>(<parameter>target, dependency</parameter>)</term>
1541     <listitem><para>
1542 Specifies an explicit dependency;
1544 <parameter>target</parameter>
1545 will be rebuilt
1546 whenever the
1547 <parameter>dependency</parameter>
1548 has changed.
1549 Both the specified
1550 <parameter>target</parameter>
1552 <parameter>dependency</parameter>
1553 can be a string
1554 (usually the path name of a file or directory)
1555 or Node objects,
1556 or a list of strings or Node objects
1557 (such as returned by a Builder call).
1558 This should only be necessary
1559 for cases where the dependency
1560 is not caught by a Scanner
1561 for the file.
1562 </para>
1564 <para>
1565 Example:
1566 </para>
1568 <example_commands>
1569 env.Depends('foo', 'other-input-file-for-foo')
1571 mylib = env.Library('mylib.c')
1572 installed_lib = env.Install('lib', mylib)
1573 bar = env.Program('bar.c')
1575 # Arrange for the library to be copied into the installation
1576 # directory before trying to build the "bar" program.
1577 # (Note that this is for example only.  A "real" library
1578 # dependency would normally be configured through the $LIBS
1579 # and $LIBPATH variables, not using an env.Depends() call.)
1581 env.Depends(bar, installed_lib)
1582 </example_commands>
1583 </listitem>
1584   </varlistentry>
1585   <varlistentry id="f-Detect">
1586     <term><replaceable>env</replaceable>.<methodname>Detect</methodname>(<parameter>progs</parameter>)</term>
1587     <listitem><para>
1588 Find an executable from one or more choices:
1589 <parameter>progs</parameter> may be a string or a list of strings.
1590 Returns the first value from <parameter>progs</parameter>
1591 that was found, or <constant>None</constant>.
1592 Executable is searched by checking the paths in the execution environment
1593 (<varname>env</varname><literal>['ENV']['PATH']</literal>).
1594 On Windows systems, additionally applies the filename suffixes found in
1595 the execution environment
1596 (<varname>env</varname><literal>['ENV']['PATHEXT']</literal>)
1597 but will not include any such extension in the return value.
1598 &f-env-Detect; is a wrapper around &f-link-env-WhereIs;.
1599 </para>
1600 </listitem>
1601   </varlistentry>
1602   <varlistentry id="f-Dictionary">
1603     <term><replaceable>env</replaceable>.<methodname>Dictionary</methodname>(<parameter>[vars]</parameter>)</term>
1604     <listitem><para>
1605 Returns a dictionary object
1606 containing the &consvars; in the &consenv;.
1607 If there are any arguments specified,
1608 the values of the specified &consvars;
1609 are returned as a string (if one
1610 argument) or as a list of strings.
1611 </para>
1613 <para>
1614 Example:
1615 </para>
1617 <example_commands>
1618 cvars = env.Dictionary()
1619 cc_values = env.Dictionary('CC', 'CCFLAGS', 'CCCOM')
1620 </example_commands>
1621 </listitem>
1622   </varlistentry>
1623   <varlistentry id="f-Dir">
1624     <term><function>Dir</function>(<parameter>name, [directory]</parameter>)</term>
1625     <term><replaceable>env</replaceable>.<methodname>Dir</methodname>(<parameter>name, [directory]</parameter>)</term>
1626     <listitem><para>
1627 Returns Directory Node(s).
1628 A Directory Node is an object that represents a directory.
1629 <parameter>name</parameter>
1630 can be a relative or absolute path or a list of such paths.
1631 <parameter>directory</parameter>
1632 is an optional directory that will be used as the parent directory.
1633 If no
1634 <parameter>directory</parameter>
1635 is specified, the current script's directory is used as the parent.
1636 </para>
1638 <para>
1640 <parameter>name</parameter>
1641 is a single pathname, the corresponding node is returned.
1643 <parameter>name</parameter>
1644 is a list, SCons returns a list of nodes.
1645 Construction variables are expanded in
1646 <parameter>name</parameter>.
1647 </para>
1649 <para>
1650 Directory Nodes can be used anywhere you
1651 would supply a string as a directory name
1652 to a Builder method or function.
1653 Directory Nodes have attributes and methods
1654 that are useful in many situations;
1655 see manpage section "Filesystem Nodes"
1656 for more information.
1657 </para>
1658 </listitem>
1659   </varlistentry>
1660   <varlistentry id="f-Dump">
1661     <term><replaceable>env</replaceable>.<methodname>Dump</methodname>(<parameter>[key], [format]</parameter>)</term>
1662     <listitem><para>
1663 Serializes &consvars; to a string.
1664 The method supports the following formats specified by
1665 <parameter>format</parameter>:
1666 <variablelist>
1667 <varlistentry>
1668 <term><literal>pretty</literal></term>
1669 <listitem>
1670 <para>
1671 Returns a pretty printed representation of the environment (if
1672 <parameter>format</parameter>
1673 is not specified, this is the default).
1674 </para>
1675 </listitem>
1676 </varlistentry>
1677 <varlistentry>
1678 <term><literal>json</literal></term>
1679 <listitem>
1680 <para>
1681 Returns a JSON-formatted string representation of the environment.
1682 </para>
1683 </listitem>
1684 </varlistentry>
1685 </variablelist>
1687 If <varname>key</varname> is
1688 <constant>None</constant> (the default) the entire
1689 dictionary of &consvars; is serialized.
1690 If supplied, it is taken as the name of a &consvar;
1691 whose value is serialized.
1692 </para>
1694 <para>
1695 This SConstruct:
1696 </para>
1698 <example_commands>
1699 env=Environment()
1700 print(env.Dump('CCCOM'))
1701 </example_commands>
1703 <para>
1704 will print:
1705 </para>
1707 <example_commands>
1708 '$CC -c -o $TARGET $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS $SOURCES'
1709 </example_commands>
1711 <para>
1712 While this SConstruct:
1713 </para>
1715 <example_commands>
1716 env = Environment()
1717 print(env.Dump())
1718 </example_commands>
1720 <para>
1721 will print:
1722 </para>
1723 <example_commands>
1724 { 'AR': 'ar',
1725   'ARCOM': '$AR $ARFLAGS $TARGET $SOURCES\n$RANLIB $RANLIBFLAGS $TARGET',
1726   'ARFLAGS': ['r'],
1727   'AS': 'as',
1728   'ASCOM': '$AS $ASFLAGS -o $TARGET $SOURCES',
1729   'ASFLAGS': [],
1730   ...
1731 </example_commands>
1732 </listitem>
1733   </varlistentry>
1734   <varlistentry id="f-EnsurePythonVersion">
1735     <term><function>EnsurePythonVersion</function>(<parameter>major, minor</parameter>)</term>
1736     <listitem><para>
1737 Ensure that the Python version is at least
1738 <varname>major</varname>.<varname>minor</varname>.
1739 This function will
1740 print out an error message and exit SCons with a non-zero exit code if the
1741 actual Python version is not late enough.
1742 </para>
1744 <para>
1745 Example:
1746 </para>
1748 <example_commands>
1749 EnsurePythonVersion(2,2)
1750 </example_commands>
1751 </listitem>
1752   </varlistentry>
1753   <varlistentry id="f-EnsureSConsVersion">
1754     <term><function>EnsureSConsVersion</function>(<parameter>major, minor, [revision]</parameter>)</term>
1755     <listitem><para>
1756 Ensure that the SCons version is at least
1757 <varname>major.minor</varname>,
1759 <varname>major.minor.revision</varname>.
1761 <varname>revision</varname>
1762 is specified.
1763 This function will
1764 print out an error message and exit SCons with a non-zero exit code if the
1765 actual SCons version is not late enough.
1766 </para>
1768 <para>
1769 Examples:
1770 </para>
1772 <example_commands>
1773 EnsureSConsVersion(0,14)
1775 EnsureSConsVersion(0,96,90)
1776 </example_commands>
1777 </listitem>
1778   </varlistentry>
1779   <varlistentry id="f-Environment">
1780     <term><function>Environment</function>(<parameter>[key=value, ...]</parameter>)</term>
1781     <term><replaceable>env</replaceable>.<methodname>Environment</methodname>(<parameter>[key=value, ...]</parameter>)</term>
1782     <listitem><para>
1783 Return a new &consenv;
1784 initialized with the specified
1785 <parameter>key</parameter>=<replaceable>value</replaceable>
1786 pairs.
1787 The keyword arguments
1788 <parameter>parse_flags</parameter>,
1789 <parameter>platform</parameter>,
1790 <parameter>toolpath</parameter>,
1791 <parameter>tools</parameter>
1792 and <parameter>variables</parameter>
1793 are specially recognized and do not lead to
1794 &consvar; creation.
1795 See the manpage section "Construction Environments" for more details.
1796 </para>
1797 </listitem>
1798   </varlistentry>
1799   <varlistentry id="f-Execute">
1800     <term><function>Execute</function>(<parameter>action, [actionargs ...]</parameter>)</term>
1801     <term><replaceable>env</replaceable>.<methodname>Execute</methodname>(<parameter>action, [actionargs ...]</parameter>)</term>
1802     <listitem><para>
1803 Executes an Action.
1804 <parameter>action</parameter>
1805 may be an Action object
1806 or it may be a command-line string,
1807 list of commands,
1808 or executable &Python; function,
1809 each of which will first be converted
1810 into an Action object
1811 and then executed.
1812 Any additional arguments to &f-Execute;
1813 are passed on to the &f-link-Action; factory function
1814 which actually creates the Action object
1815 (see the manpage section <link linkend="action_objects">Action Objects</link>
1816 for a description). Example:
1817 </para>
1819 <example_commands>
1820 Execute(Copy('file.out', 'file.in'))
1821 </example_commands>
1823 <para>&f-Execute; performs its action immediately,
1824 as part of the SConscript-reading phase.
1825 There are no sources or targets declared in an
1826 &f-Execute; call, so any objects it manipulates
1827 will not be tracked as part of the &SCons; dependency graph.
1828 In the example above, neither
1829 <filename>file.out</filename> nor
1830 <filename>file.in</filename> will be tracked objects.
1831 </para>
1833 <para>
1834 &f-Execute; returns the exit value of the command
1835 or return value of the &Python; function.
1836 &scons;
1837 prints an error message if the executed
1838 <parameter>action</parameter>
1839 fails (exits with or returns a non-zero value),
1840 however it does
1841 <emphasis>not</emphasis>,
1842 automatically terminate the build for such a failure.
1843 If you want the build to stop in response to a failed
1844 &f-Execute;
1845 call,
1846 you must explicitly check for a non-zero return value:
1847 </para>
1849 <example_commands>
1850 if Execute("mkdir sub/dir/ectory"):
1851     # The mkdir failed, don't try to build.
1852     Exit(1)
1853 </example_commands>
1854 </listitem>
1855   </varlistentry>
1856   <varlistentry id="f-Exit">
1857     <term><function>Exit</function>(<parameter>[value]</parameter>)</term>
1858     <listitem><para>
1859 This tells
1860 &scons;
1861 to exit immediately
1862 with the specified
1863 <varname>value</varname>.
1864 A default exit value of
1865 <literal>0</literal>
1866 (zero)
1867 is used if no value is specified.
1868 </para>
1869 </listitem>
1870   </varlistentry>
1871   <varlistentry id="f-Export">
1872     <term><function>Export</function>(<parameter>[vars...], [key=value...]</parameter>)</term>
1873     <term><replaceable>env</replaceable>.<methodname>Export</methodname>(<parameter>[vars...], [key=value...]</parameter>)</term>
1874     <listitem><para>
1875 Exports variables for sharing with other SConscript files.
1876 The variables are added to a global collection where
1877 they can be imported by other SConscript files.
1878 <parameter>vars</parameter> may be one or more
1879 strings, or a list of strings. If any string
1880 contains whitespace, it is split automatically
1881 into individual strings. Each string must
1882 match the name of a variable that is in scope
1883 during evaluation of the current SConscript file,
1884 or an exception is raised.
1885 </para>
1887 <para>
1888 A <parameter>vars</parameter> argument
1889 may also be a dictionary or
1890 individual keyword arguments;
1891 in accordance with &Python; syntax rules,
1892 keyword arguments must come after any
1893 non-keyword arguments.
1894 The dictionary/keyword form can be used
1895 to map the local name of a variable to
1896 a different name to be used for imports.
1897 See the Examples for an illustration of the syntax.
1898 </para>
1900 <para>
1901 &f-Export; calls are cumulative. Specifying a previously
1902 exported variable will replace the previous value in the collection.
1903 Both local variables and global variables can be exported.
1904 </para>
1906 <para>
1907 To use an exported variable, an SConscript must
1908 call &f-link-Import; to bring it into its own scope.
1909 Importing creates an additional reference to the object that
1910 was originally exported, so if that object is mutable,
1911 changes made will be visible to other users of that object.
1912 </para>
1914 <para>
1915 Examples:
1916 </para>
1918 <example_commands>
1919 env = Environment()
1920 # Make env available for all SConscript files to Import().
1921 Export("env")
1923 package = 'my_name'
1924 # Make env and package available for all SConscript files:.
1925 Export("env", "package")
1927 # Make env and package available for all SConscript files:
1928 Export(["env", "package"])
1930 # Make env available using the name debug:
1931 Export(debug=env)
1933 # Make env available using the name debug:
1934 Export({"debug": env})
1935 </example_commands>
1937 <para>
1938 Note that the
1939 &f-link-SConscript;
1940 function also supports an &exports;
1941 argument that allows exporting one or more variables
1942 to the SConscript files invoked by that call (only).
1943 See the description of that function for details.
1944 </para>
1945 </listitem>
1946   </varlistentry>
1947   <varlistentry id="f-File">
1948     <term><function>File</function>(<parameter>name, [directory]</parameter>)</term>
1949     <term><replaceable>env</replaceable>.<methodname>File</methodname>(<parameter>name, [directory]</parameter>)</term>
1950     <listitem><para>
1951 Returns File Node(s).
1952 A File Node is an object that represents a file.
1953 <parameter>name</parameter>
1954 can be a relative or absolute path or a list of such paths.
1955 <parameter>directory</parameter>
1956 is an optional directory that will be used as the parent directory.
1957 If no
1958 <parameter>directory</parameter>
1959 is specified, the current script's directory is used as the parent.
1960 </para>
1962 <para>
1964 <parameter>name</parameter>
1965 is a single pathname, the corresponding node is returned.
1967 <parameter>name</parameter>
1968 is a list, SCons returns a list of nodes.
1969 Construction variables are expanded in
1970 <parameter>name</parameter>.
1971 </para>
1973 <para>
1974 File Nodes can be used anywhere you
1975 would supply a string as a file name
1976 to a Builder method or function.
1977 File Nodes have attributes and methods
1978 that are useful in many situations;
1979 see manpage section "Filesystem Nodes"
1980 for more information.
1981 </para>
1982 </listitem>
1983   </varlistentry>
1984   <varlistentry id="f-FindFile">
1985     <term><function>FindFile</function>(<parameter>file, dirs</parameter>)</term>
1986     <term><replaceable>env</replaceable>.<methodname>FindFile</methodname>(<parameter>file, dirs</parameter>)</term>
1987     <listitem><para>
1988 Search for
1989 <parameter>file</parameter>
1990 in the path specified by
1991 <parameter>dirs</parameter>.
1992 <parameter>dirs</parameter>
1993 may be a list of directory names or a single directory name.
1994 In addition to searching for files that exist in the filesystem,
1995 this function also searches for derived files
1996 that have not yet been built.
1997 </para>
1999 <para>
2000 Example:
2001 </para>
2003 <example_commands>
2004 foo = env.FindFile('foo', ['dir1', 'dir2'])
2005 </example_commands>
2006 </listitem>
2007   </varlistentry>
2008   <varlistentry id="f-FindInstalledFiles">
2009     <term><function>FindInstalledFiles</function>()</term>
2010     <term><replaceable>env</replaceable>.<methodname>FindInstalledFiles</methodname>()</term>
2011     <listitem><para>
2012 Returns the list of targets set up by the
2013 &b-link-Install;
2015 &b-link-InstallAs;
2016 builders.
2017 </para>
2019 <para>
2020 This function serves as a convenient method to select the contents of
2021 a binary package.
2022 </para>
2024 <para>
2025 Example:
2026 </para>
2028 <example_commands>
2029 Install('/bin', ['executable_a', 'executable_b'])
2031 # will return the file node list
2032 # ['/bin/executable_a', '/bin/executable_b']
2033 FindInstalledFiles()
2035 Install('/lib', ['some_library'])
2037 # will return the file node list
2038 # ['/bin/executable_a', '/bin/executable_b', '/lib/some_library']
2039 FindInstalledFiles()
2040 </example_commands>
2041 </listitem>
2042   </varlistentry>
2043   <varlistentry id="f-FindPathDirs">
2044     <term><function>FindPathDirs</function>(<parameter>variable</parameter>)</term>
2045     <listitem><para>
2046 Returns a function
2047 (actually a callable Python object)
2048 intended to be used as the
2049 <varname>path_function</varname>
2050 of a Scanner object.
2051 The returned object will look up the specified
2052 <varname>variable</varname>
2053 in a construction environment
2054 and treat the construction variable's value as a list of
2055 directory paths that should be searched
2056 (like
2057 &cv-link-CPPPATH;,
2058 &cv-link-LIBPATH;,
2059 etc.).
2060 </para>
2062 <para>
2063 Note that use of
2064 &f-FindPathDirs;
2065 is generally preferable to
2066 writing your own
2067 <varname>path_function</varname>
2068 for the following reasons:
2069 1) The returned list will contain all appropriate directories
2070 found in source trees
2071 (when
2072 &f-link-VariantDir;
2073 is used)
2074 or in code repositories
2075 (when
2076 &f-Repository;
2077 or the
2078 <option>-Y</option>
2079 option are used).
2080 2) scons will identify expansions of
2081 <varname>variable</varname>
2082 that evaluate to the same list of directories as,
2083 in fact, the same list,
2084 and avoid re-scanning the directories for files,
2085 when possible.
2086 </para>
2088 <para>
2089 Example:
2090 </para>
2092 <example_commands>
2093 def my_scan(node, env, path, arg):
2094     # Code to scan file contents goes here...
2095     return include_files
2097 scanner = Scanner(name = 'myscanner',
2098                   function = my_scan,
2099                   path_function = FindPathDirs('MYPATH'))
2100 </example_commands>
2101 </listitem>
2102   </varlistentry>
2103   <varlistentry id="f-FindSourceFiles">
2104     <term><function>FindSourceFiles</function>(<parameter>node='"."'</parameter>)</term>
2105     <term><replaceable>env</replaceable>.<methodname>FindSourceFiles</methodname>(<parameter>node='"."'</parameter>)</term>
2106     <listitem><para>
2107 Returns the list of nodes which serve as the source of the built files.
2108 It does so by inspecting the dependency tree starting at the optional
2109 argument
2110 <parameter>node</parameter>
2111 which defaults to the '"."'-node. It will then return all leaves of
2112 <parameter>node</parameter>.
2113 These are all children which have no further children.
2114 </para>
2116 <para>
2117 This function is a convenient method to select the contents of a Source
2118 Package.
2119 </para>
2121 <para>
2122 Example:
2123 </para>
2125 <example_commands>
2126 Program('src/main_a.c')
2127 Program('src/main_b.c')
2128 Program('main_c.c')
2130 # returns ['main_c.c', 'src/main_a.c', 'SConstruct', 'src/main_b.c']
2131 FindSourceFiles()
2133 # returns ['src/main_b.c', 'src/main_a.c' ]
2134 FindSourceFiles('src')
2135 </example_commands>
2137 <para>
2138 As you can see build support files (SConstruct in the above example)
2139 will also be returned by this function.
2140 </para>
2141 </listitem>
2142   </varlistentry>
2143   <varlistentry id="f-Flatten">
2144     <term><function>Flatten</function>(<parameter>sequence</parameter>)</term>
2145     <term><replaceable>env</replaceable>.<methodname>Flatten</methodname>(<parameter>sequence</parameter>)</term>
2146     <listitem><para>
2147 Takes a sequence (that is, a &Python; list or tuple)
2148 that may contain nested sequences
2149 and returns a flattened list containing
2150 all of the individual elements in any sequence.
2151 This can be helpful for collecting
2152 the lists returned by calls to Builders;
2153 other Builders will automatically
2154 flatten lists specified as input,
2155 but direct &Python; manipulation of
2156 these lists does not.
2157 </para>
2159 <para>
2160 Examples:
2161 </para>
2163 <example_commands>
2164 foo = Object('foo.c')
2165 bar = Object('bar.c')
2167 # Because `foo' and `bar' are lists returned by the Object() Builder,
2168 # `objects' will be a list containing nested lists:
2169 objects = ['f1.o', foo, 'f2.o', bar, 'f3.o']
2171 # Passing such a list to another Builder is all right because
2172 # the Builder will flatten the list automatically:
2173 Program(source = objects)
2175 # If you need to manipulate the list directly using &Python;, you need to
2176 # call Flatten() yourself, or otherwise handle nested lists:
2177 for object in Flatten(objects):
2178     print(str(object))
2179 </example_commands>
2180 </listitem>
2181   </varlistentry>
2182   <varlistentry id="f-GetBuildFailures">
2183     <term><function>GetBuildFailures</function>()</term>
2184     <listitem><para>
2185 Returns a list of exceptions for the
2186 actions that failed while
2187 attempting to build targets.
2188 Each element in the returned list is a
2189 <classname>BuildError</classname>
2190 object
2191 with the following attributes
2192 that record various aspects
2193 of the build failure:
2194 </para>
2196 <para>
2197 <literal>.node</literal>
2198 The node that was being built
2199 when the build failure occurred.
2200 </para>
2202 <para>
2203 <literal>.status</literal>
2204 The numeric exit status
2205 returned by the command or Python function
2206 that failed when trying to build the
2207 specified Node.
2208 </para>
2210 <para>
2211 <literal>.errstr</literal>
2212 The SCons error string
2213 describing the build failure.
2214 (This is often a generic
2215 message like "Error 2"
2216 to indicate that an executed
2217 command exited with a status of 2.)
2218 </para>
2220 <para>
2221 <literal>.filename</literal>
2222 The name of the file or
2223 directory that actually caused the failure.
2224 This may be different from the
2225 <literal>.node</literal>
2226 attribute.
2227 For example,
2228 if an attempt to build a target named
2229 <filename>sub/dir/target</filename>
2230 fails because the
2231 <filename>sub/dir</filename>
2232 directory could not be created,
2233 then the
2234 <literal>.node</literal>
2235 attribute will be
2236 <filename>sub/dir/target</filename>
2237 but the
2238 <literal>.filename</literal>
2239 attribute will be
2240 <filename>sub/dir</filename>.
2241 </para>
2243 <para>
2244 <literal>.executor</literal>
2245 The SCons Executor object
2246 for the target Node
2247 being built.
2248 This can be used to retrieve
2249 the construction environment used
2250 for the failed action.
2251 </para>
2253 <para>
2254 <literal>.action</literal>
2255 The actual SCons Action object that failed.
2256 This will be one specific action
2257 out of the possible list of
2258 actions that would have been
2259 executed to build the target.
2260 </para>
2262 <para>
2263 <literal>.command</literal>
2264 The actual expanded command that was executed and failed,
2265 after expansion of
2266 &cv-link-TARGET;,
2267 &cv-link-SOURCE;,
2268 and other construction variables.
2269 </para>
2271 <para>
2272 Note that the
2273 &f-GetBuildFailures;
2274 function
2275 will always return an empty list
2276 until any build failure has occurred,
2277 which means that
2278 &f-GetBuildFailures;
2279 will always return an empty list
2280 while the
2281 &SConscript;
2282 files are being read.
2283 Its primary intended use is
2284 for functions that will be
2285 executed before SCons exits
2286 by passing them to the
2287 standard Python
2288 <function>atexit.register</function>()
2289 function.
2290 Example:
2291 </para>
2293 <example_commands>
2294 import atexit
2296 def print_build_failures():
2297     from SCons.Script import GetBuildFailures
2298     for bf in GetBuildFailures():
2299         print("%s failed: %s" % (bf.node, bf.errstr))
2301 atexit.register(print_build_failures)
2302 </example_commands>
2303 </listitem>
2304   </varlistentry>
2305   <varlistentry id="f-GetBuildPath">
2306     <term><function>GetBuildPath</function>(<parameter>file, [...]</parameter>)</term>
2307     <term><replaceable>env</replaceable>.<methodname>GetBuildPath</methodname>(<parameter>file, [...]</parameter>)</term>
2308     <listitem><para>
2309 Returns the
2310 &scons;
2311 path name (or names) for the specified
2312 <parameter>file</parameter>
2313 (or files).
2314 The specified
2315 <parameter>file</parameter>
2316 or files
2317 may be
2318 &scons;
2319 Nodes or strings representing path names.
2320 </para>
2321 </listitem>
2322   </varlistentry>
2323   <varlistentry id="f-GetLaunchDir">
2324     <term><function>GetLaunchDir</function>()</term>
2325     <listitem><para>
2326 Returns the absolute path name of the directory from which
2327 &scons;
2328 was initially invoked.
2329 This can be useful when using the
2330 <option>-u</option>,
2331 <option>-U</option>
2333 <option>-D</option>
2334 options, which internally
2335 change to the directory in which the
2336 &SConstruct;
2337 file is found.
2338 </para>
2339 </listitem>
2340   </varlistentry>
2341   <varlistentry id="f-GetOption">
2342     <term><function>GetOption</function>(<parameter>name</parameter>)</term>
2343     <term><replaceable>env</replaceable>.<methodname>GetOption</methodname>(<parameter>name</parameter>)</term>
2344     <listitem><para>
2345 Query the value of settable options which may have been set
2346 on the command line, via option defaults,
2347 or by using the &f-link-SetOption; function.
2348 The value of the option is returned in a type matching how the
2349 option was declared - see the documentation of the
2350 corresponding command line option for information about each specific
2351 option.
2352 </para>
2354 <para>
2355 <parameter>name</parameter> can be an entry from the following table,
2356 which shows the corresponding command line arguments
2357 that could affect the value.
2358 <parameter>name</parameter> can be also be the destination
2359 variable name from a project-specific option added using the
2360 &f-link-AddOption; function, as long as that addition has been
2361 processed prior to the &f-GetOption; call in the &SConscript; files.
2362 </para>
2364 <informaltable rowsep="1" colsep="1" frame="topbot">
2365 <tgroup cols="3">
2366 <thead>
2367 <row>
2368   <entry align="left">Query name</entry>
2369   <entry align="left">Command-line options</entry>
2370   <entry align="left">Notes</entry>
2371 </row>
2372 </thead>
2374 <tbody>
2375 <row>
2376   <entry><varname>cache_debug</varname></entry>
2377   <entry><option>--cache-debug</option></entry>
2378 </row>
2379 <row>
2380   <entry><varname>cache_disable</varname></entry>
2381   <entry>
2382       <option>--cache-disable</option>,
2383       <option>--no-cache</option>
2384   </entry>
2385 </row>
2386 <row>
2387   <entry><varname>cache_force</varname></entry>
2388   <entry>
2389       <option>--cache-force</option>,
2390       <option>--cache-populate</option>
2391   </entry>
2392 </row>
2393 <row>
2394   <entry><varname>cache_readonly</varname></entry>
2395   <entry><option>--cache-readonly</option></entry>
2396 </row>
2397 <row>
2398   <entry><varname>cache_show</varname></entry>
2399   <entry><option>--cache-show</option></entry>
2400 </row>
2401 <row>
2402   <entry><varname>clean</varname></entry>
2403   <entry>
2404       <option>-c</option>,
2405       <option>--clean</option>,
2406       <option>--remove</option>
2407   </entry>
2408 </row>
2409 <row>
2410   <entry><varname>climb_up</varname></entry>
2411   <entry>
2412       <option>-D</option>
2413       <option>-U</option>
2414       <option>-u</option>
2415       <option>--up</option>
2416       <option>--search_up</option>
2417   </entry>
2418 </row>
2419 <row>
2420   <entry><varname>config</varname></entry>
2421   <entry><option>--config</option></entry>
2422 </row>
2423 <row>
2424   <entry><varname>debug</varname></entry>
2425   <entry><option>--debug</option></entry>
2426 </row>
2427 <row>
2428   <entry><varname>directory</varname></entry>
2429   <entry><option>-C</option>, <option>--directory</option></entry>
2430 </row>
2431 <row>
2432   <entry><varname>diskcheck</varname></entry>
2433   <entry><option>--diskcheck</option></entry>
2434 </row>
2435 <row>
2436   <entry><varname>duplicate</varname></entry>
2437   <entry><option>--duplicate</option></entry>
2438 </row>
2439 <row>
2440   <entry><varname>enable_virtualenv</varname></entry>
2441   <entry><option>--enable-virtualenv</option></entry>
2442 </row>
2443 <row>
2444   <entry><varname>experimental</varname></entry>
2445   <entry><option>--experimental</option></entry>
2446   <entry><emphasis>since 4.2</emphasis></entry>
2447 </row>
2448 <row>
2449   <entry><varname>file</varname></entry>
2450   <entry>
2451       <option>-f</option>,
2452       <option>--file</option>,
2453       <option>--makefile</option>,
2454       <option>--sconstruct</option>
2455   </entry>
2456 </row>
2457 <row>
2458   <entry><varname>hash_format</varname></entry>
2459   <entry><option>--hash-format</option></entry>
2460   <entry><emphasis>since 4.2</emphasis></entry>
2461 </row>
2462 <row>
2463   <entry><varname>help</varname></entry>
2464   <entry><option>-h</option>, <option>--help</option></entry>
2465 </row>
2466 <row>
2467   <entry><varname>ignore_errors</varname></entry>
2468   <entry><option>-i</option>, <option>--ignore-errors</option></entry>
2469 </row>
2470 <row>
2471   <entry><varname>ignore_virtualenv</varname></entry>
2472   <entry><option>--ignore-virtualenv</option></entry>
2473 </row>
2474 <row>
2475   <entry><varname>implicit_cache</varname></entry>
2476   <entry><option>--implicit-cache</option></entry>
2477 </row>
2478 <row>
2479   <entry><varname>implicit_deps_changed</varname></entry>
2480   <entry><option>--implicit-deps-changed</option></entry>
2481 </row>
2482 <row>
2483   <entry><varname>implicit_deps_unchanged</varname></entry>
2484   <entry><option>--implicit-deps-unchanged</option></entry>
2485 </row>
2486 <row>
2487   <entry><varname>include_dir</varname></entry>
2488   <entry><option>-I</option>, <option>--include-dir</option></entry>
2489 </row>
2490 <row>
2491   <entry><varname>install_sandbox</varname></entry>
2492   <entry><option>--install-sandbox</option></entry>
2493   <entry>Available only if the &t-link-install; tool has been called</entry>
2494 </row>
2495 <row>
2496   <entry><varname>keep_going</varname></entry>
2497   <entry><option>-k</option>, <option>--keep-going</option></entry>
2498 </row>
2499 <row>
2500   <entry><varname>max_drift</varname></entry>
2501   <entry><option>--max-drift</option></entry>
2502 </row>
2503 <row>
2504   <entry><varname>md5_chunksize</varname></entry>
2505   <entry>
2506       <option>--hash-chunksize</option>,
2507       <option>--md5-chunksize</option>
2508   </entry>
2509   <entry><emphasis><option>--hash-chunksize</option> since 4.2</emphasis></entry>
2510 </row>
2511 <row>
2512   <entry><varname>no_exec</varname></entry>
2513   <entry>
2514       <option>-n</option>,
2515       <option>--no-exec</option>,
2516       <option>--just-print</option>,
2517       <option>--dry-run</option>,
2518       <option>--recon</option>
2519   </entry>
2520 </row>
2521 <row>
2522   <entry><varname>no_progress</varname></entry>
2523   <entry><option>-Q</option></entry>
2524 </row>
2525 <row>
2526   <entry><varname>num_jobs</varname></entry>
2527   <entry><option>-j</option>, <option>--jobs</option></entry>
2528 </row>
2529 <row>
2530   <entry><varname>package_type</varname></entry>
2531   <entry><option>--package-type</option></entry>
2532   <entry>Available only if the &t-link-packaging; tool has been called</entry>
2533 </row>
2534 <row>
2535   <entry><varname>profile_file</varname></entry>
2536   <entry><option>--profile</option></entry>
2537 </row>
2538 <row>
2539   <entry><varname>question</varname></entry>
2540   <entry><option>-q</option>, <option>--question</option></entry>
2541 </row>
2542 <row>
2543   <entry><varname>random</varname></entry>
2544   <entry><option>--random</option></entry>
2545 </row>
2546 <row>
2547   <entry><varname>repository</varname></entry>
2548   <entry>
2549       <option>-Y</option>,
2550       <option>--repository</option>,
2551       <option>--srcdir</option>
2552   </entry>
2553 </row>
2554 <row>
2555   <entry><varname>silent</varname></entry>
2556   <entry>
2557       <option>-s</option>,
2558       <option>--silent</option>,
2559       <option>--quiet</option>
2560   </entry>
2561 </row>
2562 <row>
2563   <entry><varname>site_dir</varname></entry>
2564   <entry><option>--site-dir</option>, <option>--no-site-dir</option></entry>
2565 </row>
2566 <row>
2567   <entry><varname>stack_size</varname></entry>
2568   <entry><option>--stack-size</option></entry>
2569 </row>
2570 <row>
2571   <entry><varname>taskmastertrace_file</varname></entry>
2572   <entry><option>--taskmastertrace</option></entry>
2573 </row>
2574 <row>
2575   <entry><varname>tree_printers</varname></entry>
2576   <entry><option>--tree</option></entry>
2577 </row>
2578 <row>
2579   <entry><varname>warn</varname></entry>
2580   <entry><option>--warn</option>, <option>--warning</option></entry>
2581 </row>
2583 </tbody>
2584 </tgroup>
2585 </informaltable>
2586 </listitem>
2587   </varlistentry>
2588   <varlistentry id="f-GetSConsVersion">
2589     <term><function>GetSConsVersion</function>()</term>
2590     <listitem><para>
2591 Returns the current SCons version in the form of a Tuple[int, int, int],
2592 representing the major, minor, and revision values respectively.
2593 <emphasis>Added in 4.7.1</emphasis>.
2594 </para>
2595 </listitem>
2596   </varlistentry>
2597   <varlistentry id="f-Glob">
2598     <term><function>Glob</function>(<parameter>pattern, [ondisk=True, source=False, strings=False, exclude=None]</parameter>)</term>
2599     <term><replaceable>env</replaceable>.<methodname>Glob</methodname>(<parameter>pattern, [ondisk=True, source=False, strings=False, exclude=None]</parameter>)</term>
2600     <listitem><para>
2601 Returns a possibly empty list of Nodes (or strings) that match
2602 pathname specification <parameter>pattern</parameter>.
2603 <parameter>pattern</parameter> can be absolute,
2604 top-relative,
2605 or (most commonly) relative to the directory of the current
2606 &SConscript; file.
2607 &f-Glob; matches both files stored on disk and Nodes
2608 which &SCons; already knows about, even if any corresponding
2609 file is not currently stored on disk.
2610 The evironment method form (&f-env-Glob;)
2611 performs string substition on
2612 <parameter>pattern</parameter>
2613 and returns whatever matches the resulting expanded pattern.
2614 The results are sorted, unlike for the similar &Python;
2615 <systemitem>glob.glob</systemitem> function,
2616 to ensure build order will be stable.
2617 </para>
2619 <para>
2620 <parameter>pattern</parameter>
2621 can contain POSIX-style shell metacharacters for matching:
2622 </para>
2624 <informaltable rowsep="1" colsep="1" frame="topbot">
2625 <tgroup cols="2">
2626 <thead>
2627   <row>
2628     <entry>Pattern</entry>
2629     <entry>Meaning</entry>
2630   </row>
2631 </thead>
2632 <tbody>
2633   <row>
2634     <entry><literal>*</literal></entry>
2635     <entry>matches everything</entry>
2636   </row>
2637   <row>
2638       <entry><literal>?</literal></entry>
2639       <entry>matches any single character</entry>
2640   </row>
2641   <row>
2642       <entry><literal>[seq]</literal></entry>
2643       <entry>matches any character in <emphasis>seq</emphasis>
2644       (can be a list or a range).</entry>
2645   </row>
2646   <row>
2647       <entry><literal>[!seq]</literal></entry>
2648       <entry>matches any character not in <emphasis>seq</emphasis></entry>
2649   </row>
2650 </tbody>
2651 </tgroup>
2652 </informaltable>
2654 <para>
2655 For a literal match, wrap the metacharacter in brackets to
2656 escape the normal behavior.
2657 For example, <literal>'[?]'</literal> matches the character
2658 <literal>'?'</literal>.
2659 </para>
2661 <para>
2662 Filenames starting with a dot are specially handled -
2663 they can only be matched by patterns that start with a dot
2664 (or have a dot immediately following a pathname separator
2665 character, or slash), they are not not matched by the metacharacters.
2666 Metacharacter matches also do not span directory separators.
2667 </para>
2669 <para>
2670 &f-Glob;
2671 understands repositories
2672 (see the
2673 &f-link-Repository;
2674 function)
2675 and source directories
2676 (see the
2677 &f-link-VariantDir;
2678 function)
2679 and returns a Node (or string, if so configured) match
2680 in the local (SConscript) directory
2681 if a matching Node is found
2682 anywhere in a corresponding
2683 repository or source directory.
2684 </para>
2686 <para>
2687 If the optional
2688 <parameter>ondisk</parameter>
2689 argument evaluates false,
2690 the search for matches on disk is disabled,
2691 and only matches from
2692 already-configured File or Dir Nodes are returned.
2693 The default is to return Nodes for
2694 matches on disk as well.
2695 </para>
2697 <para>
2698 If the optional
2699 <parameter>source</parameter>
2700 argument evaluates true,
2701 and the local directory is a variant directory,
2702 then &f-Glob; returnes Nodes from
2703 the corresponding source directory,
2704 rather than the local directory.
2705 <!-- XXX what about generated files that don't exist in src but will be sources? -->
2706 </para>
2708 <para>
2709 If the optional
2710 <parameter>strings</parameter>
2711 argument evaluates true,
2712 &f-Glob;
2713 returns matches as strings, rather than Nodes.
2714 The returned strings will be relative to
2715 the local (SConscript) directory.
2716 (Note that while this may make it easier to perform
2717 arbitrary manipulation of file names,
2718 it loses the context &SCons; would have in the Node,
2719 so if the returned strings are
2720 passed to a different
2721 &SConscript;
2722 file,
2723 any Node translation there will be relative
2724 to that
2725 &SConscript;
2726 directory,
2727 not to the original
2728 &SConscript;
2729 directory.)
2730 </para>
2732 <para>
2733 The optional
2734 <parameter>exclude</parameter>
2735 argument may be set to a pattern or a list of patterns
2736 descibing files or directories
2737 to filter out of the match list.
2738 Elements matching a least one specified pattern will be excluded.
2739 These patterns use the same syntax as for
2740 <parameter>pattern</parameter>.
2741 </para>
2743 <para>
2744 Examples:
2745 </para>
2747 <example_commands>
2748 Program("foo", Glob("*.c"))
2749 Zip("/tmp/everything", Glob(".??*") + Glob("*"))
2750 sources = Glob("*.cpp", exclude=["os_*_specific_*.cpp"]) \
2751     + Glob("os_%s_specific_*.cpp" % currentOS)
2752 </example_commands>
2754 </listitem>
2755   </varlistentry>
2756   <varlistentry id="f-Help">
2757     <term><function>Help</function>(<parameter>text, append=False, local_only=False</parameter>)</term>
2758     <term><replaceable>env</replaceable>.<methodname>Help</methodname>(<parameter>text, append=False, local_only=False</parameter>)</term>
2759     <listitem><para>
2760 Adds <parameter>text</parameter> to the help message shown when
2761 &scons; is called with the
2762 <option>-h</option> or <option>--help</option>
2763 argument.
2764 </para>
2765 <para>
2766 On the first call to &f-Help;,
2767 if <parameter>append</parameter> is <constant>False</constant>
2768 (the default), any existing help text is discarded.
2769 The default help text is the help for the &scons;
2770 command itself plus help collected from any
2771 project-local &f-link-AddOption; calls.
2772 This is the help printed if &f-Help; has never been called.
2773 If <parameter>append</parameter> is <constant>True</constant>,
2774 <parameter>text</parameter> is appended to
2775 the existing help text.
2776 If <parameter>local_only</parameter> is also <constant>True</constant>
2777 (the default is <constant>False</constant>),
2778 the project-local help from &f-AddOption; calls is preserved
2779 in the help message but the &scons; command help is not.
2780 </para>
2781 <para>
2782 Subsequent calls to
2783 &f-Help; ignore the keyword arguments
2784 <parameter>append</parameter> and
2785 <parameter>local_only</parameter>
2786 and always append to the existing help text.
2787 </para>
2788 <para>
2789 <emphasis>Changed in 4.6.0</emphasis>: added <parameter>local_only</parameter>.
2790 </para>
2792 </listitem>
2793   </varlistentry>
2794   <varlistentry id="f-Ignore">
2795     <term><function>Ignore</function>(<parameter>target, dependency</parameter>)</term>
2796     <term><replaceable>env</replaceable>.<methodname>Ignore</methodname>(<parameter>target, dependency</parameter>)</term>
2797     <listitem><para>
2798 Ignores <parameter>dependency</parameter>
2799 when deciding if
2800 <parameter>target</parameter> needs to be rebuilt.
2801 <parameter>target</parameter> and
2802 <parameter>dependency</parameter>
2803 can each be a single filename or Node
2804 or a list of filenames or Nodes.
2805 </para>
2807 <para>
2808 &f-Ignore; can also be used to
2809 remove a target from the default build
2810 by specifying the directory the target will be built in as
2811 <parameter>target</parameter>
2812 and the file you want to skip selecting for building as
2813 <parameter>dependency</parameter>.
2814 Note that this only removes the target from
2815 the default target selection algorithm:
2816 if it is a dependency of another object being
2817 built &SCons; still builds it normally.
2818 See the third and forth examples below.
2819 </para>
2821 <para>
2822 Examples:
2823 </para>
2825 <example_commands>
2826 env.Ignore('foo', 'foo.c')
2827 env.Ignore('bar', ['bar1.h', 'bar2.h'])
2828 env.Ignore('.', 'foobar.obj')
2829 env.Ignore('bar', 'bar/foobar.obj')
2830 </example_commands>
2831 </listitem>
2832   </varlistentry>
2833   <varlistentry id="f-Import">
2834     <term><function>Import</function>(<parameter>vars...</parameter>)</term>
2835     <term><replaceable>env</replaceable>.<methodname>Import</methodname>(<parameter>vars...</parameter>)</term>
2836     <listitem><para>
2837 Imports variables into the scope of the current SConscript file.
2838 <parameter>vars</parameter>
2839 must be strings representing names of variables
2840 which have been previously exported either by the
2841 &f-link-Export; function or by the
2842 &exports; argument to the
2843 &f-link-SConscript; function.
2844 Variables exported by the
2845 &f-SConscript; call
2846 take precedence.
2847 Multiple variable names can be passed to
2848 &f-Import;
2849 as separate arguments, as a list of strings,
2850 or as words in a space-separated string.
2851 The wildcard <literal>"*"</literal> can be used to import all
2852 available variables.
2853 </para>
2855 <para>
2856 If the imported variable is mutable,
2857 changes made locally will be reflected in the object the
2858 variable is bound to. This allows subsidiary SConscript files
2859 to contribute to building up, for example, a &consenv;.
2860 </para>
2862 <para>
2863 Examples:
2864 </para>
2866 <example_commands>
2867 Import("env")
2868 Import("env", "variable")
2869 Import(["env", "variable"])
2870 Import("*")
2871 </example_commands>
2872 </listitem>
2873   </varlistentry>
2874   <varlistentry id="f-Literal">
2875     <term><function>Literal</function>(<parameter>string</parameter>)</term>
2876     <term><replaceable>env</replaceable>.<methodname>Literal</methodname>(<parameter>string</parameter>)</term>
2877     <listitem><para>
2878 The specified
2879 <parameter>string</parameter>
2880 will be preserved as-is
2881 and not have construction variables expanded.
2882 </para>
2883 </listitem>
2884   </varlistentry>
2885   <varlistentry id="f-Local">
2886     <term><function>Local</function>(<parameter>targets</parameter>)</term>
2887     <term><replaceable>env</replaceable>.<methodname>Local</methodname>(<parameter>targets</parameter>)</term>
2888     <listitem><para>
2889 The specified
2890 <parameter>targets</parameter>
2891 will have copies made in the local tree,
2892 even if an already up-to-date copy
2893 exists in a repository.
2894 Returns a list of the target Node or Nodes.
2895 </para>
2896 </listitem>
2897   </varlistentry>
2898   <varlistentry id="f-MergeFlags">
2899     <term><replaceable>env</replaceable>.<methodname>MergeFlags</methodname>(<parameter>arg, [unique]</parameter>)</term>
2900     <listitem><para>
2901 Merges values from
2902 <parameter>arg</parameter>
2903 into &consvars; in <parameter>env</parameter>.
2904 If <parameter>arg</parameter> is a dictionary,
2905 each key-value pair represents a
2906 &consvar; name and the corresponding flags to merge.
2907 If <parameter>arg</parameter>
2908 is not a dictionary,
2909 &MergeFlags; attempts to convert it to one
2910 before the values are merged.
2911 &f-link-env-ParseFlags; is used for this,
2912 so values to be converted are subject to the
2913 same limitations:
2914 &ParseFlags; has knowledge of which &consvars; certain
2915 flags should go to, but not all;
2916 and only for GCC and compatible compiler chains.
2917 <parameter>arg</parameter>
2918 must be a single object,
2919 so to pass multiple strings,
2920 enclose them in a list.
2921 </para>
2923 <para>
2924 If <literal>unique</literal> is true (the default),
2925 duplicate values are not retained.
2926 In case of duplication,
2927 any &consvar; names that end in
2928 <literal>PATH</literal>
2929 keep the left-most value so the
2930 path searcb order is not altered.
2931 All other &consvars; keep
2932 the right-most value.
2933 If <literal>unique</literal> is false,
2934 values are appended even if they are duplicates.
2935 </para>
2937 <para>
2938 Examples:
2939 </para>
2941 <example_commands>
2942 # Add an optimization flag to $CCFLAGS.
2943 env.MergeFlags({'CCFLAGS': '-O3'})
2945 # Combine the flags returned from running pkg-config with an optimization
2946 # flag and merge the result into the construction variables.
2947 env.MergeFlags(['!pkg-config gtk+-2.0 --cflags', '-O3'])
2949 # Combine an optimization flag with the flags returned from running pkg-config
2950 # for two distinct packages and merge into the construction variables.
2951 env.MergeFlags(
2952     [
2953         '-O3',
2954         '!pkg-config gtk+-2.0 --cflags --libs',
2955         '!pkg-config libpng12 --cflags --libs',
2956     ]
2958 </example_commands>
2959 </listitem>
2960   </varlistentry>
2961   <varlistentry id="f-NoCache">
2962     <term><function>NoCache</function>(<parameter>target, ...</parameter>)</term>
2963     <term><replaceable>env</replaceable>.<methodname>NoCache</methodname>(<parameter>target, ...</parameter>)</term>
2964     <listitem><para>
2965 Specifies a list of files which should
2966 <emphasis>not</emphasis>
2967 be cached whenever the
2968 &f-link-CacheDir;
2969 method has been activated.
2970 The specified targets may be a list
2971 or an individual target.
2972 </para>
2974 <para>
2975 Multiple files should be specified
2976 either as separate arguments to the
2977 &f-NoCache;
2978 method, or as a list.
2979 &f-NoCache;
2980 will also accept the return value of any of the construction environment
2981 Builder methods.
2982 </para>
2984 <para>
2985 Calling
2986 &f-NoCache;
2987 on directories and other non-File Node types has no effect because
2988 only File Nodes are cached.
2989 </para>
2991 <para>
2992 Examples:
2993 </para>
2995 <example_commands>
2996 NoCache('foo.elf')
2997 NoCache(env.Program('hello', 'hello.c'))
2998 </example_commands>
2999 </listitem>
3000   </varlistentry>
3001   <varlistentry id="f-NoClean">
3002     <term><function>NoClean</function>(<parameter>target, ...</parameter>)</term>
3003     <term><replaceable>env</replaceable>.<methodname>NoClean</methodname>(<parameter>target, ...</parameter>)</term>
3004     <listitem><para>
3005 Specifies a list of files or directories which should
3006 <emphasis>not</emphasis>
3007 be removed whenever the targets (or their dependencies)
3008 are specified with the
3009 <option>-c</option>
3010 command line option.
3011 The specified targets may be a list
3012 or an individual target.
3013 Multiple calls to
3014 &f-NoClean;
3015 are legal,
3016 and prevent each specified target
3017 from being removed by calls to the
3018 <option>-c</option>
3019 option.
3020 </para>
3022 <para>
3023 Multiple files or directories should be specified
3024 either as separate arguments to the
3025 &f-NoClean;
3026 method, or as a list.
3027 &f-NoClean;
3028 will also accept the return value of any of the construction environment
3029 Builder methods.
3030 </para>
3032 <para>
3033 Calling
3034 &f-NoClean;
3035 for a target overrides calling
3036 &f-link-Clean;
3037 for the same target,
3038 and any targets passed to both functions will
3039 <emphasis>not</emphasis>
3040 be removed by the
3041 <option>-c</option>
3042 option.
3043 </para>
3045 <para>
3046 Examples:
3047 </para>
3049 <example_commands>
3050 NoClean('foo.elf')
3051 NoClean(env.Program('hello', 'hello.c'))
3052 </example_commands>
3053 </listitem>
3054   </varlistentry>
3055   <varlistentry id="f-ParseConfig">
3056     <term><replaceable>env</replaceable>.<methodname>ParseConfig</methodname>(<parameter>command, [function, unique]</parameter>)</term>
3057     <listitem><para>
3058 Updates the current &consenv; with the values extracted
3059 from the output of running external <parameter>command</parameter>,
3060 by passing it to a helper <parameter>function</parameter>.
3061 <parameter>command</parameter> may be a string
3062 or a list of strings representing the command and
3063 its arguments.
3064 If <parameter>function</parameter>
3065 is omitted or <constant>None</constant>,
3066 &f-link-env-MergeFlags; is used.
3067 By default,
3068 duplicate values are not
3069 added to any construction variables;
3070 you can specify
3071 <parameter>unique=False</parameter>
3072 to allow duplicate values to be added.
3073 </para>
3075 <para>
3076 <parameter>command</parameter> is executed using the
3077 SCons execution environment (that is, the &consvar;
3078 &cv-link-ENV; in the current &consenv;).
3079 If <parameter>command</parameter> needs additional information
3080 to operate properly, that needs to be set in the execution environment.
3081 For example, <command>pkg-config</command>
3082 may need a custom value set in the <envar>PKG_CONFIG_PATH</envar>
3083 environment variable.
3084 </para>
3086 <para>
3087 &f-env-MergeFlags; needs to understand
3088 the output produced by <parameter>command</parameter>
3089 in order to distribute it to appropriate &consvars;.
3090 &f-env-MergeFlags; uses a separate function to
3091 do that processing -
3092 see &f-link-env-ParseFlags; for the details, including a
3093 a table of options and corresponding construction variables.
3094 To provide alternative processing of the output of
3095 <parameter>command</parameter>,
3096 you can suppply a custom
3097 <parameter>function</parameter>,
3098 which must accept three arguments:
3099 the &consenv; to modify,
3100 a string argument containing the output from running
3101 <parameter>command</parameter>,
3102 and the optional
3103 <parameter>unique</parameter> flag.
3104 </para>
3105 </listitem>
3106   </varlistentry>
3107   <varlistentry id="f-ParseDepends">
3108     <term><function>ParseDepends</function>(<parameter>filename, [must_exist, only_one]</parameter>)</term>
3109     <term><replaceable>env</replaceable>.<methodname>ParseDepends</methodname>(<parameter>filename, [must_exist, only_one]</parameter>)</term>
3110     <listitem><para>
3111 Parses the contents of <parameter>filename</parameter>
3112 as a list of dependencies in the style of
3113 &Make;
3115 <application>mkdep</application>,
3116 and explicitly establishes all of the listed dependencies.
3117 </para>
3119 <para>
3120 By default,
3121 it is not an error
3122 if <parameter>filename</parameter>
3123 does not exist.
3124 The optional
3125 <parameter>must_exist</parameter>
3126 argument may be set to <constant>True</constant>
3127 to have &SCons;
3128 raise an exception if the file does not exist,
3129 or is otherwise inaccessible.
3130 </para>
3132 <para>
3133 The optional
3134 <parameter>only_one</parameter>
3135 argument may be set to <constant>True</constant>
3136 to have &SCons; raise an exception
3137 if the file contains dependency
3138 information for more than one target.
3139 This can provide a small sanity check
3140 for files intended to be generated
3141 by, for example, the
3142 <literal>gcc -M</literal>
3143 flag,
3144 which should typically only
3145 write dependency information for
3146 one output file into a corresponding
3147 <filename>.d</filename>
3148 file.
3149 </para>
3151 <para>
3152 <parameter>filename</parameter>
3153 and all of the files listed therein
3154 will be interpreted relative to
3155 the directory of the
3156 &SConscript;
3157 file which calls the
3158 &f-ParseDepends;
3159 function.
3160 </para>
3161 </listitem>
3162   </varlistentry>
3163   <varlistentry id="f-ParseFlags">
3164     <term><replaceable>env</replaceable>.<methodname>ParseFlags</methodname>(<parameter>flags, ...</parameter>)</term>
3165     <listitem><para>
3166 Parses one or more strings containing
3167 typical command-line flags for GCC-style tool chains
3168 and returns a dictionary with the flag values
3169 separated into the appropriate SCons construction variables.
3170 Intended as a companion to the
3171 &f-link-env-MergeFlags;
3172 method, but allows for the values in the returned dictionary
3173 to be modified, if necessary,
3174 before merging them into the construction environment.
3175 (Note that
3176 &f-env-MergeFlags;
3177 will call this method if its argument is not a dictionary,
3178 so it is usually not necessary to call
3179 &f-env-ParseFlags;
3180 directly unless you want to manipulate the values.)
3181 </para>
3183 <para>
3184 If the first character in any string is
3185 an exclamation mark (<literal>!</literal>),
3186 the rest of the string is executed as a command,
3187 and the output from the command is
3188 parsed as GCC tool chain command-line flags
3189 and added to the resulting dictionary.
3190 This can be used to call a <filename>*-config</filename>
3191 command typical of the POSIX programming environment
3192 (for example,
3193 <command>pkg-config</command>).
3194 Note that such a command is executed using the
3195 SCons execution environment;
3196 if the command needs additional information,
3197 that information needs to be explicitly provided.
3198 See &f-link-ParseConfig; for more details.
3199 </para>
3201 <para>
3202 Flag values are translated according to the prefix found,
3203 and added to the following construction variables:
3204 </para>
3206 <example_commands>
3207 -arch                   CCFLAGS, LINKFLAGS
3208 -D                      CPPDEFINES
3209 -framework              FRAMEWORKS
3210 -frameworkdir=          FRAMEWORKPATH
3211 -fmerge-all-constants   CCFLAGS, LINKFLAGS
3212 -fopenmp                CCFLAGS, LINKFLAGS
3213 -fsanitize              CCFLAGS, LINKFLAGS
3214 -include                CCFLAGS
3215 -imacros                CCFLAGS
3216 -isysroot               CCFLAGS, LINKFLAGS
3217 -isystem                CCFLAGS
3218 -iquote                 CCFLAGS
3219 -idirafter              CCFLAGS
3220 -I                      CPPPATH
3221 -l                      LIBS
3222 -L                      LIBPATH
3223 -mno-cygwin             CCFLAGS, LINKFLAGS
3224 -mwindows               LINKFLAGS
3225 -openmp                 CCFLAGS, LINKFLAGS
3226 -pthread                CCFLAGS, LINKFLAGS
3227 -std=                   CFLAGS
3228 -stdlib=                CXXFLAGS
3229 -Wa,                    ASFLAGS, CCFLAGS
3230 -Wl,-rpath=             RPATH
3231 -Wl,-R,                 RPATH
3232 -Wl,-R                  RPATH
3233 -Wl,                    LINKFLAGS
3234 -Wp,                    CPPFLAGS
3235 -                       CCFLAGS
3236 +                       CCFLAGS, LINKFLAGS
3237 </example_commands>
3239 <para>
3240 Any other strings not associated with options
3241 are assumed to be the names of libraries
3242 and added to the
3243 &cv-LIBS;
3244 construction variable.
3245 </para>
3247 <para>
3248 Examples (all of which produce the same result):
3249 </para>
3251 <example_commands>
3252 dict = env.ParseFlags('-O2 -Dfoo -Dbar=1')
3253 dict = env.ParseFlags('-O2', '-Dfoo', '-Dbar=1')
3254 dict = env.ParseFlags(['-O2', '-Dfoo -Dbar=1'])
3255 dict = env.ParseFlags('-O2', '!echo -Dfoo -Dbar=1')
3256 </example_commands>
3257 </listitem>
3258   </varlistentry>
3259   <varlistentry id="f-Platform">
3260     <term><function>Platform</function>(<parameter>plat</parameter>)</term>
3261     <term><replaceable>env</replaceable>.<methodname>Platform</methodname>(<parameter>plat</parameter>)</term>
3262     <listitem><para>
3263 When called as a global function,
3264 returns a callable platform object
3265 selected by <parameter>plat</parameter>
3266 (defaults to the detected platform for the
3267 current system)
3268 that can be used to initialize
3269 a construction environment by passing it as the
3270 <parameter>platform</parameter> keyword argument to the
3271 &f-link-Environment; function.
3272 </para>
3274 <para>
3275 Example:
3276 </para>
3278 <example_commands>
3279 env = Environment(platform=Platform('win32'))
3280 </example_commands>
3282 <para>
3283 When called as a method of an environment,
3284 calls the platform object indicated by
3285 <parameter>plat</parameter>
3286 to update that environment.
3287 </para>
3289 <example_commands>
3290 env.Platform('posix')
3291 </example_commands>
3293 <para>
3294 See the manpage section "Construction Environments" for more details.
3295 </para>
3296 </listitem>
3297   </varlistentry>
3298   <varlistentry id="f-Precious">
3299     <term><function>Precious</function>(<parameter>target, ...</parameter>)</term>
3300     <term><replaceable>env</replaceable>.<methodname>Precious</methodname>(<parameter>target, ...</parameter>)</term>
3301     <listitem><para>
3302 Marks <varname>target</varname> as precious so it is not
3303 deleted before it is rebuilt.
3304 Normally &SCons; deletes a target before building it.
3305 Multiple targets can be passed in a single call,
3306 and may be strings and/or nodes.
3307 Returns a list of the affected target nodes.
3308 </para>
3309 </listitem>
3310   </varlistentry>
3311   <varlistentry id="f-Prepend">
3312     <term><replaceable>env</replaceable>.<methodname>Prepend</methodname>(<parameter>key=val, [...]</parameter>)</term>
3313     <listitem><para>
3314 Prepend values to &consvars; in the current &consenv;,
3315 Works like &f-link-env-Append; (see for details),
3316 except that values are added to the front,
3317 rather than the end, of any existing value of the &consvar;
3318 </para>
3320 <para>
3321 Example:
3322 </para>
3324 <example_commands>
3325 env.Prepend(CCFLAGS='-g ', FOO=['foo.yyy'])
3326 </example_commands>
3328 <para>
3329 See also &f-link-env-Append;,
3330 &f-link-env-AppendUnique;
3331 and &f-link-env-PrependUnique;.
3332 </para>
3333 </listitem>
3334   </varlistentry>
3335   <varlistentry id="f-PrependENVPath">
3336     <term><replaceable>env</replaceable>.<methodname>PrependENVPath</methodname>(<parameter>name, newpath, [envname, sep, delete_existing=True]</parameter>)</term>
3337     <listitem><para>
3338 Prepend path elements specified by <parameter>newpath</parameter>
3339 to the given search path string or list <parameter>name</parameter>
3340 in mapping <parameter>envname</parameter> in the &consenv;.
3341 Supplying <parameter>envname</parameter> is optional:
3342 the default is the execution environment &cv-link-ENV;.
3343 Optional <parameter>sep</parameter> is used as the search path separator,
3344 the default is the platform's separator (<systemitem>os.pathsep</systemitem>).
3345 A path element will only appear once.
3346 Any duplicates in <parameter>newpath</parameter> are dropped,
3347 keeping the first appearing (to preserve path order).
3348 If <parameter>delete_existing</parameter>
3349 is <constant>False</constant>
3350 any addition duplicating an existing path element is ignored;
3351 if <parameter>delete_existing</parameter>
3352 is <constant>True</constant> (the default) the existing value will
3353 be dropped and the path element will be inserted at the beginning.
3354 To help maintain uniqueness all paths are normalized (using
3355 <systemitem>os.path.normpath</systemitem>
3357 <systemitem>os.path.normcase</systemitem>).
3358 </para>
3360 <para>
3361 Example:
3362 </para>
3364 <example_commands>
3365 print('before:', env['ENV']['INCLUDE'])
3366 include_path = '/foo/bar:/foo'
3367 env.PrependENVPath('INCLUDE', include_path)
3368 print('after:', env['ENV']['INCLUDE'])
3369 </example_commands>
3371 <para>Yields:</para>
3373 <screen>
3374 before: /biz:/foo
3375 after: /foo/bar:/foo:/biz
3376 </screen>
3378 <para>
3379 See also &f-link-env-AppendENVPath;.
3380 </para>
3382 </listitem>
3383   </varlistentry>
3384   <varlistentry id="f-PrependUnique">
3385     <term><replaceable>env</replaceable>.<methodname>PrependUnique</methodname>(<parameter>key=val, [...], [delete_existing=False]</parameter>)</term>
3386     <listitem><para>
3387 Prepend values to &consvars; in the current &consenv;,
3388 maintaining uniqueness.
3389 Works like &f-link-env-Append;,
3390 except that values are added to the front,
3391 rather than the end, of the &consvar;,
3392 and values that would become duplicates
3393 are not added.
3394 If <parameter>delete_existing</parameter>
3395 is set to a true value, then for any duplicate,
3396 the existing instance of <parameter>val</parameter> is first removed,
3397 then <parameter>val</parameter> is inserted,
3398 having the effect of moving it to the front.
3399 </para>
3401 <para>
3402 Example:
3403 </para>
3405 <example_commands>
3406 env.PrependUnique(CCFLAGS='-g', FOO=['foo.yyy'])
3407 </example_commands>
3409 <para>
3410 See also &f-link-env-Append;,
3411 &f-link-env-AppendUnique;
3412 and &f-link-env-Prepend;.
3413 </para>
3414 </listitem>
3415   </varlistentry>
3416   <varlistentry id="f-Progress">
3417     <term><function>Progress</function>(<parameter>callable, [interval]</parameter>)</term>
3418     <term><function>Progress</function>(<parameter>string, [interval, file, overwrite]</parameter>)</term>
3419     <term><function>Progress</function>(<parameter>list_of_strings, [interval, file, overwrite]</parameter>)</term>
3420     <listitem><para>
3421 Allows SCons to show progress made during the build
3422 by displaying a string or calling a function while
3423 evaluating Nodes (e.g. files).
3424 </para>
3426 <para>
3427 If the first specified argument is a Python callable
3428 (a function or an object that has a
3429 <methodname>__call__</methodname> method),
3430 the function will be called
3431 once every
3432 <varname>interval</varname>
3433 times a Node is evaluated (default <constant>1</constant>).
3434 The callable will be passed the evaluated Node
3435 as its only argument.
3436 (For future compatibility,
3437 it's a good idea to also add
3438 <parameter>*args</parameter>
3440 <parameter>**kwargs</parameter>
3441 as arguments to your function or method signatures.
3442 This will prevent the code from breaking
3443 if &SCons; ever changes the interface
3444 to call the function with additional arguments in the future.)
3445 </para>
3447 <para>
3448 An example of a simple custom progress function
3449 that prints a string containing the Node name
3450 every 10 Nodes:
3451 </para>
3453 <example_commands>
3454 def my_progress_function(node, *args, **kwargs):
3455     print('Evaluating node %s!' % node)
3456 Progress(my_progress_function, interval=10)
3457 </example_commands>
3459 <para>
3460 A more complicated example of a custom progress display object
3461 that prints a string containing a count
3462 every 100 evaluated Nodes.
3463 Note the use of
3464 <literal>\r</literal>
3465 (a carriage return)
3466 at the end so that the string
3467 will overwrite itself on a display:
3468 </para>
3470 <example_commands>
3471 import sys
3472 class ProgressCounter(object):
3473     count = 0
3474     def __call__(self, node, *args, **kw):
3475         self.count += 100
3476         sys.stderr.write('Evaluated %s nodes\r' % self.count)
3478 Progress(ProgressCounter(), interval=100)
3479 </example_commands>
3481 <para>
3482 If the first argument to
3483 &f-Progress; is a string or list of strings,
3484 it is taken as text to be displayed every
3485 <varname>interval</varname>
3486 evaluated Nodes.
3487 If the first argument is a list of strings,
3488 then each string in the list will be displayed
3489 in rotating fashion every
3490 <varname>interval</varname>
3491 evaluated Nodes.
3492 </para>
3494 <para>
3495 The default is to print the string on standard output.
3496 An alternate output stream
3497 may be specified with the
3498 <parameter>file</parameter>
3499 keyword argument, which the
3500 caller must pass already opened.
3501 </para>
3503 <para>
3504 The following will print a series of dots
3505 on the error output,
3506 one dot for every 100 evaluated Nodes:
3507 </para>
3509 <example_commands>
3510 import sys
3511 Progress('.', interval=100, file=sys.stderr)
3512 </example_commands>
3514 <para>
3515 If the string contains the verbatim substring
3516 <literal>$TARGET;</literal>,
3517 it will be replaced with the Node.
3518 Note that, for performance reasons, this is
3519 <emphasis>not</emphasis>
3520 a regular SCons variable substition,
3521 so you can not use other variables
3522 or use curly braces.
3523 The following example will print the name of
3524 every evaluated Node,
3525 using a carriage return)
3526 (<literal>\r</literal>)
3527 to cause each line to overwritten by the next line,
3528 and the
3529 <parameter>overwrite</parameter>
3530 keyword argument (default <literal>False</literal>)
3531 to make sure the previously-printed
3532 file name is overwritten with blank spaces:
3533 </para>
3535 <example_commands>
3536 import sys
3537 Progress('$TARGET\r', overwrite=True)
3538 </example_commands>
3540 <para>
3541 A list of strings can be used to implement a "spinner"
3542 on the user's screen as follows, changing every
3543 five evaluated Nodes:
3544 </para>
3546 <example_commands>
3547 Progress(['-\r', '\\\r', '|\r', '/\r'], interval=5)
3548 </example_commands>
3549 </listitem>
3550   </varlistentry>
3551   <varlistentry id="f-Pseudo">
3552     <term><function>Pseudo</function>(<parameter>target, ...</parameter>)</term>
3553     <term><replaceable>env</replaceable>.<methodname>Pseudo</methodname>(<parameter>target, ...</parameter>)</term>
3554     <listitem><para>
3555 Marks <parameter>target</parameter> as a pseudo target,
3556 not representing the production of any physical target file.
3557 If any pseudo <parameter>target</parameter> does exist,
3558 &SCons; will abort the build with an error.
3559 Multiple targets can be passed in a single call,
3560 and may be strings and/or Nodes.
3561 Returns a list of the affected target nodes.
3562 </para>
3564 <para>
3565 &f-Pseudo; may be useful in conjuction with a builder
3566 call (such as &f-link-Command;) which does not create a physical target,
3567 and the behavior if the target accidentally existed would be incorrect.
3568 This is similar in concept to the GNU <application>make</application>
3569 <literal>.PHONY</literal> target.
3570 &SCons; also provides a powerful target alias capability
3571 (see &f-link-Alias;) which may provide more flexibility
3572 in many situations when defining target names that are not directly built.
3573 </para>
3574 </listitem>
3575   </varlistentry>
3576   <varlistentry id="f-PyPackageDir">
3577     <term><function>PyPackageDir</function>(<parameter>modulename</parameter>)</term>
3578     <term><replaceable>env</replaceable>.<methodname>PyPackageDir</methodname>(<parameter>modulename</parameter>)</term>
3579     <listitem><para>
3580 Finds the location of <parameter>modulename</parameter>,
3581 which can be a string or a sequence of strings,
3582 each representing the name of a &Python; module.
3583 Construction variables are expanded in
3584 <parameter>modulename</parameter>.
3585 Returns a Directory Node (see &f-link-Dir;),
3586 or a list of Directory Nodes if
3587 <parameter>modulename</parameter> is a sequence.
3588 <literal>None</literal> is returned for any module not found.
3589 </para>
3591 <para>
3592 When a Tool module which is installed as a
3593 &Python; module is used, you need
3594 to specify a <parameter>toolpath</parameter> argument to
3595 &f-link-Tool;,
3596 &f-link-Environment;
3597 or &f-link-Clone;,
3598 as tools outside the standard project locations
3599 (<filename>site_scons/site_tools</filename>)
3600 will not be found otherwise.
3601 Using &f-PyPackageDir; allows this path to be
3602 discovered at runtime instead of hardcoding the path.
3603 </para>
3605 <para>
3606 Example:
3607 </para>
3609 <example_commands>
3610 env = Environment(
3611     tools=["default", "ExampleTool"],
3612     toolpath=[PyPackageDir("example_tool")]
3614 </example_commands>
3615 </listitem>
3616   </varlistentry>
3617   <varlistentry id="f-Replace">
3618     <term><replaceable>env</replaceable>.<methodname>Replace</methodname>(<parameter>key=val, [...]</parameter>)</term>
3619     <listitem><para>
3620 Replaces construction variables in the Environment
3621 with the specified keyword arguments.
3622 </para>
3624 <para>
3625 Example:
3626 </para>
3628 <example_commands>
3629 env.Replace(CCFLAGS='-g', FOO='foo.xxx')
3630 </example_commands>
3631 </listitem>
3632   </varlistentry>
3633   <varlistentry id="f-Repository">
3634     <term><function>Repository</function>(<parameter>directory</parameter>)</term>
3635     <term><replaceable>env</replaceable>.<methodname>Repository</methodname>(<parameter>directory</parameter>)</term>
3636     <listitem><para>
3637 Specifies that
3638 <parameter>directory</parameter>
3639 is a repository to be searched for files.
3640 Multiple calls to
3641 &f-Repository;
3642 are legal,
3643 and each one adds to the list of
3644 repositories that will be searched.
3645 </para>
3647 <para>
3649 &scons;,
3650 a repository is a copy of the source tree,
3651 from the top-level directory on down,
3652 which may contain
3653 both source files and derived files
3654 that can be used to build targets in
3655 the local source tree.
3656 The canonical example would be an
3657 official source tree maintained by an integrator.
3658 If the repository contains derived files,
3659 then the derived files should have been built using
3660 &scons;,
3661 so that the repository contains the necessary
3662 signature information to allow
3663 &scons;
3664 to figure out when it is appropriate to
3665 use the repository copy of a derived file,
3666 instead of building one locally.
3667 </para>
3669 <para>
3670 Note that if an up-to-date derived file
3671 already exists in a repository,
3672 &scons;
3673 will
3674 <emphasis>not</emphasis>
3675 make a copy in the local directory tree.
3676 In order to guarantee that a local copy
3677 will be made,
3678 use the
3679 &f-link-Local;
3680 method.
3681 </para>
3682 </listitem>
3683   </varlistentry>
3684   <varlistentry id="f-Requires">
3685     <term><function>Requires</function>(<parameter>target, prerequisite</parameter>)</term>
3686     <term><replaceable>env</replaceable>.<methodname>Requires</methodname>(<parameter>target, prerequisite</parameter>)</term>
3687     <listitem><para>
3688 Specifies an order-only relationship
3689 between <parameter>target</parameter>
3690 and <parameter>prerequisite</parameter>.
3691 The prerequisites
3692 will be (re)built, if necessary,
3693 <emphasis>before</emphasis>
3694 the target file(s),
3695 but the target file(s) do not actually
3696 depend on the prerequisites
3697 and will not be rebuilt simply because
3698 the prerequisite file(s) change.
3699 <parameter>target</parameter> and
3700 <parameter>prerequisite</parameter> may each
3701 be a string or Node, or a list of strings or Nodes.
3702 If there are multiple
3703 <parameter>target</parameter> values,
3704 the prerequisite(s) are added to each one.
3705 Returns a list of the affected target nodes.
3706 </para>
3708 <para>
3709 Example:
3710 </para>
3712 <example_commands>
3713 env.Requires('foo', 'file-that-must-be-built-before-foo')
3714 </example_commands>
3715 </listitem>
3716   </varlistentry>
3717   <varlistentry id="f-Return">
3718     <term><function>Return</function>(<parameter>[vars..., stop=True]</parameter>)</term>
3719     <listitem><para>
3720 Return to the calling SConscript, optionally
3721 returning the values of variables named in
3722 <varname>vars</varname>.
3723 Multiple strings contaning variable names may be passed to
3724 &f-Return;. A string containing white space
3725 is split into individual variable names.
3726 Returns the value if one variable is specified,
3727 else returns a tuple of values.
3728 Returns an empty tuple if <parameter>vars</parameter>
3729 is omitted.
3730 </para>
3732 <para>
3733 By default &Return; stops processing the current SConscript
3734 and returns immediately.
3735 The optional
3736 <literal>stop</literal>
3737 keyword argument
3738 may be set to a false value
3739 to continue processing the rest of the SConscript
3740 file after the
3741 &f-Return;
3742 call (this was the default behavior prior to SCons 0.98.)
3743 However, the values returned
3744 are still the values of the variables in the named
3745 <varname>vars</varname>
3746 at the point
3747 &f-Return;
3748 was called.
3749 </para>
3751 <para>
3752 Examples:
3753 </para>
3755 <example_commands>
3756 # Returns no values (evaluates False)
3757 Return()
3759 # Returns the value of the 'foo' Python variable.
3760 Return("foo")
3762 # Returns the values of the Python variables 'foo' and 'bar'.
3763 Return("foo", "bar")
3765 # Returns the values of Python variables 'val1' and 'val2'.
3766 Return('val1 val2')
3767 </example_commands>
3768 </listitem>
3769   </varlistentry>
3770   <varlistentry id="f-Scanner">
3771     <term><function>Scanner</function>(<parameter>function, [name, argument, skeys, path_function, node_class, node_factory, scan_check, recursive]</parameter>)</term>
3772     <term><replaceable>env</replaceable>.<methodname>Scanner</methodname>(<parameter>function, [name, argument, skeys, path_function, node_class, node_factory, scan_check, recursive]</parameter>)</term>
3773     <listitem><para>
3774 Creates a Scanner object for
3775 the specified
3776 <parameter>function</parameter>.
3777 See manpage section "Scanner Objects"
3778 for a complete explanation of the arguments and behavior.
3779 </para>
3780 </listitem>
3781   </varlistentry>
3782   <varlistentry id="f-SConscript">
3783     <term><function>SConscript</function>(<parameter>scriptnames, [exports, variant_dir, duplicate, must_exist]</parameter>)</term>
3784     <term><replaceable>env</replaceable>.<methodname>SConscript</methodname>(<parameter>scriptnames, [exports, variant_dir, duplicate, must_exist]</parameter>)</term>
3785     <term><function>SConscript</function>(<parameter>dirs=subdirs, [name=scriptname, exports, variant_dir, duplicate, must_exist]</parameter>)</term>
3786     <term><replaceable>env</replaceable>.<methodname>SConscript</methodname>(<parameter>dirs=subdirs, [name=scriptname, exports, variant_dir, duplicate, must_exist]</parameter>)</term>
3787     <listitem><para>
3788 Executes subsidiary SConscript (build configuration) file(s).
3789 There are two ways to call the
3790 &f-SConscript; function.
3791 </para>
3793 <para>
3794 The first calling style is to supply
3795 one or more SConscript file names
3796 as the first positional argument,
3797 which can be a string or a list of strings.
3798 If there is a second positional argument,
3799 it is treated as if the
3800 <varname>exports</varname>
3801 keyword argument had been given (see below).
3802 Examples:
3803 </para>
3804 <example_commands>
3805 SConscript('SConscript')  # run SConscript in the current directory
3806 SConscript('src/SConscript')  # run SConscript in the src directory
3807 SConscript(['src/SConscript', 'doc/SConscript'])
3808 SConscript(Split('src/SConscript doc/SConscript'))
3809 config = SConscript('MyConfig.py')
3810 </example_commands>
3812 <para>
3813 The second calling style is to omit the positional argument naming
3814 the script and instead specify directory names using the
3815 <varname>dirs</varname> keyword argument.
3816 The value can be a string or list of strings.
3817 In this case,
3818 &scons;
3819 will execute a subsidiary configuration file named
3820 &SConscript; (by default)
3821 in each of the specified directories.
3822 You may specify a name other than
3823 &SConscript;
3824 by supplying an optional
3825 <varname>name</varname>=<replaceable>scriptname</replaceable>
3826 keyword argument.
3827 The first three examples below have the same effect
3828 as the first three examples above:
3829 </para>
3830 <example_commands>
3831 SConscript(dirs='.')  # run SConscript in the current directory
3832 SConscript(dirs='src')  # run SConscript in the src directory
3833 SConscript(dirs=['src', 'doc'])
3834 SConscript(dirs=['sub1', 'sub2'], name='MySConscript')
3835 </example_commands>
3837 <para>
3838 The optional
3839 <varname>exports</varname>
3840 keyword argument specifies variables to make available
3841 for use by the called SConscripts,
3842 which are evaluated in an isolated context
3843 and otherwise do not have access to local variables
3844 from the calling SConscript.
3845 The value may be a string or list of strings representing
3846 variable names, or a dictionary mapping local names to
3847 the names they can be imported by.
3848 For the first (scriptnames) calling style,
3849 a second positional argument will also be interpreted as
3850 <varname>exports</varname>;
3851 the second (directory) calling style accepts no
3852 positional arguments and must use the keyword form.
3853 These variables are locally exported only to the called
3854 SConscript file(s), and take precedence over any same-named
3855 variables in the global pool managed by the
3856 &f-link-Export;
3857 function.
3858 <!-- If multiple dirs are provided, each script gets a fresh export. -->
3859 The subsidiary SConscript files
3860 must use the
3861 &f-link-Import;
3862 function to import the variables into their local scope.
3863 Examples:
3864 </para>
3865 <example_commands>
3866 foo = SConscript('sub/SConscript', exports='env')
3867 SConscript('dir/SConscript', exports=['env', 'variable'])
3868 SConscript(dirs='subdir', exports='env variable')
3869 SConscript(dirs=['one', 'two', 'three'], exports='shared_info')
3870 </example_commands>
3872 <para>
3873 If the optional
3874 <varname>variant_dir</varname>
3875 argument is present, it causes an effect equivalent to the
3876 &f-link-VariantDir; function,
3877 but in effect only within the scope of the &f-SConscript; call.
3878 The <varname>variant_dir</varname>
3879 argument is interpreted relative to the directory of the
3880 <emphasis>calling</emphasis> SConscript file.
3881 The source directory is the directory in which the
3882 <emphasis>called</emphasis> SConscript
3883 file resides and the SConscript
3884 file is evaluated as if it were in the
3885 <varname>variant_dir</varname>
3886 directory. Thus:
3887 </para>
3888 <example_commands>
3889 SConscript('src/SConscript', variant_dir='build')
3890 </example_commands>
3892 <para>
3893 is equivalent to:
3894 </para>
3896 <example_commands>
3897 VariantDir('build', 'src')
3898 SConscript('build/SConscript')
3899 </example_commands>
3901 <para>
3902 If the sources are in the same directory as the
3903 &SConstruct;,
3904 </para>
3906 <example_commands>
3907 SConscript('SConscript', variant_dir='build')
3908 </example_commands>
3910 <para>
3911 is equivalent to:
3912 </para>
3914 <example_commands>
3915 VariantDir('build', '.')
3916 SConscript('build/SConscript')
3917 </example_commands>
3919 <para>
3920 The optional
3921 <varname>duplicate</varname> argument is
3922 interpreted as for &f-link-VariantDir;.
3923 If the <varname>variant_dir</varname> argument
3924 is omitted, the <varname>duplicate</varname> argument is ignored.
3925 See the description of
3926 &f-link-VariantDir;
3927 for additional details and restrictions.
3928 </para>
3930 <para>
3931 <!--
3933 <varname>variant_dir</varname>
3934 and"
3935 <varname>src_dir</varname>
3936 are both present,
3937 xxxxx everything is in a state of confusion.
3938 </para>
3939 <example_commands>
3940 SConscript(dirs = 'src', variant_dir = 'build', src_dir = '.')
3941 runs src/SConscript in build/src, but
3942 SConscript(dirs = 'lib', variant_dir = 'build', src_dir = 'src')
3943 runs lib/SConscript (in lib!).  However,
3944 SConscript(dirs = 'src', variant_dir = 'build', src_dir = 'src')
3945 runs src/SConscript in build.  Moreover,
3946 SConscript(dirs = 'src/lib', variant_dir = 'build', src_dir = 'src')
3947 runs src/lib/SConscript in build/lib.  Moreover,
3948 SConscript(dirs = 'build/src/lib', variant_dir = 'build', src_dir = 'src')
3949 can't find build/src/lib/SConscript, even though it ought to exist.
3950 </example_commands>
3951 <para>
3952 is equivalent to
3953 </para>
3954 <example_commands>
3955 ????????????????
3956 </example_commands>
3957 <para>
3958 and what about this alternative?
3959 TODO??? SConscript('build/SConscript', src_dir='src')
3961 </para>
3963 <para>
3964 If the optional
3965 <varname>must_exist</varname>
3966 is <constant>True</constant> (the default),
3967 an exception is raised if a requested
3968 SConscript file is not found.
3969 To allow missing scripts to be silently ignored
3970 (the default behavior prior to &SCons; version 3.1),
3971 pass
3972 <literal>must_exist=False</literal> in the &f-SConscript; call.
3973 </para>
3975 <para>
3976 <emphasis>Changed in 4.6.0</emphasis>: <parameter>must_exist</parameter>
3977 now defaults to <constant>True</constant>.
3978 </para>
3980 <para>
3981 Here are some composite examples:
3982 </para>
3984 <example_commands>
3985 # collect the configuration information and use it to build src and doc
3986 shared_info = SConscript('MyConfig.py')
3987 SConscript('src/SConscript', exports='shared_info')
3988 SConscript('doc/SConscript', exports='shared_info')
3989 </example_commands>
3991 <example_commands>
3992 # build debugging and production versions.  SConscript
3993 # can use Dir('.').path to determine variant.
3994 SConscript('SConscript', variant_dir='debug', duplicate=0)
3995 SConscript('SConscript', variant_dir='prod', duplicate=0)
3996 </example_commands>
3998 <example_commands>
3999 # build debugging and production versions.  SConscript
4000 # is passed flags to use.
4001 opts = { 'CPPDEFINES' : ['DEBUG'], 'CCFLAGS' : '-pgdb' }
4002 SConscript('SConscript', variant_dir='debug', duplicate=0, exports=opts)
4003 opts = { 'CPPDEFINES' : ['NODEBUG'], 'CCFLAGS' : '-O' }
4004 SConscript('SConscript', variant_dir='prod', duplicate=0, exports=opts)
4005 </example_commands>
4007 <example_commands>
4008 # build common documentation and compile for different architectures
4009 SConscript('doc/SConscript', variant_dir='build/doc', duplicate=0)
4010 SConscript('src/SConscript', variant_dir='build/x86', duplicate=0)
4011 SConscript('src/SConscript', variant_dir='build/ppc', duplicate=0)
4012 </example_commands>
4014 <para>
4015 &f-SConscript; returns the values of any variables
4016 named by the executed SConscript file(s) in arguments
4017 to the &f-link-Return; function.
4018 If a single &f-SConscript; call causes multiple scripts to
4019 be executed, the return value is a tuple containing
4020 the returns of each of the scripts. If an executed
4021 script does not explicitly call &Return;, it returns
4022 <constant>None</constant>.
4023 </para>
4025 </listitem>
4026   </varlistentry>
4027   <varlistentry id="f-SConscriptChdir">
4028     <term><function>SConscriptChdir</function>(<parameter>value</parameter>)</term>
4029     <listitem><para>
4030 By default,
4031 &scons;
4032 changes its working directory
4033 to the directory in which each
4034 subsidiary SConscript file lives
4035 while reading and processing that script.
4036 This behavior may be disabled
4037 by specifying an argument which
4038 evaluates false, in which case
4039 &scons;
4040 will stay in the top-level directory
4041 while reading all SConscript files.
4042 (This may be necessary when building from repositories,
4043 when all the directories in which SConscript files may be found
4044 don't necessarily exist locally.)
4045 You may enable and disable
4046 this ability by calling
4047 &f-SConscriptChdir;
4048 multiple times.
4049 </para>
4051 <para>
4052 Example:
4053 </para>
4055 <example_commands>
4056 SConscriptChdir(False)
4057 SConscript('foo/SConscript')    # will not chdir to foo
4058 SConscriptChdir(True)
4059 SConscript('bar/SConscript')    # will chdir to bar
4060 </example_commands>
4061 </listitem>
4062   </varlistentry>
4063   <varlistentry id="f-SConsignFile">
4064     <term><function>SConsignFile</function>(<parameter>[name, dbm_module]</parameter>)</term>
4065     <term><replaceable>env</replaceable>.<methodname>SConsignFile</methodname>(<parameter>[name, dbm_module]</parameter>)</term>
4066     <listitem><para>
4067 Specify where to store the &SCons; file signature database,
4068 and which database format to use.
4069 This may be useful to specify alternate
4070 database files and/or file locations for different types of builds.
4071 </para>
4072 <para>
4073 The optional <parameter>name</parameter> argument
4074 is the base name of the database file(s).
4075 If not an absolute path name,
4076 these are placed relative to the directory containing the
4077 top-level &SConstruct; file.
4078 The default is
4079 <filename>.sconsign</filename>.
4080 The actual database file(s) stored on disk
4081 may have an appropriate suffix appended
4082 by the chosen
4083 <parameter>dbm_module</parameter>
4084 </para>
4085 <para>
4086 The optional <parameter>dbm_module</parameter>
4087 argument specifies which
4088 &Python; database module to use
4089 for reading/writing the file.
4090 The module must be imported first;
4091 then the imported module name
4092 is passed as the argument.
4093 The default is a custom
4094 <systemitem>SCons.dblite</systemitem>
4095 module that uses pickled
4096 &Python; data structures,
4097 which works on all &Python; versions.
4098 See documentation of the &Python;
4099 <systemitem>dbm</systemitem> module
4100 for other available types.
4101 </para>
4102 <para>
4103 If called with no arguments,
4104 the database will default to
4105 <filename>.sconsign.dblite</filename>
4106 in the top directory of the project,
4107 which is also the default if
4108 if &f-SConsignFile; is not called.
4109 </para>
4110 <para>
4111 The setting is global, so the only difference
4112 between the global function and the environment method form
4113 is variable expansion on <parameter>name</parameter>.
4114 There should only be one active call to this
4115 function/method in a given build setup.
4116 </para>
4117 <para>
4119 <parameter>name</parameter>
4120 is set to
4121 <constant>None</constant>,
4122 &scons;
4123 will store file signatures
4124 in a separate
4125 <filename>.sconsign</filename>
4126 file in each directory,
4127 not in a single combined database file.
4128 This is a backwards-compatibility meaure to support
4129 what was the default behavior
4130 prior to &SCons; 0.97 (i.e. before 2008).
4131 Use of this mode is discouraged and may be
4132 deprecated in a future &SCons; release.
4133 </para>
4135 <para>
4136 Examples:
4137 </para>
4139 <example_commands>
4140 # Explicitly stores signatures in ".sconsign.dblite"
4141 # in the top-level SConstruct directory (the default behavior).
4142 SConsignFile()
4144 # Stores signatures in the file "etc/scons-signatures"
4145 # relative to the top-level SConstruct directory.
4146 # SCons will add a database suffix to this name.
4147 SConsignFile("etc/scons-signatures")
4149 # Stores signatures in the specified absolute file name.
4150 # SCons will add a database suffix to this name.
4151 SConsignFile("/home/me/SCons/signatures")
4153 # Stores signatures in a separate .sconsign file
4154 # in each directory.
4155 SConsignFile(None)
4157 # Stores signatures in a GNU dbm format .sconsign file
4158 import dbm.gnu
4159 SConsignFile(dbm_module=dbm.gnu)
4160 </example_commands>
4161 </listitem>
4162   </varlistentry>
4163   <varlistentry id="f-SetDefault">
4164     <term><replaceable>env</replaceable>.<methodname>SetDefault</methodname>(<parameter>key=val, [...]</parameter>)</term>
4165     <listitem><para>
4166 Sets construction variables to default values specified with the keyword
4167 arguments if (and only if) the variables are not already set.
4168 The following statements are equivalent:
4169 </para>
4171 <example_commands>
4172 env.SetDefault(FOO='foo')
4173 if 'FOO' not in env:
4174     env['FOO'] = 'foo'
4175 </example_commands>
4176 </listitem>
4177   </varlistentry>
4178   <varlistentry id="f-SetOption">
4179     <term><function>SetOption</function>(<parameter>name, value</parameter>)</term>
4180     <term><replaceable>env</replaceable>.<methodname>SetOption</methodname>(<parameter>name, value</parameter>)</term>
4181     <listitem><para>
4182 Sets &scons; option variable <parameter>name</parameter>
4183 to <parameter>value</parameter>.
4184 These options are all also settable via
4185 command-line options but the variable name
4186 may differ from the command-line option name -
4187 see the table for correspondences.
4188 A value set via command-line option will take
4189 precedence over one set with &f-SetOption;, which
4190 allows setting a project default in the scripts and
4191 temporarily overriding it via command line.
4192 &f-SetOption; calls can also be placed in the
4193 <filename>site_init.py</filename> file.
4194 </para>
4196 <para>
4197 See the documentation in the manpage for the
4198 corresponding command line option for information about each specific option.
4199 The <parameter>value</parameter> parameter is mandatory,
4200 for option values which are boolean in nature
4201 (that is, the command line option does not take an argument)
4202 use a <parameter>value</parameter>
4203 which evaluates to true (e.g. <constant>True</constant>,
4204 <constant>1</constant>) or false (e.g. <constant>False</constant>,
4205 <constant>0</constant>).
4206 </para>
4208 <para>
4209 Options which affect the reading and processing of SConscript files
4210 are not settable using &f-SetOption; since those files must
4211 be read in order to find the &f-SetOption; call in the first place.
4212 </para>
4214 <para>
4215 For project-specific options (sometimes called
4216 <firstterm>local options</firstterm>)
4217 added via an &f-link-AddOption; call,
4218 &f-SetOption; is available only after the
4219 &f-AddOption; call has completed successfully,
4220 and only if that call included the
4221 <parameter>settable=True</parameter> argument.
4222 </para>
4224 <para>
4225 The settable variables with their associated command-line options are:
4226 </para>
4228 <informaltable rowsep="1" colsep="1" frame="topbot">
4229 <tgroup cols="3">
4230 <thead>
4231 <row>
4232   <entry align="left">Settable name</entry>
4233   <entry align="left">Command-line options</entry>
4234   <entry align="left">Notes</entry>
4235 </row>
4236 </thead>
4238 <tbody>
4239 <row>
4240   <entry><varname>clean</varname></entry>
4241   <entry>
4242     <option>-c</option>,
4243     <option>--clean</option>,
4244     <option>--remove</option>
4245   </entry>
4246 </row>
4248 <row>
4249   <entry><varname>diskcheck</varname></entry>
4250   <entry><option>--diskcheck</option></entry>
4251 </row>
4253 <row>
4254   <entry><varname>duplicate</varname></entry>
4255   <entry><option>--duplicate</option></entry>
4256 </row>
4258 <row>
4259   <entry><varname>experimental</varname></entry>
4260   <entry><option>--experimental</option></entry>
4261   <entry><emphasis>since 4.2</emphasis></entry>
4262 </row>
4264 <row>
4265   <entry><varname>hash_chunksize</varname></entry>
4266   <entry><option>--hash-chunksize</option></entry>
4267   <entry>
4268     Actually sets <varname>md5_chunksize</varname>.
4269     <emphasis>since 4.2</emphasis>
4270   </entry>
4271 </row>
4273 <row>
4274   <entry><varname>hash_format</varname></entry>
4275   <entry><option>--hash-format</option></entry>
4276   <entry><emphasis>since 4.2</emphasis></entry>
4277 </row>
4279 <row>
4280   <entry><varname>help</varname></entry>
4281   <entry><option>-h</option>, <option>--help</option></entry>
4282 </row>
4284 <row>
4285   <entry><varname>implicit_cache</varname></entry>
4286   <entry><option>--implicit-cache</option></entry>
4287 </row>
4289 <row>
4290   <entry><varname>implicit_deps_changed</varname></entry>
4291   <entry><option>--implicit-deps-changed</option></entry>
4292   <entry>
4293     Also sets <varname>implicit_cache</varname>.
4294     <emphasis>(settable since 4.2)</emphasis>
4295   </entry>
4296 </row>
4298 <row>
4299   <entry><varname>implicit_deps_unchanged</varname></entry>
4300   <entry><option>--implicit-deps-unchanged</option></entry>
4301   <entry>
4302     Also sets <varname>implicit_cache</varname>.
4303     <emphasis>(settable since 4.2)</emphasis>
4304   </entry>
4305 </row>
4307 <row>
4308   <entry><varname>max_drift</varname></entry>
4309   <entry><option>--max-drift</option></entry>
4310 </row>
4312 <row>
4313   <entry><varname>md5_chunksize</varname></entry>
4314   <entry><option>--md5-chunksize</option></entry>
4315 </row>
4317 <row>
4318   <entry><varname>no_exec</varname></entry>
4319   <entry>
4320     <option>-n</option>,
4321     <option>--no-exec</option>,
4322     <option>--just-print</option>,
4323     <option>--dry-run</option>,
4324     <option>--recon</option>
4325   </entry>
4326 </row>
4328 <row>
4329   <entry><varname>no_progress</varname></entry>
4330   <entry><option>-Q</option></entry>
4331   <entry>See
4332     <footnote>
4333       <para>If <varname>no_progress</varname> is set via &f-SetOption;
4334       in an SConscript file
4335       (but not if set in a <filename>site_init.py</filename> file)
4336       there will still be an initial status message about
4337       reading SConscript files since &SCons; has
4338       to start reading them before it can see the
4339       &f-SetOption;.
4340       </para>
4341     </footnote>
4342   </entry>
4343 </row>
4345 <row>
4346   <entry><varname>num_jobs</varname></entry>
4347   <entry><option>-j</option>, <option>--jobs</option></entry>
4348 </row>
4350 <row>
4351   <entry><varname>random</varname></entry>
4352   <entry><option>--random</option></entry>
4353 </row>
4355 <row>
4356   <entry><varname>silent</varname></entry>
4357   <entry>
4358     <option>-s</option>,
4359     <option>--silent</option>,
4360     <option>--quiet</option>
4361   </entry>
4362 </row>
4364 <row>
4365   <entry><varname>stack_size</varname></entry>
4366   <entry><option>--stack-size</option></entry>
4367 </row>
4369 <row>
4370   <entry><varname>warn</varname></entry>
4371   <entry><option>--warn</option></entry>
4372 </row>
4374 </tbody>
4375 </tgroup>
4376 </informaltable>
4378 <para>
4379 Example:
4380 </para>
4382 <example_commands>
4383 SetOption('max_drift', 0)
4384 </example_commands>
4385 </listitem>
4386   </varlistentry>
4387   <varlistentry id="f-SideEffect">
4388     <term><function>SideEffect</function>(<parameter>side_effect, target</parameter>)</term>
4389     <term><replaceable>env</replaceable>.<methodname>SideEffect</methodname>(<parameter>side_effect, target</parameter>)</term>
4390     <listitem><para>
4391 Declares
4392 <parameter>side_effect</parameter>
4393 as a side effect of building
4394 <parameter>target</parameter>.
4395 Both
4396 <parameter>side_effect</parameter>
4398 <parameter>target</parameter>
4399 can be a list, a file name, or a node.
4400 A side effect is a target file that is created or updated
4401 as a side effect of building other targets.
4402 For example, a Windows PDB
4403 file is created as a side effect of building the .obj
4404 files for a static library,
4405 and various log files are created updated
4406 as side effects of various TeX commands.
4407 If a target is a side effect of multiple build commands,
4408 &scons;
4409 will ensure that only one set of commands
4410 is executed at a time.
4411 Consequently, you only need to use this method
4412 for side-effect targets that are built as a result of
4413 multiple build commands.
4414 </para>
4416 <para>
4417 Because multiple build commands may update
4418 the same side effect file,
4419 by default the
4420 <parameter>side_effect</parameter>
4421 target is
4422 <emphasis>not</emphasis>
4423 automatically removed
4424 when the
4425 <parameter>target</parameter>
4426 is removed by the
4427 <option>-c</option>
4428 option.
4429 (Note, however, that the
4430 <parameter>side_effect</parameter>
4431 might be removed as part of
4432 cleaning the directory in which it lives.)
4433 If you want to make sure the
4434 <parameter>side_effect</parameter>
4435 is cleaned whenever a specific
4436 <parameter>target</parameter>
4437 is cleaned,
4438 you must specify this explicitly
4439 with the
4440 &f-link-Clean;
4442 &f-env-Clean;
4443 function.
4444 </para>
4446 <para>
4447 This function returns the list of side effect Node objects that were successfully added.
4448 If the list of side effects contained any side effects that had already been added,
4449 they are not added and included in the returned list.
4450 </para>
4451 </listitem>
4452   </varlistentry>
4453   <varlistentry id="f-Split">
4454     <term><function>Split</function>(<parameter>arg</parameter>)</term>
4455     <term><replaceable>env</replaceable>.<methodname>Split</methodname>(<parameter>arg</parameter>)</term>
4456     <listitem><para>
4457 If <parameter>arg</parameter> is a string,
4458 splits on whitespace and returns a list of
4459 strings without whitespace.
4460 This mode is the most common case,
4461 and can be used to split a list of filenames
4462 (for example) rather than having to type them as a
4463 list of individually quoted words.
4464 If <parameter>arg</parameter> is a list or tuple
4465 returns the list or tuple unchanged.
4466 If <parameter>arg</parameter> is any other type of object,
4467 returns a list containing just the object.
4468 These non-string cases do not actually do any spliting,
4469 but allow an argument variable to be passed to
4470 &f-Split; without having to first check its type.
4471 </para>
4473 <para>
4474 Example:
4475 </para>
4477 <example_commands>
4478 files = Split("f1.c f2.c f3.c")
4479 files = env.Split("f4.c f5.c f6.c")
4480 files = Split("""
4481     f7.c
4482     f8.c
4483     f9.c
4484 """)
4485 </example_commands>
4486 </listitem>
4487   </varlistentry>
4488   <varlistentry id="f-subst">
4489     <term><replaceable>env</replaceable>.<methodname>subst</methodname>(<parameter>input, [raw, target, source, conv]</parameter>)</term>
4490     <listitem><para>
4491 Performs &consvar; interpolation
4492 (<firstterm>substitution</firstterm>)
4493 on <parameter>input</parameter>,
4494 which can be a string or a sequence.
4495 Substitutable elements take the form
4496 <literal>${<replaceable>expression</replaceable>}</literal>,
4497 although if there is no ambiguity in recognizing the element,
4498 the braces can be omitted.
4499 A literal <emphasis role="bold">$</emphasis> can be entered by
4500 using <emphasis role="bold">$$</emphasis>.
4501 </para>
4503 <para>
4504 By default,
4505 leading or trailing white space will
4506 be removed from the result,
4507 and all sequences of white space
4508 will be compressed to a single space character.
4509 Additionally, any
4510 <literal>$(</literal>
4512 <literal>$)</literal>
4513 character sequences will be stripped from the returned string,
4514 The optional
4515 <parameter>raw</parameter>
4516 argument may be set to
4517 <literal>1</literal>
4518 if you want to preserve white space and
4519 <literal>$(</literal>-<literal>$)</literal>
4520 sequences.
4522 <parameter>raw</parameter>
4523 argument may be set to
4524 <literal>2</literal>
4525 if you want to additionally discard
4526 all characters between any
4527 <literal>$(</literal>
4529 <literal>$)</literal>
4530 pairs
4531 (as is done for signature calculation).
4532 </para>
4534 <para>
4535 If <parameter>input</parameter> is a sequence
4536 (list or tuple),
4537 the individual elements of
4538 the sequence will be expanded,
4539 and the results will be returned as a list.
4540 </para>
4542 <para>
4543 The optional
4544 <parameter>target</parameter>
4546 <parameter>source</parameter>
4547 keyword arguments
4548 must be set to lists of
4549 target and source nodes, respectively,
4550 if you want the
4551 &cv-TARGET;,
4552 &cv-TARGETS;,
4553 &cv-SOURCE;
4555 &cv-SOURCES;
4556 to be available for expansion.
4557 This is usually necessary if you are
4558 calling
4559 &f-env-subst;
4560 from within a &Python; function used
4561 as an SCons action.
4562 </para>
4564 <para>
4565 Returned string values or sequence elements
4566 are converted to their string representation by default.
4567 The optional
4568 <parameter>conv</parameter>
4569 argument
4570 may specify a conversion function
4571 that will be used in place of
4572 the default.
4573 For example, if you want &Python; objects
4574 (including SCons Nodes)
4575 to be returned as &Python; objects,
4576 you can use a &Python;
4577 lambda expression to pass in an unnamed function
4578 that simply returns its unconverted argument.
4579 </para>
4581 <para>
4582 Example:
4583 </para>
4585 <example_commands>
4586 print(env.subst("The C compiler is: $CC"))
4588 def compile(target, source, env):
4589     sourceDir = env.subst(
4590         "${SOURCE.srcdir}",
4591         target=target,
4592         source=source
4593     )
4595 source_nodes = env.subst('$EXPAND_TO_NODELIST', conv=lambda x: x)
4596 </example_commands>
4597 </listitem>
4598   </varlistentry>
4599   <varlistentry id="f-Tag">
4600     <term><function>Tag</function>(<parameter>node, tags</parameter>)</term>
4601     <listitem><para>
4602 Annotates file or directory Nodes with
4603 information about how the
4604 &b-link-Package;
4605 Builder should package those files or directories.
4606 All Node-level tags are optional.
4607 </para>
4609 <para>
4610 Examples:
4611 </para>
4613 <example_commands>
4614 # makes sure the built library will be installed with 644 file access mode
4615 Tag(Library('lib.c'), UNIX_ATTR="0o644")
4617 # marks file2.txt to be a documentation file
4618 Tag('file2.txt', DOC)
4619 </example_commands>
4620 </listitem>
4621   </varlistentry>
4622   <varlistentry id="f-Tool">
4623     <term><function>Tool</function>(<parameter>name, [toolpath, **kwargs]</parameter>)</term>
4624     <term><replaceable>env</replaceable>.<methodname>Tool</methodname>(<parameter>name, [toolpath, **kwargs]</parameter>)</term>
4625     <listitem><para>
4626 Locates the tool specification module <parameter>name</parameter>
4627 and returns a callable tool object for that tool.
4628 When the environment method (&f-env-Tool;) form is used,
4629 the tool object is automatically called before the method returns
4630 to update <varname>env</varname>,
4631 and <parameter>name</parameter> is
4632 appended to the &cv-link-TOOLS;
4633 &consvar; in that environment.
4634 When the global function &f-Tool; form is used,
4635 the tool object is constructed but not called,
4636 as it lacks the context of an environment to update,
4637 and the returned object needs to be used to arrange for the call.
4638 </para>
4640 <para>
4641 The tool module is searched for in the tool search paths (see the
4642 <emphasis role="bold">Tools</emphasis> section in the manual page
4643 for details)
4644 and in any paths specified by the optional
4645 <parameter>toolpath</parameter> parameter,
4646 which must be a list of strings.
4647 If <parameter>toolpath</parameter> is omitted,
4648 the <parameter>toolpath</parameter>
4649 supplied when the environment was created,
4650 if any, is used.
4651 </para>
4653 <para>
4654 Any remaining keyword arguments are saved in
4655 the tool object,
4656 and will be passed to the tool module's
4657 <function>generate</function> function
4658 when the tool object is actually called.
4659 The <function>generate</function> function
4660 can update the &consenv; with &consvars; and arrange
4661 any other initialization
4662 needed to use the mechanisms that tool describes,
4663 and can use these extra arguments to help
4664 guide its actions.
4665 </para>
4667 <para>
4668 <emphasis>Changed in version  4.2:</emphasis>
4669 &f-env-Tool; now returns the tool object,
4670 previously it did not return (i.e. returned <constant>None</constant>).
4671 </para>
4673 <para>
4674 Examples:
4675 </para>
4677 <example_commands>
4678 env.Tool('gcc')
4679 env.Tool('opengl', toolpath=['build/tools'])
4680 </example_commands>
4682 <para>
4683 The returned tool object can be passed to an
4684 &f-link-Environment; or &f-link-Clone; call
4685 as part of the <parameter>tools</parameter> keyword argument,
4686 in which case the tool is applied to the environment being constructed,
4687 or it can be called directly,
4688 in which case a &consenv; to update must be
4689 passed as the argument.
4690 Either approach will also update the
4691 &cv-TOOLS; &consvar;.
4692 </para>
4694 <para>
4695 Examples:
4696 </para>
4698 <example_commands>
4699 env = Environment(tools=[Tool('msvc')])
4701 env = Environment()
4702 msvctool = Tool('msvc')
4703 msvctool(env)  # adds 'msvc' to the TOOLS variable
4704 gltool = Tool('opengl', toolpath = ['tools'])
4705 gltool(env)  # adds 'opengl' to the TOOLS variable
4706 </example_commands>
4707 </listitem>
4708   </varlistentry>
4709   <varlistentry id="f-ValidateOptions">
4710     <term><function>ValidateOptions</function>(<parameter>[throw_exception=False]</parameter>)</term>
4711     <listitem><para>
4712         Check that all the options specified on the command line are either
4713         &SCons; built-in options or defined via calls to &f-link-AddOption;.
4714         &SCons; will eventually fail on unknown options anyway, but calling
4715         this function allows the build to "fail fast" before executing
4716         expensive logic later in the build.
4717       </para>
4719       <para>
4720         This function should only be called after the last &f-AddOption;
4721         call in your &SConscript; logic.
4722         Be aware that some tools call &f-AddOption;, if you are getting
4723         error messages for arguments that they add, you will need to ensure
4724         that those tools are loaded before calling &f-ValidateOptions;.
4725       </para>
4727       <para>
4728         If there are any unknown command line options, &f-ValidateOptions;
4729         prints an error message and exits with an error exit status.
4730         If the optional <parameter>throw_exception</parameter> argument is
4731         <literal>True</literal> (default is <literal>False</literal>),
4732         a <exceptionname>SConsBadOptionError</exceptionname> is raised,
4733         giving an opportunity for the &SConscript; logic to catch that
4734         exception and handle invalid options appropriately. Note that
4735         this exception name needs to be imported (see the example below).
4736       </para>
4738       <para>
4739         A common build problem is typos (or thinkos) - a user enters an option
4740         that is just a little off the expected value, or perhaps a different
4741         word with a similar meaning.  It may be useful to abort the build
4742         before going too far down the wrong path. For example:
4743       </para>
4745       <screen>
4746 $ <userinput>scons --compilers=mingw</userinput>  # the correct flag is --compiler
4747       </screen>
4749       <para>
4750         Here &SCons; could go off and run a bunch of configure steps with
4751         the default value of <literal>--compiler</literal>, since the
4752         incorrect command line did not actually supply a value to it,
4753         costing developer time to track down why the configure logic
4754         made the "wrong" choices.  This example shows catching this:
4755       </para>
4757       <programlisting language="python">
4758 from SCons.Script.SConsOptions import SConsBadOptionError
4760 AddOption(
4761     '--compiler',
4762     dest='compiler',
4763     action='store',
4764     default='gcc',
4765     type='string',
4768 # ... other SConscript logic ...
4770 try:
4771     ValidateOptions(throw_exception=True)
4772 except SConsBadOptionError as e:
4773     print(f"ValidateOptions detects a fail: ", e.opt_str)
4774     Exit(3)
4775       </programlisting>
4777       <para><emphasis>New in version 4.5.0</emphasis></para>
4779     </listitem>
4780   </varlistentry>
4781   <varlistentry id="f-Value">
4782     <term><function>Value</function>(<parameter>value, [built_value], [name]</parameter>)</term>
4783     <term><replaceable>env</replaceable>.<methodname>Value</methodname>(<parameter>value, [built_value], [name]</parameter>)</term>
4784     <listitem><para>
4785 Returns a Node object representing the specified &Python;
4786 <parameter>value</parameter>.
4787 Value Nodes can be used as dependencies of targets.
4788 If the string representation of the Value Node
4789 changes between &SCons; runs, it is considered
4790 out of date and any targets depending it will be rebuilt.
4791 Since Value Nodes have no filesystem representation,
4792 timestamps are not used; the timestamp deciders
4793 perform the same content-based up to date check.
4794 </para>
4795 <para>
4796 The optional
4797 <parameter>built_value</parameter>
4798 argument can be specified
4799 when the Value Node is created
4800 to indicate the Node should already be considered "built."
4801 </para>
4803 <para>
4804 The optional <parameter>name</parameter> parameter can be provided as an
4805 alternative name for the resulting <literal>Value</literal> node;
4806 this is advised if the <parameter>value</parameter> parameter
4807 cannot be converted to a string.
4808 </para>
4810 <para>
4811 Value Nodes have a
4812 <methodname>write</methodname>
4813 method that can be used to "build" a Value Node
4814 by setting a new value.
4815 The corresponding
4816 <methodname>read</methodname>
4817 method returns the built value of the Node.
4818 </para>
4820 <para>
4821 <emphasis>Changed in version 4.0:</emphasis>
4822 the <parameter>name</parameter> parameter was added.
4823 </para>
4825 <para>
4826 Examples:
4827 </para>
4829 <example_commands>
4830 env = Environment()
4832 def create(target, source, env):
4833     """Action function to create a file from a Value.
4835     Writes 'prefix=$SOURCE' into the file name given as $TARGET.
4836     """
4837     with open(str(target[0]), 'wb') as f:
4838         f.write(b'prefix=' + source[0].get_contents() + b'\n')
4840 # Fetch the prefix= argument, if any, from the command line.
4841 # Use /usr/local as the default.
4842 prefix = ARGUMENTS.get('prefix', '/usr/local')
4844 # Attach builder named Config to the construction environment
4845 # using the 'create' action function above.
4846 env['BUILDERS']['Config'] = Builder(action=create)
4847 env.Config(target='package-config', source=Value(prefix))
4849 def build_value(target, source, env):
4850     """Action function to "build" a Value.
4852     Writes contents of $SOURCE into $TARGET, thus updating if it existed.
4853     """
4854     target[0].write(source[0].get_contents())
4856 output = env.Value('before')
4857 input = env.Value('after')
4859 # Attach a builder named UpdateValue to the construction environment
4860 # using the 'build_value' action function above.
4861 env['BUILDERS']['UpdateValue'] = Builder(action=build_value)
4862 env.UpdateValue(target=Value(output), source=Value(input))
4863 </example_commands>
4864 </listitem>
4865   </varlistentry>
4866   <varlistentry id="f-VariantDir">
4867     <term><function>VariantDir</function>(<parameter>variant_dir, src_dir, [duplicate]</parameter>)</term>
4868     <term><replaceable>env</replaceable>.<methodname>VariantDir</methodname>(<parameter>variant_dir, src_dir, [duplicate]</parameter>)</term>
4869     <listitem><para>
4870 Sets up a mapping to define a variant build directory in
4871 <parameter>variant_dir</parameter>.
4872 <parameter>src_dir</parameter> must not be underneath
4873 <parameter>variant_dir</parameter>.
4874 A &f-VariantDir; mapping is global, even if called using the
4875 &f-env-VariantDir; form.
4876 &f-VariantDir;
4877 can be called multiple times with the same
4878 <parameter>src_dir</parameter>
4879 to set up multiple variant builds with different options.
4880 </para>
4882 <para>
4883 Note if <parameter>variant_dir</parameter>
4884 is not under the project top directory,
4885 target selection rules will not pick targets in the
4886 variant directory unless they are explicitly specified.
4887 </para>
4889 <para>
4890 When files in <parameter>variant_dir</parameter> are referenced,
4891 &SCons; backfills as needed with files from <parameter>src_dir</parameter>
4892 to create a complete build directory.
4893 By default, &SCons;
4894 physically duplicates the source files, SConscript files,
4895 and directory structure as needed into the variant directory.
4896 Thus, a build performed in the variant directory is guaranteed to be identical
4897 to a build performed in the source directory even if
4898 intermediate source files are generated during the build,
4899 or if preprocessors or other scanners search for included files
4900 using paths relative to the source file,
4901 or if individual compilers or other invoked tools are hard-coded
4902 to put derived files in the same directory as source files.
4903 Only the files &SCons; calculates are needed for the build are
4904 duplicated into <parameter>variant_dir</parameter>.
4905 If possible on the platform,
4906 the duplication is performed by linking rather than copying.
4907 This behavior is affected by the
4908 <option>--duplicate</option>
4909 command-line option.
4910 </para>
4912 <para>
4913 Duplicating the source files may be disabled by setting the
4914 <parameter>duplicate</parameter>
4915 argument to
4916 <constant>False</constant>.
4917 This will cause
4918 &SCons;
4919 to invoke Builders using the path names of source files in
4920 <parameter>src_dir</parameter>
4921 and the path names of derived files within
4922 <parameter>variant_dir</parameter>.
4923 This is more efficient than duplicating,
4924 and is safe for most builds;
4925 revert to <literal>duplicate=True</literal>
4926 if it causes problems.
4927 </para>
4929 <para>
4930 &f-VariantDir;
4931 works most naturally when used with a subsidiary SConscript file.
4932 The subsidiary SConscript file must be called as if it were in
4933 <parameter>variant_dir</parameter>,
4934 regardless of the value of
4935 <parameter>duplicate</parameter>.
4936 When calling an SConscript file, you can use the
4937 <parameter>exports</parameter> keyword argument
4938 to pass parameters (individually or as an appropriately set up environment)
4939 so the SConscript can pick up the right settings for that variant build.
4940 The SConscript must &f-link-Import; these to use them. Example:
4941 </para>
4943 <example_commands>
4944 env1 = Environment(...settings for variant1...)
4945 env2 = Environment(...settings for variant2...)
4947 # run src/SConscript in two variant directories
4948 VariantDir('build/variant1', 'src')
4949 SConscript('build/variant1/SConscript', exports={"env": env1})
4950 VariantDir('build/variant2', 'src')
4951 SConscript('build/variant2/SConscript', exports={"env": env2})
4952 </example_commands>
4954 <para>
4955 See also the
4956 &f-link-SConscript; function
4957 for another way to specify a variant directory
4958 in conjunction with calling a subsidiary SConscript file.
4959 </para>
4961 <para>
4962 More examples:
4963 </para>
4965 <example_commands>
4966 # use names in the build directory, not the source directory
4967 VariantDir('build', 'src', duplicate=0)
4968 Program('build/prog', 'build/source.c')
4970 # this builds both the source and docs in a separate subtree
4971 VariantDir('build', '.', duplicate=0)
4972 SConscript(dirs=['build/src','build/doc'])
4974 # same as previous example, but only uses SConscript
4975 SConscript(dirs='src', variant_dir='build/src', duplicate=0)
4976 SConscript(dirs='doc', variant_dir='build/doc', duplicate=0)
4977 </example_commands>
4978 </listitem>
4979   </varlistentry>
4980   <varlistentry id="f-WhereIs">
4981     <term><function>WhereIs</function>(<parameter>program, [path, pathext, reject]</parameter>)</term>
4982     <term><replaceable>env</replaceable>.<methodname>WhereIs</methodname>(<parameter>program, [path, pathext, reject]</parameter>)</term>
4983     <listitem><para>
4984 Searches for the specified executable
4985 <parameter>program</parameter>,
4986 returning the full path to the program
4987 or <constant>None</constant>.
4988 </para>
4989 <para>
4990 When called as a &consenv; method,
4991 searches the paths in the
4992 <parameter>path</parameter> keyword argument,
4993 or if <constant>None</constant> (the default)
4994 the paths listed in the &consenv;
4995 (<varname>env</varname><literal>['ENV']['PATH']</literal>).
4996 The external environment's path list
4997 (<literal>os.environ['PATH']</literal>)
4998 is used as a fallback if the key
4999 <varname>env</varname><literal>['ENV']['PATH']</literal>
5000 does not exist.
5001 </para>
5002 <para>
5003 On Windows systems, searches for executable
5004 programs with any of the file extensions listed in the
5005 <parameter>pathext</parameter> keyword argument,
5006 or if <constant>None</constant> (the default)
5007 the pathname extensions listed in the &consenv;
5008 (<varname>env</varname><literal>['ENV']['PATHEXT']</literal>).
5009 The external environment's pathname extensions list
5010 (<literal>os.environ['PATHEXT']</literal>)
5011 is used as a fallback if the key
5012 <varname>env</varname><literal>['ENV']['PATHEXT']</literal>
5013 does not exist.
5014 </para>
5015 <para>
5016 When called as a global function, uses the external
5017 environment's path
5018 <literal>os.environ['PATH']</literal>
5019 and path extensions
5020 <literal>os.environ['PATHEXT']</literal>,
5021 respectively, if
5022 <parameter>path</parameter> and
5023 <parameter>pathext</parameter> are
5024 <constant>None</constant>.
5025 </para>
5026 <para>
5027 Will not select any
5028 path name or names
5029 in the optional
5030 <parameter>reject</parameter>
5031 list.
5032 </para>
5034 </listitem>
5035   </varlistentry>
5036 </variablelist>