Merge pull request #4650 from Repiteo/node-explicit-types
[scons.git] / SCons / Environment.xml
blobf24c2af3ea7edfeb250fec1fddded8ff89201ddd
1 <?xml version="1.0"?>
2 <!--
3 SPDX-FileCopyrightText: Copyright The SCons Foundation (https://scons.org)
4 SPDX-License-Identifier: MIT
5 SPDX-FileType: DOCUMENTATION
7 This file is processed by the bin/SConsDoc.py module.
8 -->
10 <!DOCTYPE sconsdoc [
11 <!ENTITY % scons SYSTEM '../doc/scons.mod'>
12 %scons;
13 <!ENTITY % builders-mod SYSTEM '../doc/generated/builders.mod'>
14 %builders-mod;
15 <!ENTITY % functions-mod SYSTEM '../doc/generated/functions.mod'>
16 %functions-mod;
17 <!ENTITY % tools-mod SYSTEM '../doc/generated/tools.mod'>
18 %tools-mod;
19 <!ENTITY % variables-mod SYSTEM '../doc/generated/variables.mod'>
20 %variables-mod;
23 <sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
24           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
25           xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
28 <!-- Construction variables -->
30 <cvar name="BUILDERS">
31 <summary>
32 <para>
33 A dictionary mapping the names of the builders
34 available through the &consenv; to underlying Builder objects.
35 Custom builders need to be added to this to make them available.
36 </para>
38 <para>
39 A platform-dependent default list of builders such as
40 &b-link-Program;, &b-link-Library; etc. is used to
41 populate this &consvar; when the &consenv; is initialized
42 via the presence/absence of the tools those builders depend on.
43 &cv-BUILDERS; can be examined to learn which builders will
44 actually be available at run-time.
45 </para>
47 <para>
48 Note that if you initialize this &consvar; through
49 assignment when the &consenv; is created,
50 that value for &cv-BUILDERS; will override any defaults:
51 </para>
53 <example_commands>
54 bld = Builder(action='foobuild &lt; $SOURCE > $TARGET')
55 env = Environment(BUILDERS={'NewBuilder': bld})
56 </example_commands>
58 <para>
59 To instead use a new Builder object in addition to the default Builders,
60 add your new Builder object like this:
61 </para>
63 <example_commands>
64 env = Environment()
65 env.Append(BUILDERS={'NewBuilder': bld})
66 </example_commands>
68 <para>
69 or this:
70 </para>
72 <example_commands>
73 env = Environment()
74 env['BUILDERS']['NewBuilder'] = bld
75 </example_commands>
76 </summary>
77 </cvar>
79 <cvar name="ENV">
80 <summary>
81 <para>
82 The <firstterm>execution environment</firstterm> -
83 a dictionary of environment variables
84 used when &SCons; invokes external commands
85 to build targets defined in this &consenv;.
86 When &cv-ENV; is passed to a command,
87 all list values are assumed to be path lists and
88 are joined using the search path separator.
89 Any other non-string values are coerced to a string.
90 </para>
92 <para>
93 Note that by default
94 &SCons;
95 does
96 <emphasis>not</emphasis>
97 propagate the environment in effect when you execute
98 &scons; (the "shell environment")
99 to the execution environment.
100 This is so that builds will be guaranteed
101 repeatable regardless of the environment
102 variables set at the time
103 &scons;
104 is invoked.
105 If you want to propagate a
106 shell environment variable
107 to the commands executed
108 to build target files,
109 you must do so explicitly.
110 A common example is
111 the system &PATH;
112 environment variable,
113 so that
114 &scons;
115 will find utilities the same way
116 as the invoking shell (or other process):
117 </para>
119 <example_commands>
120 import os
121 env = Environment(ENV={'PATH': os.environ['PATH']})
122 </example_commands>
124 <para>
125 Although it is usually not recommended,
126 you can propagate the entire shell environment
127 in one go:
128 </para>
130 <example_commands>
131 import os
132 env = Environment(ENV=os.environ.copy())
133 </example_commands>
135 </summary>
136 </cvar>
138 <cvar name="SCANNERS">
139 <summary>
140 <para>
141 A list of the available implicit dependency scanners.
142 New file scanners may be added by
143 appending to this list,
144 although the more flexible approach
145 is to associate scanners
146 with a specific Builder.
147 See the manpage sections "Builder Objects"
148 and "Scanner Objects"
149 for more information.
150 </para>
151 </summary>
152 </cvar>
154 <cvar name="CHANGED_SOURCES">
155 <summary>
156 <para>
157 A reserved variable name
158 that may not be set or used in a &consenv;.
159 (See the manpage section "Variable Substitution"
160 for more information).
161 </para>
162 </summary>
163 </cvar>
165 <cvar name="CHANGED_TARGETS">
166 <summary>
167 <para>
168 A reserved variable name
169 that may not be set or used in a &consenv;.
170 (See the manpage section "Variable Substitution"
171 for more information).
172 </para>
173 </summary>
174 </cvar>
176 <cvar name="SOURCE">
177 <summary>
178 <para>
179 A reserved variable name
180 that may not be set or used in a &consenv;.
181 (See the manpage section "Variable Substitution"
182 for more information).
183 </para>
184 </summary>
185 </cvar>
187 <cvar name="SOURCES">
188 <summary>
189 <para>
190 A reserved variable name
191 that may not be set or used in a &consenv;.
192 (See the manpage section "Variable Substitution"
193 for more information).
194 </para>
195 </summary>
196 </cvar>
198 <cvar name="TARGET">
199 <summary>
200 <para>
201 A reserved variable name
202 that may not be set or used in a &consenv;.
203 (See the manpage section "Variable Substitution"
204 for more information).
205 </para>
206 </summary>
207 </cvar>
209 <cvar name="TARGETS">
210 <summary>
211 <para>
212 A reserved variable name
213 that may not be set or used in a &consenv;.
214 (See the manpage section "Variable Substitution"
215 for more information).
216 </para>
217 </summary>
218 </cvar>
220 <cvar name="UNCHANGED_SOURCES">
221 <summary>
222 <para>
223 A reserved variable name
224 that may not be set or used in a &consenv;.
225 (See the manpage section "Variable Substitution"
226 for more information).
227 </para>
228 </summary>
229 </cvar>
231 <cvar name="UNCHANGED_TARGETS">
232 <summary>
233 <para>
234 A reserved variable name
235 that may not be set or used in a &consenv;.
236 (See the manpage section "Variable Substitution"
237 for more information).
238 </para>
239 </summary>
240 </cvar>
242 <cvar name="TOOLS">
243 <summary>
244 <para>
245 A list of the names of the Tool specification modules
246 that were actually initialized in the current &consenv;.
247 This may be useful as a diagnostic aid
248 to see if a tool did (or did not) run.
249 The value is informative and is not guaranteed to be complete.
250 </para>
251 </summary>
252 </cvar>
254 <cvar name="CACHEDIR_CLASS">
255     <summary>
256         <para>
257 The class type that SCons should use when instantiating a
258 new &f-link-CacheDir; in this &consenv;. Must be
259 a subclass of the <classname>SCons.CacheDir.CacheDir</classname> class.
260         </para>
261     </summary>
262 </cvar>
264 <!-- Functions /  Construction environment methods -->
266 <scons_function name="Action">
267 <arguments>
268 (action, [output, [var, ...]] [key=value, ...])
269 </arguments>
270 <summary>
271 <para>
272 A factory function to create an Action object for
273 the specified
274 <parameter>action</parameter>.
275 See the manpage section "Action Objects"
276 for a complete explanation of the arguments and behavior.
277 </para>
279 <para>
280 Note that the &f-env-Action;
281 form of the invocation will expand
282 &consvars; in any argument strings,
283 including the
284 <parameter>action</parameter>
285 argument, at the time it is called
286 using the &consvars; in the
287 &consenv; through which
288 &f-env-Action; was called.
289 The &f-Action; global function
290 form delays all variable expansion
291 until the Action object is actually used.
292 </para>
293 </summary>
294 </scons_function>
296 <scons_function name="AddMethod">
297 <arguments signature="global">
298 (object, function, [name])
299 </arguments>
300 <arguments signature="env">
301 (function, [name])
302 </arguments>
303 <summary>
304 <para>
305 Adds <parameter>function</parameter> to an object as a method.
306 <parameter>function</parameter> will be called with an instance
307 object as the first argument as for other methods.
308 If <parameter>name</parameter> is given, it is used as
309 the name of the new method, else the name of
310 <parameter>function</parameter> is used.
311 </para>
312 <para>
313 When the global function &f-AddMethod; is called,
314 the object to add the method to must be passed as the first argument;
315 typically this will be &Environment;,
316 in order to create a method which applies to all &consenvs;
317 subsequently constructed.
318 When called using the &f-env-AddMethod; form,
319 the method is added to the specified &consenv; only.
320 Added methods propagate through &f-env-Clone; calls.
321 </para>
323 <para>
324 More examples:
325 </para>
327 <example_commands>
328 # Function to add must accept an instance argument.
329 # The Python convention is to call this 'self'.
330 def my_method(self, arg):
331     print("my_method() got", arg)
333 # Use the global function to add a method to the Environment class:
334 AddMethod(Environment, my_method)
335 env = Environment()
336 env.my_method('arg')
338 # Use the optional name argument to set the name of the method:
339 env.AddMethod(my_method, 'other_method_name')
340 env.other_method_name('another arg')
341 </example_commands>
342 </summary>
343 </scons_function>
345 <scons_function name="AddPostAction">
346 <arguments>
347 (target, action)
348 </arguments>
349 <summary>
350 <para>
351 Arranges for the specified
352 <parameter>action</parameter>
353 to be performed
354 after the specified
355 <parameter>target</parameter>
356 has been built.
357 <parameter>action</parameter> may be
358 an Action object, or anything that
359 can be converted into an Action object.
360 See the manpage section "Action Objects"
361 for a complete explanation.
362 </para>
364 <para>
365 When multiple targets are supplied,
366 the action may be called multiple times,
367 once after each action that generates
368 one or more targets in the list.
369 </para>
371 <example_commands>
372 foo = Program('foo.c')
373 # remove execute permission from binary:
374 AddPostAction(foo, Chmod('$TARGET', "a-x"))
375 </example_commands>
377 </summary>
378 </scons_function>
380 <scons_function name="AddPreAction">
381 <arguments>
382 (target, action)
383 </arguments>
384 <summary>
385 <para>
386 Arranges for the specified
387 <parameter>action</parameter>
388 to be performed
389 before the specified
390 <parameter>target</parameter>
391 is built.
392 <parameter>action</parameter> may be
393 an Action object, or anything that
394 can be converted into an Action object.
395 See the manpage section "Action Objects"
396 for a complete explanation.
397 </para>
399 <para>
400 When multiple targets are specified,
401 the action(s) may be called multiple times,
402 once before each action that generates
403 one or more targets in the list.
404 </para>
406 <para>
407 Note that if any of the targets are built in multiple steps,
408 the action will be invoked just
409 before the "final" action that specifically
410 generates the specified target(s).
411 For example, when building an executable program
412 from a specified source
413 <filename>.c</filename>
414 file via an intermediate object file:
415 </para>
417 <example_commands>
418 foo = Program('foo.c')
419 AddPreAction(foo, 'pre_action')
420 </example_commands>
422 <para>
423 The specified
424 <literal>pre_action</literal>
425 would be executed before
426 &scons;
427 calls the link command that actually
428 generates the executable program binary
429 <filename>foo</filename>,
430 not before compiling the
431 <filename>foo.c</filename>
432 file into an object file.
433 </para>
434 </summary>
435 </scons_function>
437 <scons_function name="Alias">
438 <arguments>
439 (alias, [source, [action]])
440 </arguments>
441 <summary>
442 <para>
443 Creates an <firstterm>alias</firstterm> target that
444 can be used as a reference to zero or more other targets,
445 specified by the optional <parameter>source</parameter> parameter.
446 Aliases provide a way to give a shorter or more descriptive
447 name to specific targets,
448 and to group multiple targets under a single name.
449 The alias name, or an Alias Node object,
450 may be used as a dependency of any other target,
451 including another alias.
452 </para>
454 <para>
455 <parameter>alias</parameter> and <parameter>source</parameter>
456 may each be a string or Node object,
457 or a list of strings or Node objects;
458 if Nodes are used for
459 <parameter>alias</parameter>
460 they must be Alias nodes.
461 If <parameter>source</parameter> is omitted,
462 the alias is created but has no reference;
463 if selected for building this will result in a
464 <quote>Nothing to be done.</quote> message.
465 An empty alias can be used to define the alias
466 in a visible place in the project;
467 it can later be appended to in a subsidiary SConscript file
468 with the actual target(s) to refer to.
469 The optional
470 <parameter>action</parameter>
471 parameter specifies an action or list of actions
472 that will be executed
473 whenever the any of the alias targets are out-of-date.
474 </para>
476 <para>
477 &f-Alias; can be called for an existing alias,
478 which appends the <parameter>alias</parameter>
479 and/or <parameter>action</parameter> arguments
480 to the existing lists for that alias.
481 </para>
483 <para>
484 Returns a list of Alias Node objects representing the alias(es),
485 which exist outside of any physical file system.
486 The alias name space is separate from the name space for
487 tangible targets; to avoid confusion do not reuse
488 target names as alias names.
489 </para>
491 <para>
492 Examples:
493 </para>
495 <example_commands>
496 Alias('install')
497 Alias('install', '/usr/bin')
498 Alias(['install', 'install-lib'], '/usr/local/lib')
500 env.Alias('install', ['/usr/local/bin', '/usr/local/lib'])
501 env.Alias('install', ['/usr/local/man'])
503 env.Alias('update', ['file1', 'file2'], "update_database $SOURCES")
504 </example_commands>
505 </summary>
506 </scons_function>
508 <scons_function name="AlwaysBuild">
509 <arguments>
510 (target, ...)
511 </arguments>
512 <summary>
513 <para>
514 Marks each given
515 <parameter>target</parameter>
516 so that it is always assumed to be out-of-date,
517 and will always be rebuilt if needed.
518 Note, however, that
519 &f-AlwaysBuild;
520 does not add its target(s) to the default target list,
521 so the targets will only be built
522 if they are specified on the command line,
523 or are a dependent of a target specified on the command line--but
524 they will
525 <emphasis>always</emphasis>
526 be built if so specified.
527 Multiple targets can be passed in to a single call to
528 &f-AlwaysBuild;.
529 </para>
530 </summary>
531 </scons_function>
533 <scons_function name="Append">
534 <arguments signature="env">
535 (key=val, [...])
536 </arguments>
537 <summary>
538 <para>
539 Appends value(s) intelligently to &consvars; in
540 <varname>env</varname>.
541 The &consvars; and values to add to them are passed as
542 <parameter>key=val</parameter> pairs (&Python; keyword arguments).
543 &f-env-Append; is designed to allow adding values
544 without having to think about the data type of an existing &consvar;.
545 Regular &Python; syntax can also be used to manipulate the &consvar;,
546 but for that you may need to know the types involved,
547 for example pure &Python; lets you directly "add" two lists of strings,
548 but adding a string to a list or a list to a string requires
549 different syntax - things &f-Append; takes care of.
550 Some pre-defined &consvars; do have type expectations
551 based on how &SCons; will use them:
552 for example &cv-link-CPPDEFINES; is often a string or a list of strings,
553 but can also be a list of tuples or a dictionary;
554 while &cv-link-LIBEMITTER;
555 is expected to be a callable or list of callables,
556 and &cv-link-BUILDERS; is expected to be a dictionary.
557 Consult the documentation for the various &consvars; for more details.
558 </para>
560 <para>
561 The following descriptions apply to both the &f-Append;
562 and &f-Prepend; methods, as well as their
563 <emphasis role="bold">Unique</emphasis> variants,
564 with the differences being the insertion point of the added values
565 and whether duplication is allowed.
566 </para>
568 <para>
569 <parameter>val</parameter> can be almost any type.
570 If <varname>env</varname> does not have a &consvar;
571 named <parameter>key</parameter>,
572 then <parameter>key</parameter> is simply
573 stored with a value of <parameter>val</parameter>.
574 Otherwise, <parameter>val</parameter> is
575 combined with the existing value,
576 possibly converting into an appropriate type
577 which can hold the expanded contents.
578 There are a few special cases to be aware of.
579 Normally, when two strings are combined,
580 the result is a new string containing their concatenation
581 (and you are responsible for supplying any needed separation);
582 however, the contents of &cv-link-CPPDEFINES;
583 will be post-processed by adding a prefix and/or suffix
584 to each entry when the command line is produced,
585 so &SCons; keeps them separate -
586 appending a string will result in a separate string entry,
587 not a combined string.
588 For &cv-CPPDEFINES;. as well as
589 &cv-link-LIBS;, and the various <literal>*PATH</literal> variables,
590 &SCons; will amend the variable by supplying the compiler-specific
591 syntax (e.g. prepending a <literal>-D</literal> or <literal>/D</literal>
592 prefix for &cv-CPPDEFINES;), so you should omit this syntax when
593 adding values to these variables.
594 Examples (gcc syntax shown in the expansion of &CPPDEFINES;):
595 </para>
597 <example_commands>
598 env = Environment(CXXFLAGS="-std=c11", CPPDEFINES="RELEASE")
599 print(f"CXXFLAGS = {env['CXXFLAGS']}, CPPDEFINES = {env['CPPDEFINES']}")
600 # notice including a leading space in CXXFLAGS addition
601 env.Append(CXXFLAGS=" -O", CPPDEFINES="EXTRA")
602 print(f"CXXFLAGS = {env['CXXFLAGS']}, CPPDEFINES = {env['CPPDEFINES']}")
603 print("CPPDEFINES will expand to", env.subst('$_CPPDEFFLAGS'))
604 </example_commands>
606 <screen>
607 $ scons -Q
608 CXXFLAGS = -std=c11, CPPDEFINES = RELEASE
609 CXXFLAGS = -std=c11 -O, CPPDEFINES = deque(['RELEASE', 'EXTRA'])
610 CPPDEFINES will expand to -DRELEASE -DEXTRA
611 scons: `.' is up to date.
612 </screen>
614 <para>
615 Because &cv-link-CPPDEFINES; is intended for command-line
616 specification of C/C++ preprocessor macros,
617 additional syntax is accepted when adding to it.
618 The preprocessor accepts arguments to predefine a macro name by itself
619 (<computeroutput>-DFOO</computeroutput> for most compilers,
620 <computeroutput>/DFOO</computeroutput> for Microsoft C++),
621 which gives it an implicit value of <constant>1</constant>,
622 or can be given with a replacement value
623 (<computeroutput>-DBAR=TEXT</computeroutput>).
624 &SCons; follows these rules when adding to &cv-CPPDEFINES;:
625 </para>
626 <itemizedlist>
627 <listitem>
628 <para>A string is split on spaces,
629 giving an easy way to enter multiple macros in one addition.
630 Use an <literal>=</literal> to specify a valued macro.</para>
631 </listitem>
632 <listitem>
633 <para>A tuple is treated as a valued macro.
634 Use the value <constant>None</constant> if the macro should not have a value.
635 It is an error to supply more than two elements in such a tuple.</para>
636 </listitem>
637 <listitem>
638 <para>A list is processed in order,
639 adding each item without further interpretation.
640 In this case, space-separated strings are not split.</para>
641 </listitem>
642 <listitem>
643 <para>A dictionary is processed in order,
644 adding each key-value pair as a valued macro.
645 Use the value <constant>None</constant> if the macro should not have a value.
646 </para>
647 </listitem>
648 </itemizedlist>
650 <para>
651 Examples:
652 </para>
654 <example_commands>
655 env = Environment(CPPDEFINES="FOO")
656 print("CPPDEFINES =", env['CPPDEFINES'])
657 env.Append(CPPDEFINES="BAR=1")
658 print("CPPDEFINES =", env['CPPDEFINES'])
659 env.Append(CPPDEFINES=[("OTHER", 2)])
660 print("CPPDEFINES =", env['CPPDEFINES'])
661 env.Append(CPPDEFINES={"EXTRA": "arg"})
662 print("CPPDEFINES =", env['CPPDEFINES'])
663 print("CPPDEFINES will expand to", env.subst('$_CPPDEFFLAGS'))
664 </example_commands>
666 <screen>
667 $ scons -Q
668 CPPDEFINES = FOO
669 CPPDEFINES = deque(['FOO', 'BAR=1'])
670 CPPDEFINES = deque(['FOO', 'BAR=1', ('OTHER', 2)])
671 CPPDEFINES = deque(['FOO', 'BAR=1', ('OTHER', 2), ('EXTRA', 'arg')])
672 CPPDEFINES will expand to -DFOO -DBAR=1 -DOTHER=2 -DEXTRA=arg
673 scons: `.' is up to date.
674 </screen>
676 <para>
677 Examples of adding multiple macros:
678 </para>
680 <example_commands>
681 env = Environment()
682 env.Append(CPPDEFINES=[("ONE", 1), "TWO", ("THREE", )])
683 print("CPPDEFINES =", env['CPPDEFINES'])
684 env.Append(CPPDEFINES={"FOUR": 4, "FIVE": None})
685 print("CPPDEFINES =", env['CPPDEFINES'])
686 print("CPPDEFINES will expand to", env.subst('$_CPPDEFFLAGS'))
687 </example_commands>
689 <screen>
690 $ scons -Q
691 CPPDEFINES = [('ONE', 1), 'TWO', ('THREE',)]
692 CPPDEFINES = deque([('ONE', 1), 'TWO', ('THREE',), ('FOUR', 4), ('FIVE', None)])
693 CPPDEFINES will expand to -DONE=1 -DTWO -DTHREE -DFOUR=4 -DFIVE
694 scons: `.' is up to date.
695 </screen>
697 <para>
698 <emphasis>Changed in version  4.5</emphasis>:
699 clarified the use of tuples vs. other types,
700 handling is now consistent across the four functions.
701 </para>
703 <example_commands>
704 env = Environment()
705 env.Append(CPPDEFINES=("MACRO1", "MACRO2"))
706 print("CPPDEFINES =", env['CPPDEFINES'])
707 env.Append(CPPDEFINES=[("MACRO3", "MACRO4")])
708 print("CPPDEFINES =", env['CPPDEFINES'])
709 print("CPPDEFINES will expand to", env.subst('$_CPPDEFFLAGS'))
710 </example_commands>
712 <screen>
713 $ scons -Q
714 CPPDEFINES = ('MACRO1', 'MACRO2')
715 CPPDEFINES = deque(['MACRO1', 'MACRO2', ('MACRO3', 'MACRO4')])
716 CPPDEFINES will expand to -DMACRO1 -DMACRO2 -DMACRO3=MACRO4
717 scons: `.' is up to date.
718 </screen>
720 <para>
721 See &cv-link-CPPDEFINES; for more details.
722 </para>
724 <para>
725 Appending a string <parameter>val</parameter>
726 to a dictionary-typed &consvar; enters
727 <parameter>val</parameter> as the key in the dictionary,
728 and <literal>None</literal> as its value.
729 Using a tuple type to supply a key-value pair
730 only works for the special case of &cv-CPPDEFINES;
731 described above.
732 </para>
734 <para>
735 Although most combinations of types work without
736 needing to know the details, some combinations
737 do not make sense and &Python; raises an exception.
738 </para>
740 <para>
741 When using &f-env-Append; to modify &consvars;
742 which are path specifications (conventionally,
743 the names of such end in <literal>PATH</literal>),
744 it is recommended to add the values as a list of strings,
745 even if you are only adding a single string.
746 The same goes for adding library names to &cv-LIBS;.
747 </para>
749 <example_commands>
750 env.Append(CPPPATH=["#/include"])
751 </example_commands>
753 <para>
754 See also &f-link-env-AppendUnique;,
755 &f-link-env-Prepend; and &f-link-env-PrependUnique;.
756 </para>
758 </summary>
759 </scons_function>
761 <scons_function name="AppendENVPath">
762 <arguments signature="env">
763 (name, newpath, [envname, sep, delete_existing=False])
764 </arguments>
765 <summary>
766 <para>
767 Append path elements specified by <parameter>newpath</parameter>
768 to the given search path string or list <parameter>name</parameter>
769 in mapping <parameter>envname</parameter> in the &consenv;.
770 Supplying <parameter>envname</parameter> is optional:
771 the default is the execution environment &cv-link-ENV;.
772 Optional <parameter>sep</parameter> is used as the search path separator,
773 the default is the platform's separator (<systemitem>os.pathsep</systemitem>).
774 A path element will only appear once.
775 Any duplicates in <parameter>newpath</parameter> are dropped,
776 keeping the last appearing (to preserve path order).
777 If <parameter>delete_existing</parameter>
778 is <constant>False</constant> (the default)
779 any addition duplicating an existing path element is ignored;
780 if <parameter>delete_existing</parameter>
781 is <constant>True</constant> the existing value will
782 be dropped and the path element will be added at the end.
783 To help maintain uniqueness all paths are normalized (using
784 <systemitem>os.path.normpath</systemitem>
786 <systemitem>os.path.normcase</systemitem>).
787 </para>
789 <para>
790 Example:
791 </para>
793 <example_commands>
794 print('before:', env['ENV']['INCLUDE'])
795 include_path = '/foo/bar:/foo'
796 env.AppendENVPath('INCLUDE', include_path)
797 print('after:', env['ENV']['INCLUDE'])
798 </example_commands>
800 <para>Yields:</para>
801 <screen>
802 before: /foo:/biz
803 after: /biz:/foo/bar:/foo
804 </screen>
806 <para>
807 See also &f-link-env-PrependENVPath;.
808 </para>
810 </summary>
811 </scons_function>
813 <scons_function name="AppendUnique">
814 <arguments signature="env">
815 (key=val, [...], [delete_existing=False])
816 </arguments>
817 <summary>
818 <para>
819 Append values to &consvars; in the current &consenv;,
820 maintaining uniqueness.
821 Works like &f-link-env-Append;,
822 except that values that would become duplicates
823 are not added.
824 If <parameter>delete_existing</parameter>
825 is set to a true value, then for any duplicate,
826 the existing instance of <parameter>val</parameter> is first removed,
827 then <parameter>val</parameter> is appended,
828 having the effect of moving it to the end.
829 </para>
831 <para>
832 Example:
833 </para>
835 <example_commands>
836 env.AppendUnique(CCFLAGS='-g', FOO=['foo.yyy'])
837 </example_commands>
839 <para>
840 See also &f-link-env-Append;,
841 &f-link-env-Prepend;
842 and &f-link-env-PrependUnique;.
843 </para>
844 </summary>
845 </scons_function>
847 <scons_function name="Builder">
848 <arguments>
849 (action, [arguments])
850 </arguments>
851 <summary>
852 <para>
853 Creates a Builder object for
854 the specified
855 <parameter>action</parameter>.
856 See the manpage section "Builder Objects"
857 for a complete explanation of the arguments and behavior.
858 </para>
860 <para>
861 Note that the
862 <function>env.Builder</function>()
863 form of the invocation will expand
864 &consvars; in any arguments strings,
865 including the
866 <parameter>action</parameter>
867 argument,
868 at the time it is called
869 using the &consvars; in the
870 <varname>env</varname>
871 &consenv; through which
872 &f-env-Builder; was called.
874 &f-Builder;
875 form delays all variable expansion
876 until after the Builder object is actually called.
877 </para>
878 </summary>
879 </scons_function>
881 <scons_function name="CacheDir">
882 <arguments>
883 (cache_dir, custom_class=None)
884 </arguments>
885 <summary>
886 <para>
887 Direct
888 &scons;
889 to maintain a derived-file cache in
890 <parameter>cache_dir</parameter>.
891 The derived files in the cache will be shared
892 among all the builds specifying the same
893 <parameter>cache_dir</parameter>.
894 Specifying a
895 <parameter>cache_dir</parameter>
897 <constant>None</constant>
898 disables derived file caching.
899 </para>
901 <para>
902 Calling the environment method
903 &f-link-env-CacheDir;
904 limits the effect to targets built
905 through the specified &consenv;.
906 Calling the global function
907 &f-link-CacheDir;
908 sets a global default
909 that will be used by all targets built
910 through &consenvs;
911 that do not set up environment-specific
912 caching by calling &f-env-CacheDir;.
913 </para>
915 <para>
916 Caching behavior can be configured by passing a specialized cache
917 class as the optional <parameter>custom_class</parameter> parameter.
918 This class must be a subclass of
919 <classname>SCons.CacheDir.CacheDir</classname>.
920 &SCons; will internally invoke the custom class for performing
921 caching operations.
922 If the parameter is omitted or set to
923 <constant>None</constant>, &SCons; will use the default
924 <classname>SCons.CacheDir.CacheDir</classname> class.
925 </para>
927 <para>
928 When derived-file caching
929 is being used and
930 &scons;
931 finds a derived file that needs to be rebuilt,
932 it will first look in the cache to see if a
933 file with matching &buildsig; exists
934 (indicating the input file(s) and build action(s)
935 were identical to those for the current target),
936 and if so, will retrieve the file from the cache.
937 &scons;
938 will report
939 <computeroutput>Retrieved `file' from cache</computeroutput>
940 instead of the normal build message.
941 If the derived file is not present in the cache,
942 &scons;
943 will build it and
944 then place a copy of the built file in the cache,
945 identified by its &buildsig;, for future use.
946 </para>
948 <para>
950 <computeroutput>Retrieved `file' from cache</computeroutput>
951 messages are useful for human consumption,
952 but less useful when comparing log files between
953 &scons; runs which will show differences that are
954 noisy and not actually significant.
955 To disable,
956 use the <option>--cache-show</option> option.
957 With this option, &scons; changes printing
958 to always show the action that would
959 have been used to build the file without caching.
960 </para>
962 <para>
963 Derived-file caching
964 may be disabled for any invocation
965 of &scons; by giving the
966 <option>--cache-disable</option>
967 command line option;
968 cache updating may be disabled, leaving cache
969 fetching enabled, by giving the
970 <option>--cache-readonly</option> option.
971 </para>
973 <para>
974 If the
975 <option>--cache-force</option>
976 option is used,
977 &scons;
978 will place a copy of
979 <emphasis>all</emphasis>
980 derived files into the cache,
981 even if they already existed
982 and were not built by this invocation.
983 This is useful to populate a cache
984 the first time a
985 <parameter>cache_dir</parameter>
986 is used for a build,
987 or to bring a cache up to date after
988 a build with cache updating disabled
989 (<option>--cache-disable</option>
990 or <option>--cache-readonly</option>)
991 has been done.
992 </para>
994 <para>
996 &f-link-NoCache;
997 method can be used to disable caching of specific files.  This can be
998 useful if inputs and/or outputs of some tool are impossible to
999 predict or prohibitively large.
1000 </para>
1002 <para>
1003 Note that (at this time) &SCons; provides no facilities
1004 for managing the derived-file cache. It is up to the developer
1005 to arrange for cache pruning, expiry, access control, etc. if needed.
1006 </para>
1008 </summary>
1009 </scons_function>
1011 <scons_function name="Clean">
1012 <arguments>
1013 (targets, files)
1014 </arguments>
1015 <summary>
1016 <para>
1017 Set additional <parameter>files</parameter>
1018 for removal when any of
1019 <parameter>targets</parameter> are selected
1020 for cleaning
1021 (<link linkend="opt-clean"><option>-c</option></link>
1022 command line option).
1023 <parameter>targets</parameter> and
1024 <parameter>files</parameter>
1025 can each be a single filename or node,
1026 or a list of filenames or nodes.
1027 These can refer to files or directories.
1028 Calling this method repeatedly
1029 has an additive effect.
1030 </para>
1032 <para>
1033 The related
1034 &f-link-NoClean;
1035 method has higher priority:
1036 any target specified to
1037 &f-NoClean;
1038 will not be cleaned even if also given as
1039 a <parameter>files</parameter>
1040 parameter to &f-Clean;.
1041 </para>
1043 <para>
1044 Examples:
1045 </para>
1047 <example_commands>
1048 Clean('foo', ['bar', 'baz'])
1049 Clean('dist', env.Program('hello', 'hello.c'))
1050 Clean(['foo', 'bar'], 'something_else_to_clean')
1051 </example_commands>
1053 <para>
1054 &SCons; does not directly track directories as targets -
1055 they are created if needed and not normally removed
1056 in clean mode.
1057 In this example,
1058 installing the project creates a subdirectory for the documentation.
1059 The &f-Clean; call ensures that the subdirectory is removed
1060 if the project is uninstalled.
1061 </para>
1062 <example_commands>
1063 Clean(docdir, os.path.join(docdir, projectname))
1064 </example_commands>
1065 </summary>
1066 </scons_function>
1068 <scons_function name="Clone">
1069 <arguments signature="env">
1070 ([key=val, ...])
1071 </arguments>
1072 <summary>
1073 <para>
1074 Returns an independent copy of a &consenv;.
1075 If there are any unrecognized keyword arguments specified,
1076 they are added as &consvars; in the copy,
1077 overwriting any existing values
1078 for those keywords.
1079 See the manpage section "Construction Environments" for more details.
1080 </para>
1082 <para>
1083 Example:
1084 </para>
1086 <example_commands>
1087 env2 = env.Clone()
1088 env3 = env.Clone(CCFLAGS='-g')
1089 </example_commands>
1091 <para>
1092 A list of <parameter>tools</parameter>
1093 and a <parameter>toolpath</parameter> may be specified,
1094 as in the &f-link-Environment; constructor:
1095 </para>
1097 <example_commands>
1098 def MyTool(env):
1099     env['FOO'] = 'bar'
1101 env4 = env.Clone(tools=['msvc', MyTool])
1102 </example_commands>
1104 <para>
1106 <parameter>parse_flags</parameter>
1107 keyword argument is also recognized, to allow merging command-line
1108 style arguments into the appropriate construction
1109 variables (see &f-link-env-MergeFlags;).
1110 </para>
1112 <example_commands>
1113 # create an environment for compiling programs that use wxWidgets
1114 wx_env = env.Clone(parse_flags='!wx-config --cflags --cxxflags')
1115 </example_commands>
1117 <para>
1118 The <parameter>variables</parameter>
1119 keyword argument is also recognized, to allow (re)initializing
1120 &consvars; from a <literal>Variables</literal> object.
1121 </para>
1123 <para>
1124 <emphasis>Changed in version 4.8.0:</emphasis>
1125 the <parameter>variables</parameter> parameter was added.
1126 </para>
1127 </summary>
1128 </scons_function>
1130 <builder name="Command">
1131 <summary>
1132 <para>
1133 There is actually no Builder named &Command;,
1134 rather the term "Command Builder" refers to
1135 a function which, on each call, creates and calls
1136 an anonymous Builder.
1137 This is useful for "one-off" builds
1138 where a full Builder is not needed.
1139 Since the anonymous Builder is never hooked
1140 into the standard Builder framework,
1141 an Action must always be specified.
1142 See the &f-link-Command; function description
1143 for the calling syntax and details.
1144 </para>
1145 </summary>
1146 </builder>
1148 <scons_function name="Command">
1149 <arguments>
1150 (target, source, action, [key=val, ...])
1151 </arguments>
1152 <summary>
1153 <para>
1154 Creates an anonymous builder and calls it,
1155 thus recording <parameter>action</parameter>
1156 to build <parameter>target</parameter>
1157 from <parameter>source</parameter>
1158 into the dependency tree.
1159 This can be more convenient for a single special-case build
1160 than having to define and add a new named Builder.
1161 </para>
1163 <para>
1165 &Command; function accepts the
1166 <parameter>source_scanner</parameter> and
1167 <parameter>target_scanner</parameter>
1168 keyword arguments which are used to specify
1169 custom scanners for the specified sources or targets.
1170 The value must be a Scanner object.
1171 For example, the global
1172 <literal>DirScanner</literal>
1173 object can be used
1174 if any of the sources will be directories
1175 that must be scanned on-disk for
1176 changes to files that aren't
1177 already specified in other Builder or function calls.
1178 </para>
1180 <para>
1182 &Command; function also accepts the
1183 <parameter>source_factory</parameter> and
1184 <parameter>target_factory</parameter>
1185 keyword arguments which are used to specify
1186 factory functions to create &SCons; Nodes
1187 from any sources or targets specified as strings.
1188 If any sources or targets are already Node objects,
1189 they are not further transformed even if
1190 a factory is specified for them.
1191 The default for each is the &Entry; factory.
1192 </para>
1194 <para>
1195 These four arguments, if given, are used
1196 in the creation of the Builder.
1197 Other Builder-specific keyword arguments
1198 are not recognized as such.
1199 See the manpage section "Builder Objects"
1200 for more information about how these
1201 arguments work in a Builder.
1202 </para>
1204 <para>
1205 Any remaining keyword arguments are passed on to the
1206 generated builder when it is called,
1207 and behave as described in the manpage section "Builder Methods",
1208 in short:
1209 recognized arguments have their specified meanings,
1210 while the rest are used to override
1211 any same-named existing &consvars;
1212 from the &consenv;.
1213 </para>
1215 <para>
1216 <parameter>action</parameter> can be an external command,
1217 specified as a string,
1218 or a callable &Python; object;
1219 see the manpage section "Action Objects"
1220 for more complete information.
1221 Also note that a string specifying an external command
1222 may be preceded by an at-sign
1223 (<literal>@</literal>)
1224 to suppress printing the command in question,
1225 or by a hyphen
1226 (<literal>-</literal>)
1227 to ignore the exit status of the external command.
1228 </para>
1230 <para>
1231 Examples:
1232 </para>
1234 <example_commands>
1235 env.Command(
1236     target='foo.out',
1237     source='foo.in',
1238     action="$FOO_BUILD &lt; $SOURCES &gt; $TARGET"
1241 env.Command(
1242     target='bar.out',
1243     source='bar.in',
1244     action=["rm -f $TARGET", "$BAR_BUILD &lt; $SOURCES &gt; $TARGET"],
1245     ENV={'PATH': '/usr/local/bin/'},
1249 import os
1250 def rename(env, target, source):
1251     os.rename('.tmp', str(target[0]))
1254 env.Command(
1255     target='baz.out',
1256     source='baz.in',
1257     action=["$BAZ_BUILD &lt; $SOURCES &gt; .tmp", rename],
1259 </example_commands>
1261 <para>
1262 Note that the
1263 &Command;
1264 function will usually assume, by default,
1265 that the specified targets and/or sources are Files,
1266 if no other part of the configuration
1267 identifies what type of entries they are.
1268 If necessary, you can explicitly specify
1269 that targets or source nodes should
1270 be treated as directories
1271 by using the
1272 &f-link-Dir;
1274 &f-link-env-Dir;
1275 functions.
1276 </para>
1278 <para>
1279 Examples:
1280 </para>
1282 <example_commands>
1283 env.Command('ddd.list', Dir('ddd'), 'ls -l $SOURCE > $TARGET')
1285 env['DISTDIR'] = 'destination/directory'
1286 env.Command(env.Dir('$DISTDIR')), None, make_distdir)
1287 </example_commands>
1289 <para>
1290 Also note that SCons will usually
1291 automatically create any directory necessary to hold a target file,
1292 so you normally don't need to create directories by hand.
1293 </para>
1294 </summary>
1295 </scons_function>
1297 <scons_function name="Configure">
1298 <arguments signature="global">
1299 (env, [custom_tests, conf_dir, log_file, config_h])
1300 </arguments>
1301 <arguments signature="env">
1302 ([custom_tests, conf_dir, log_file, config_h])
1303 </arguments>
1304 <summary>
1305 <para>
1306 Creates a &Configure; object for integrated
1307 functionality similar to GNU <command>autoconf</command>.
1308 See the manpage section "Configure Contexts"
1309 for a complete explanation of the arguments and behavior.
1310 </para>
1311 </summary>
1312 </scons_function>
1314 <scons_function name="Decider">
1315 <arguments>
1316 (function)
1317 </arguments>
1318 <summary>
1319 <para>
1320 Specifies that all up-to-date decisions for
1321 targets built through this &consenv;
1322 will be handled by <parameter>function</parameter>.
1323 <parameter>function</parameter> can be the name of
1324 a function or one of the following strings
1325 that specify a predefined decider function:
1326 </para>
1328 <para>
1329 <variablelist>
1330 <varlistentry>
1331 <term><literal>"content"</literal></term>
1332 <listitem>
1333 <para>
1334 Specifies that a target shall be considered out-of-date and rebuilt
1335 if the dependency's content has changed since the last time
1336 the target was built,
1337 as determined by performing a checksum
1338 on the dependency's contents using the selected hash function,
1339 and comparing it to the checksum recorded the
1340 last time the target was built.
1341 <literal>content</literal> is the default decider.
1342 </para>
1343 <para>
1344 <emphasis>Changed in version 4.1:</emphasis>
1345 The decider was renamed to <literal>content</literal>
1346 since the hash function is now selectable.
1347 The former name, <literal>MD5</literal>,
1348 can still be used as a synonym, but is deprecated.
1349 </para>
1350 </listitem>
1351 </varlistentry>
1352 <varlistentry>
1353 <term><literal>"content-timestamp"</literal></term>
1354 <listitem>
1355 <para>
1356 Specifies that a target shall be considered out-of-date and rebuilt
1357 if the dependency's content has changed since the last time
1358 the target was built,
1359 except that dependencies with a timestamp that matches
1360 the last time the target was rebuilt will be
1361 assumed to be up-to-date and
1362 <emphasis>not</emphasis>
1363 rebuilt.
1364 This provides behavior very similar
1365 to the
1366 <literal>content</literal>
1367 behavior of always checksumming file contents,
1368 with an optimization of not checking
1369 the contents of files whose timestamps haven't changed.
1370 The drawback is that SCons will
1371 <emphasis>not</emphasis>
1372 detect if a file's content has changed
1373 but its timestamp is the same,
1374 as might happen in an automated script
1375 that runs a build,
1376 updates a file,
1377 and runs the build again,
1378 all within a single second.
1379 </para>
1380 <para>
1381 <emphasis>Changed in version 4.1:</emphasis>
1382 The decider was renamed to <literal>content-timestamp</literal>
1383 since the hash function is now selectable.
1384 The former name, <literal>MD5-timestamp</literal>,
1385 can still be used as a synonym, but is deprecated.
1386 </para>
1387 </listitem>
1388 </varlistentry>
1389 <varlistentry>
1390 <term><literal>"timestamp-newer"</literal></term>
1391 <listitem>
1392 <para>
1393 Specifies that a target shall be considered out-of-date and rebuilt
1394 if the dependency's timestamp is newer than the target file's timestamp.
1395 This is the behavior of the classic Make utility,
1397 <literal>make</literal>
1398 can be used a synonym for
1399 <literal>timestamp-newer</literal>.
1400 </para>
1401 </listitem>
1402 </varlistentry>
1403 <varlistentry>
1404 <term><literal>"timestamp-match"</literal></term>
1405 <listitem>
1406 <para>
1407 Specifies that a target shall be considered out-of-date and rebuilt
1408 if the dependency's timestamp is different than the
1409 timestamp recorded the last time the target was built.
1410 This provides behavior very similar to the classic Make utility
1411 (in particular, files are not opened up so that their
1412 contents can be checksummed)
1413 except that the target will also be rebuilt if a
1414 dependency file has been restored to a version with an
1415 <emphasis>earlier</emphasis>
1416 timestamp, such as can happen when restoring files from backup archives.
1417 </para>
1418 </listitem>
1419 </varlistentry>
1420 </variablelist>
1421 </para>
1423 <para>
1424 Examples:
1425 </para>
1427 <example_commands>
1428 # Use exact timestamp matches by default.
1429 Decider('timestamp-match')
1431 # Use hash content signatures for any targets built
1432 # with the attached &consenv;.
1433 env.Decider('content')
1434 </example_commands>
1436 <para>
1437 In addition to the above already-available functions, the
1438 <parameter>function</parameter>
1439 argument may be a &Python; function you supply.
1440 Such a function must accept the following four arguments:
1441 </para>
1443 <para>
1444 <variablelist>
1445 <varlistentry>
1446 <term><parameter>dependency</parameter></term>
1447 <listitem>
1448 <para>
1449 The Node (file) which
1450 should cause the
1451 <parameter>target</parameter>
1452 to be rebuilt
1453 if it has "changed" since the last time
1454 <parameter>target</parameter>
1455 was built.
1456 </para>
1457 </listitem>
1458 </varlistentry>
1459 <varlistentry>
1460 <term><parameter>target</parameter></term>
1461 <listitem>
1462 <para>
1463 The Node (file) being built.
1464 In the normal case,
1465 this is what should get rebuilt
1466 if the
1467 <parameter>dependency</parameter>
1468 has "changed."
1469 </para>
1470 </listitem>
1471 </varlistentry>
1472 <varlistentry>
1473 <term><parameter>prev_ni</parameter></term>
1474 <listitem>
1475 <para>
1476 Stored information about the state of the
1477 <parameter>dependency</parameter>
1478 the last time the
1479 <parameter>target</parameter>
1480 was built.
1481 This can be consulted to match various
1482 file characteristics
1483 such as the timestamp,
1484 size, or &contentsig;.
1485 </para>
1486 </listitem>
1487 </varlistentry>
1488     <varlistentry>
1489 <term><parameter>repo_node</parameter></term>
1490 <listitem>
1491 <para>
1492 If set, use this Node instead of the one specified by
1493 <parameter>dependency</parameter>
1494 to determine if the dependency has changed.
1495 This argument is optional so should be written
1496 as a default argument (typically it would be
1497 written as <parameter>repo_node=None</parameter>).
1498 A caller will normally only set this if the
1499 target only exists in a Repository.
1500 </para>
1501 </listitem>
1502 </varlistentry>
1504 </variablelist>
1505 </para>
1507 <para>
1509 <parameter>function</parameter>
1510 should return a value which evaluates
1511 <constant>True</constant>
1512 if the
1513 <parameter>dependency</parameter>
1514 has "changed" since the last time
1516 <parameter>target</parameter>
1517 was built
1518 (indicating that the target
1519 <emphasis>should</emphasis>
1520 be rebuilt),
1521 and a value which evaluates
1522 <constant>False</constant>
1523 otherwise
1524 (indicating that the target should
1525 <emphasis>not</emphasis>
1526 be rebuilt).
1527 Note that the decision can be made
1528 using whatever criteria are appropriate.
1529 Ignoring some or all of the function arguments
1530 is perfectly normal.
1531 </para>
1533 <para>
1534 Example:
1535 </para>
1537 <example_commands>
1538 def my_decider(dependency, target, prev_ni, repo_node=None):
1539     return not os.path.exists(str(target))
1541 env.Decider(my_decider)
1542 </example_commands>
1543 </summary>
1544 </scons_function>
1546 <scons_function name="Depends">
1547 <arguments>
1548 (target, dependency)
1549 </arguments>
1550 <summary>
1551 <para>
1552 Specifies an explicit dependency;
1554 <parameter>target</parameter>
1555 will be rebuilt
1556 whenever the
1557 <parameter>dependency</parameter>
1558 has changed.
1559 Both the specified
1560 <parameter>target</parameter>
1562 <parameter>dependency</parameter>
1563 can be a string
1564 (usually the path name of a file or directory)
1565 or Node objects,
1566 or a list of strings or Node objects
1567 (such as returned by a Builder call).
1568 This should only be necessary
1569 for cases where the dependency
1570 is not caught by a Scanner
1571 for the file.
1572 </para>
1574 <para>
1575 Example:
1576 </para>
1578 <example_commands>
1579 env.Depends('foo', 'other-input-file-for-foo')
1581 mylib = env.Library('mylib.c')
1582 installed_lib = env.Install('lib', mylib)
1583 bar = env.Program('bar.c')
1585 # Arrange for the library to be copied into the installation
1586 # directory before trying to build the "bar" program.
1587 # (Note that this is for example only.  A "real" library
1588 # dependency would normally be configured through the $LIBS
1589 # and $LIBPATH variables, not using an env.Depends() call.)
1591 env.Depends(bar, installed_lib)
1592 </example_commands>
1593 </summary>
1594 </scons_function>
1596 <scons_function name="Detect">
1597 <arguments signature="env">
1598 (progs)
1599 </arguments>
1600 <summary>
1601 <para>
1602 Find an executable from one or more choices:
1603 <parameter>progs</parameter> may be a string or a list of strings.
1604 Returns the first value from <parameter>progs</parameter>
1605 that was found, or <constant>None</constant>.
1606 Executable is searched by checking the paths in the execution environment
1607 (<varname>env</varname><literal>['ENV']['PATH']</literal>).
1608 On Windows systems, additionally applies the filename suffixes found in
1609 the execution environment
1610 (<varname>env</varname><literal>['ENV']['PATHEXT']</literal>)
1611 but will not include any such extension in the return value.
1612 &f-env-Detect; is a wrapper around &f-link-env-WhereIs;.
1613 </para>
1614 </summary>
1615 </scons_function>
1617 <scons_function name="Dictionary">
1618 <arguments signature="env">
1619 ([var, ...], [as_dict=])
1620 </arguments>
1621 <summary>
1622 <para>
1623 Return an object containing &consvars; from
1624 <parameter>env</parameter>.
1625 If <parameter>var</parameter> is omitted,
1626 all the &consvars; with their values
1627 are returned in a <type>dict</type>.
1628 If <parameter>var</parameter> is specified,
1629 and <parameter>as_dict</parameter> is true,
1630 the specified &consvars; are returned in a <type>dict</type>;
1631 otherwise (the default, for backwards compatibility),
1632 values only are returned,
1633 as a scalar if one <parameter>var</parameter> is given,
1634 or as a list if multiples.
1635 </para>
1637 <para>
1638 Example:
1639 </para>
1641 <example_commands>
1642 cvars = env.Dictionary()
1643 cc_values = env.Dictionary('CC', 'CCFLAGS', 'CCCOM')
1644 </example_commands>
1646 <note><para>
1647 The object returned by &f-link-env-Dictionary; should be treated
1648 as a read-only view into the &consvars;.
1649 Some &consvars; require special internal handling,
1650 and modifying them through the &f-env-Dictionary; object can bypass
1651 that handling and cause data inconsistencies.
1652 The primary use of &f-env-Dictionary; is for diagnostic purposes -
1653 it is used widely by test cases specifically because
1654 it bypasses the special handling so that behavior
1655 can be verified.
1656 </para></note>
1658 <para>
1659 <emphasis>Changed in NEXT_RELEASE</emphasis>:
1660 <parameter>as_dict</parameter> added.
1661 </para>
1663 </summary>
1664 </scons_function>
1666 <scons_function name="Dir">
1667 <arguments>
1668 (name, [directory])
1669 </arguments>
1670 <summary>
1671 <para>
1672 Returns Directory Node(s).
1673 A Directory Node is an object that represents a directory.
1674 <parameter>name</parameter>
1675 can be a relative or absolute path or a list of such paths.
1676 <parameter>directory</parameter>
1677 is an optional directory that will be used as the parent directory.
1678 If no
1679 <parameter>directory</parameter>
1680 is specified, the current script's directory is used as the parent.
1681 </para>
1683 <para>
1685 <parameter>name</parameter>
1686 is a single pathname, the corresponding node is returned.
1688 <parameter>name</parameter>
1689 is a list, SCons returns a list of nodes.
1690 Construction variables are expanded in
1691 <parameter>name</parameter>.
1692 </para>
1694 <para>
1695 Directory Nodes can be used anywhere you
1696 would supply a string as a directory name
1697 to a Builder method or function.
1698 Directory Nodes have attributes and methods
1699 that are useful in many situations;
1700 see manpage section "Filesystem Nodes"
1701 for more information.
1702 </para>
1703 </summary>
1704 </scons_function>
1706 <scons_function name="Dump">
1707 <arguments signature="env">
1708 ([var, ...], [format=TYPE])
1709 </arguments>
1710 <summary>
1711 <para>
1712 Serialize &consvars; from <parameter>env</parameter> to a string.
1713 If <varname>var</varname> is omitted,
1714 all the &consvars; are serialized.
1715 If one or more <varname>var</varname> values are supplied,
1716 only those variables and their values are serialized.
1717 </para>
1719 <para>
1720 The optional <parameter>format</parameter> string
1721 selects the serialization format:
1722 </para>
1723 <variablelist>
1724 <varlistentry>
1725 <term><literal>pretty</literal></term>
1726 <listitem>
1727 <para>
1728 Returns a pretty-printed representation
1729 of the &consvars; - the result will look like a
1730 &Python; <type>dict</type>
1731 (this is the default).
1732 </para>
1733 </listitem>
1734 </varlistentry>
1735 <varlistentry>
1736 <term><literal>json</literal></term>
1737 <listitem>
1738 <para>
1739 Returns a JSON-formatted representation of the variables.
1740 The variables will be presented as a JSON object literal,
1741 the JSON equivalent of a &Python; <type>dict</type>..
1742 </para>
1743 </listitem>
1744 </varlistentry>
1745 </variablelist>
1747 <para>
1748 <emphasis>Changed in NEXT_RELEASE</emphasis>:
1749 More than one <parameter>key</parameter> can be specified.
1750 The returned string always looks like a <type>dict</type>
1751 (or equivalent in other formats);
1752 previously a single key serialized only the value,
1753 not the key with the value.
1754 </para>
1756 <para>
1757 Examples: this &SConstruct;
1758 </para>
1760 <example_commands>
1761 env = Environment()
1762 print(env.Dump('CCCOM'))
1763 print(env.Dump('CC', 'CCFLAGS', format='json'))
1764 </example_commands>
1766 <para>
1767 will print something like:
1768 </para>
1770 <example_commands>
1771 {'CCCOM': '$CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCCOMCOM $SOURCES'}
1773     "CC": "gcc",
1774     "CCFLAGS": []
1776 </example_commands>
1778 <para>
1779 While this &SConstruct;:
1780 </para>
1782 <example_commands>
1783 env = Environment()
1784 print(env.Dump())
1785 </example_commands>
1787 <para>
1788 will print something like:
1789 </para>
1790 <example_commands>
1791 { 'AR': 'ar',
1792   'ARCOM': '$AR $ARFLAGS $TARGET $SOURCES\n$RANLIB $RANLIBFLAGS $TARGET',
1793   'ARFLAGS': ['r'],
1794   'AS': 'as',
1795   'ASCOM': '$AS $ASFLAGS -o $TARGET $SOURCES',
1796   'ASFLAGS': [],
1797   ...
1798 </example_commands>
1800 </summary>
1801 </scons_function>
1803 <scons_function name="Environment">
1804 <arguments>
1805 ([key=value, ...])
1806 </arguments>
1807 <summary>
1808 <para>
1809 Return a new &consenv;
1810 initialized with the specified
1811 <parameter>key</parameter>=<replaceable>value</replaceable>
1812 pairs.
1813 The keyword arguments
1814 <parameter>parse_flags</parameter>,
1815 <parameter>platform</parameter>,
1816 <parameter>toolpath</parameter>,
1817 <parameter>tools</parameter>
1818 and <parameter>variables</parameter>
1819 are specially recognized and do not lead to
1820 &consvar; creation.
1821 See the manpage section "Construction Environments" for more details.
1822 </para>
1823 </summary>
1824 </scons_function>
1826 <scons_function name="Execute">
1827 <arguments>
1828 (action, [actionargs ...])
1829 </arguments>
1830 <summary>
1831 <para>
1832 Executes an Action.
1833 <parameter>action</parameter>
1834 may be an Action object
1835 or it may be a command-line string,
1836 list of commands,
1837 or executable &Python; function,
1838 each of which will first be converted
1839 into an Action object
1840 and then executed.
1841 Any additional arguments to &f-Execute;
1842 are passed on to the &f-link-Action; factory function
1843 which actually creates the Action object
1844 (see the manpage section <link linkend="action_objects">Action Objects</link>
1845 for a description). Example:
1846 </para>
1848 <example_commands>
1849 Execute(Copy('file.out', 'file.in'))
1850 </example_commands>
1852 <para>&f-Execute; performs its action immediately,
1853 as part of the SConscript-reading phase.
1854 There are no sources or targets declared in an
1855 &f-Execute; call, so any objects it manipulates
1856 will not be tracked as part of the &SCons; dependency graph.
1857 In the example above, neither
1858 <filename>file.out</filename> nor
1859 <filename>file.in</filename> will be tracked objects.
1860 </para>
1862 <para>
1863 &f-Execute; returns the exit value of the command
1864 or return value of the &Python; function.
1865 &scons;
1866 prints an error message if the executed
1867 <parameter>action</parameter>
1868 fails (exits with or returns a non-zero value),
1869 however it does
1870 <emphasis>not</emphasis>,
1871 automatically terminate the build for such a failure.
1872 If you want the build to stop in response to a failed
1873 &f-Execute;
1874 call,
1875 you must explicitly check for a non-zero return value:
1876 </para>
1878 <example_commands>
1879 if Execute("mkdir sub/dir/ectory"):
1880     # The mkdir failed, don't try to build.
1881     Exit(1)
1882 </example_commands>
1883 </summary>
1884 </scons_function>
1886 <scons_function name="File">
1887 <arguments>
1888 (name, [directory])
1889 </arguments>
1890 <summary>
1891 <para>
1892 Returns File Node(s).
1893 A File Node is an object that represents a file.
1894 <parameter>name</parameter>
1895 can be a relative or absolute path or a list of such paths.
1896 <parameter>directory</parameter>
1897 is an optional directory that will be used as the parent directory.
1898 If no
1899 <parameter>directory</parameter>
1900 is specified, the current script's directory is used as the parent.
1901 </para>
1903 <para>
1905 <parameter>name</parameter>
1906 is a single pathname, the corresponding node is returned.
1908 <parameter>name</parameter>
1909 is a list, SCons returns a list of nodes.
1910 Construction variables are expanded in
1911 <parameter>name</parameter>.
1912 </para>
1914 <para>
1915 File Nodes can be used anywhere you
1916 would supply a string as a file name
1917 to a Builder method or function.
1918 File Nodes have attributes and methods
1919 that are useful in many situations;
1920 see manpage section "Filesystem Nodes"
1921 for more information.
1922 </para>
1923 </summary>
1924 </scons_function>
1926 <scons_function name="FindFile">
1927 <arguments>
1928 (file, dirs)
1929 </arguments>
1930 <summary>
1931 <para>
1932 Search for
1933 <parameter>file</parameter>
1934 in the path specified by
1935 <parameter>dirs</parameter>.
1936 <parameter>dirs</parameter>
1937 may be a list of directory names or a single directory name.
1938 In addition to searching for files that exist in the filesystem,
1939 this function also searches for derived files
1940 that have not yet been built.
1941 </para>
1943 <para>
1944 Example:
1945 </para>
1947 <example_commands>
1948 foo = env.FindFile('foo', ['dir1', 'dir2'])
1949 </example_commands>
1950 </summary>
1951 </scons_function>
1953 <scons_function name="FindInstalledFiles">
1954 <arguments>
1956 </arguments>
1957 <summary>
1958 <para>
1959 Returns the list of targets set up by the
1960 &b-link-Install;
1962 &b-link-InstallAs;
1963 builders.
1964 </para>
1966 <para>
1967 This function serves as a convenient method to select the contents of
1968 a binary package.
1969 </para>
1971 <para>
1972 Example:
1973 </para>
1975 <example_commands>
1976 Install('/bin', ['executable_a', 'executable_b'])
1978 # will return the file node list
1979 # ['/bin/executable_a', '/bin/executable_b']
1980 FindInstalledFiles()
1982 Install('/lib', ['some_library'])
1984 # will return the file node list
1985 # ['/bin/executable_a', '/bin/executable_b', '/lib/some_library']
1986 FindInstalledFiles()
1987 </example_commands>
1988 </summary>
1989 </scons_function>
1991 <scons_function name="FindSourceFiles">
1992 <arguments>
1993 (node='"."')
1994 </arguments>
1995 <summary>
1996 <para>
1997 Returns the list of nodes which serve as the source of the built files.
1998 It does so by inspecting the dependency tree starting at the optional
1999 argument
2000 <parameter>node</parameter>
2001 which defaults to the '"."'-node. It will then return all leaves of
2002 <parameter>node</parameter>.
2003 These are all children which have no further children.
2004 </para>
2006 <para>
2007 This function is a convenient method to select the contents of a Source
2008 Package.
2009 </para>
2011 <para>
2012 Example:
2013 </para>
2015 <example_commands>
2016 Program('src/main_a.c')
2017 Program('src/main_b.c')
2018 Program('main_c.c')
2020 # returns ['main_c.c', 'src/main_a.c', 'SConstruct', 'src/main_b.c']
2021 FindSourceFiles()
2023 # returns ['src/main_b.c', 'src/main_a.c' ]
2024 FindSourceFiles('src')
2025 </example_commands>
2027 <para>
2028 As you can see, build support files (&SConstruct; in the above example)
2029 will also be returned by this function.
2030 </para>
2031 </summary>
2032 </scons_function>
2034 <scons_function name="Flatten">
2035 <arguments>
2036 (sequence)
2037 </arguments>
2038 <summary>
2039 <para>
2040 Takes a sequence (that is, a &Python; list or tuple)
2041 that may contain nested sequences
2042 and returns a flattened list containing
2043 all of the individual elements in any sequence.
2044 This can be helpful for collecting
2045 the lists returned by calls to Builders;
2046 other Builders will automatically
2047 flatten lists specified as input,
2048 but direct &Python; manipulation of
2049 these lists does not.
2050 </para>
2052 <para>
2053 Examples:
2054 </para>
2056 <example_commands>
2057 foo = Object('foo.c')
2058 bar = Object('bar.c')
2060 # Because `foo' and `bar' are lists returned by the Object() Builder,
2061 # `objects' will be a list containing nested lists:
2062 objects = ['f1.o', foo, 'f2.o', bar, 'f3.o']
2064 # Passing such a list to another Builder is all right because
2065 # the Builder will flatten the list automatically:
2066 Program(source = objects)
2068 # If you need to manipulate the list directly using &Python;, you need to
2069 # call Flatten() yourself, or otherwise handle nested lists:
2070 for object in Flatten(objects):
2071     print(str(object))
2072 </example_commands>
2073 </summary>
2074 </scons_function>
2076 <scons_function name="GetBuildPath">
2077 <arguments>
2078 (file, [...])
2079 </arguments>
2080 <summary>
2081 <para>
2082 Returns the
2083 &scons;
2084 path name (or names) for the specified
2085 <parameter>file</parameter>
2086 (or files).
2087 The specified
2088 <parameter>file</parameter>
2089 or files
2090 may be
2091 &scons;
2092 Nodes or strings representing path names.
2093 </para>
2094 </summary>
2095 </scons_function>
2097 <scons_function name="Glob">
2098 <arguments>
2099 (pattern, [ondisk=True, source=False, strings=False, exclude=None])
2100 </arguments>
2101 <summary>
2102 <para>
2103 Returns a possibly empty list of Nodes (or strings) that match
2104 pathname specification <parameter>pattern</parameter>.
2105 <parameter>pattern</parameter> can be absolute,
2106 top-relative,
2107 or (most commonly) relative to the directory of the current
2108 &SConscript; file.
2109 &f-Glob; matches both files stored on disk and Nodes
2110 which &SCons; already knows about, even if any corresponding
2111 file is not currently stored on disk.
2112 The environment method form (&f-env-Glob;)
2113 performs string substitution on
2114 <parameter>pattern</parameter>
2115 and returns whatever matches the resulting expanded pattern.
2116 The results are sorted, unlike for the similar &Python;
2117 <systemitem>glob.glob</systemitem> function,
2118 to ensure build order will be stable.
2119 </para>
2121 <para>
2122 <parameter>pattern</parameter>
2123 can contain POSIX-style shell metacharacters for matching:
2124 </para>
2126 <informaltable rowsep="1" colsep="1" frame="topbot">
2127 <tgroup cols="2">
2128 <thead>
2129   <row>
2130     <entry>Pattern</entry>
2131     <entry>Meaning</entry>
2132   </row>
2133 </thead>
2134 <tbody>
2135   <row>
2136     <entry><literal>*</literal></entry>
2137     <entry>matches everything</entry>
2138   </row>
2139   <row>
2140       <entry><literal>?</literal></entry>
2141       <entry>matches any single character</entry>
2142   </row>
2143   <row>
2144       <entry><literal>[seq]</literal></entry>
2145       <entry>matches any character in <emphasis>seq</emphasis>
2146       (can be a list or a range).</entry>
2147   </row>
2148   <row>
2149       <entry><literal>[!seq]</literal></entry>
2150       <entry>matches any character not in <emphasis>seq</emphasis></entry>
2151   </row>
2152 </tbody>
2153 </tgroup>
2154 </informaltable>
2156 <para>
2157 For a literal match, wrap the metacharacter in brackets to
2158 escape the normal behavior.
2159 For example, <literal>'[?]'</literal> matches the character
2160 <literal>'?'</literal>.
2161 </para>
2163 <para>
2164 Filenames starting with a dot are specially handled -
2165 they can only be matched by patterns that start with a dot
2166 (or have a dot immediately following a pathname separator
2167 character, or slash), they are not not matched by the metacharacters.
2168 Metacharacter matches also do not span directory separators.
2169 </para>
2171 <para>
2172 &f-Glob;
2173 understands repositories
2174 (see the
2175 &f-link-Repository;
2176 function)
2177 and source directories
2178 (see the
2179 &f-link-VariantDir;
2180 function)
2181 and returns a Node (or string, if so configured) match
2182 in the local (SConscript) directory
2183 if a matching Node is found
2184 anywhere in a corresponding
2185 repository or source directory.
2186 </para>
2188 <para>
2189 If the optional
2190 <parameter>ondisk</parameter>
2191 argument evaluates false,
2192 the search for matches on disk is disabled,
2193 and only matches from
2194 already-configured File or Dir Nodes are returned.
2195 The default is to return Nodes for
2196 matches on disk as well.
2197 </para>
2199 <para>
2200 If the optional
2201 <parameter>source</parameter>
2202 argument evaluates true,
2203 and the local directory is a variant directory,
2204 then &f-Glob; returns Nodes from
2205 the corresponding source directory,
2206 rather than the local directory.
2207 <!-- XXX what about generated files that don't exist in src but will be sources? -->
2208 </para>
2210 <para>
2211 If the optional
2212 <parameter>strings</parameter>
2213 argument evaluates true,
2214 &f-Glob;
2215 returns matches as strings, rather than Nodes.
2216 The returned strings will be relative to
2217 the local (SConscript) directory.
2218 (Note that while this may make it easier to perform
2219 arbitrary manipulation of file names,
2220 it loses the context &SCons; would have in the Node,
2221 so if the returned strings are
2222 passed to a different
2223 &SConscript;
2224 file,
2225 any Node translation there will be relative
2226 to that
2227 &SConscript;
2228 directory,
2229 not to the original
2230 &SConscript;
2231 directory.)
2232 </para>
2234 <para>
2235 The optional
2236 <parameter>exclude</parameter>
2237 argument may be set to a pattern or a list of patterns
2238 describing files or directories
2239 to filter out of the match list.
2240 Elements matching a least one specified pattern will be excluded.
2241 These patterns use the same syntax as for
2242 <parameter>pattern</parameter>.
2243 </para>
2245 <para>
2246 Examples:
2247 </para>
2249 <example_commands>
2250 Program("foo", Glob("*.c"))
2251 Zip("/tmp/everything", Glob(".??*") + Glob("*"))
2252 sources = Glob("*.cpp", exclude=["os_*_specific_*.cpp"]) \
2253     + Glob("os_%s_specific_*.cpp" % currentOS)
2254 </example_commands>
2256 </summary>
2257 </scons_function>
2259 <!--
2260 <scons_function name="GlobalBuilders">
2261 <arguments signature="global">
2262 (flag)
2263 </arguments>
2264 <summary>
2265 <para>
2266 When
2267 <parameter>flag</parameter>
2268 is non-zero,
2269 adds the names of the default builders
2270 (Program, Library, etc.)
2271 to the global name space
2272 so they can be called without an explicit &consenv;.
2273 (This is the default.)
2274 When
2275 <parameter>flag</parameter>
2276 is zero,
2277 the names of the default builders are removed
2278 from the global name space
2279 so that an explicit &consenv; is required
2280 to call all builders.
2281 </para>
2282 </summary>
2283 </scons_function>
2286 <scons_function name="Ignore">
2287 <arguments>
2288 (target, dependency)
2289 </arguments>
2290 <summary>
2291 <para>
2292 Ignores <parameter>dependency</parameter>
2293 when deciding if
2294 <parameter>target</parameter> needs to be rebuilt.
2295 <parameter>target</parameter> and
2296 <parameter>dependency</parameter>
2297 can each be a single filename or Node
2298 or a list of filenames or Nodes.
2299 </para>
2301 <para>
2302 &f-Ignore; can also be used to
2303 remove a target from the default build
2304 by specifying the directory the target will be built in as
2305 <parameter>target</parameter>
2306 and the file you want to skip selecting for building as
2307 <parameter>dependency</parameter>.
2308 Note that this only removes the target from
2309 the default target selection algorithm:
2310 if it is a dependency of another object being
2311 built &SCons; still builds it normally.
2312 See the third and forth examples below.
2313 </para>
2315 <para>
2316 Examples:
2317 </para>
2319 <example_commands>
2320 env.Ignore('foo', 'foo.c')
2321 env.Ignore('bar', ['bar1.h', 'bar2.h'])
2322 env.Ignore('.', 'foobar.obj')
2323 env.Ignore('bar', 'bar/foobar.obj')
2324 </example_commands>
2325 </summary>
2326 </scons_function>
2328 <scons_function name="Literal">
2329 <arguments>
2330 (string)
2331 </arguments>
2332 <summary>
2333 <para>
2334 The specified
2335 <parameter>string</parameter>
2336 will be preserved as-is
2337 and not have &consvars; expanded.
2338 </para>
2339 </summary>
2340 </scons_function>
2342 <scons_function name="Local">
2343 <arguments>
2344 (targets)
2345 </arguments>
2346 <summary>
2347 <para>
2348 The specified
2349 <parameter>targets</parameter>
2350 will have copies made in the local tree,
2351 even if an already up-to-date copy
2352 exists in a repository.
2353 Returns a list of the target Node or Nodes.
2354 </para>
2355 </summary>
2356 </scons_function>
2358 <!--
2359 <scons_function name="MergeShellPaths">
2360 <arguments signature="env">
2361 ( arg ", [" prepend ])
2362 </arguments>
2363 <summary>
2364 <para>
2365 Merges the elements of the specified
2366 <parameter>arg</parameter>,
2367 which must be a dictionary, to the construction
2368 environment's copy of the shell environment
2369 in env['ENV'].
2370 (This is the environment which is passed
2371 to subshells spawned by SCons.)
2372 Note that
2373 <parameter>arg</parameter>
2374 must be a single value,
2375 so multiple strings must
2376 be passed in as a list,
2377 not as separate arguments to
2378 &f-MergeShellPaths;.
2379 </para>
2381 <para>
2382 New values are prepended to the environment variable by default,
2383 unless prepend=0 is specified.
2384 Duplicate values are always eliminated,
2385 since this function calls
2386 &f-link-AppendENVPath;
2388 &f-link-PrependENVPath;
2389 depending on the
2390 <parameter>prepend</parameter>
2391 argument.  See those functions for more details.
2392 </para>
2394 <para>
2395 Examples:
2396 </para>
2398 <example_commands>
2399 # Prepend a path to the shell PATH.
2400 env.MergeShellPaths({'PATH': '/usr/local/bin'})
2401 # Append two dirs to the shell INCLUDE.
2402 env.MergeShellPaths({'INCLUDE': ['c:/inc1', 'c:/inc2']}, prepend=0)
2403 </example_commands>
2404 </summary>
2405 </scons_function>
2408 <scons_function name="MergeFlags">
2409 <arguments signature="env">
2410 (arg, [unique])
2411 </arguments>
2412 <summary>
2413 <para>
2414 Merges values from
2415 <parameter>arg</parameter>
2416 into &consvars; in <parameter>env</parameter>.
2417 If <parameter>arg</parameter> is a dictionary,
2418 each key-value pair represents a
2419 &consvar; name and the corresponding flags to merge.
2420 If <parameter>arg</parameter>
2421 is not a dictionary,
2422 &MergeFlags; attempts to convert it to one
2423 before the values are merged.
2424 &f-link-env-ParseFlags; is used for this,
2425 so values to be converted are subject to the
2426 same limitations:
2427 &ParseFlags; has knowledge of which &consvars; certain
2428 flags should go to, but not all;
2429 and only for GCC and compatible compiler chains.
2430 <parameter>arg</parameter>
2431 must be a single object,
2432 so to pass multiple strings,
2433 enclose them in a list.
2434 </para>
2436 <para>
2437 If <literal>unique</literal> is true (the default),
2438 duplicate values are not retained.
2439 In case of duplication,
2440 any &consvar; names that end in
2441 <literal>PATH</literal>
2442 keep the left-most value so the
2443 path search order is not altered.
2444 All other &consvars; keep
2445 the right-most value.
2446 If <literal>unique</literal> is false,
2447 values are appended even if they are duplicates.
2448 </para>
2450 <para>
2451 Examples:
2452 </para>
2454 <example_commands>
2455 # Add an optimization flag to $CCFLAGS.
2456 env.MergeFlags({'CCFLAGS': '-O3'})
2458 # Combine the flags returned from running pkg-config with an optimization
2459 # flag and merge the result into the construction variables.
2460 env.MergeFlags(['!pkg-config gtk+-2.0 --cflags', '-O3'])
2462 # Combine an optimization flag with the flags returned from running pkg-config
2463 # for two distinct packages and merge into the construction variables.
2464 env.MergeFlags(
2465     [
2466         '-O3',
2467         '!pkg-config gtk+-2.0 --cflags --libs',
2468         '!pkg-config libpng12 --cflags --libs',
2469     ]
2471 </example_commands>
2472 </summary>
2473 </scons_function>
2475 <scons_function name="NoCache">
2476 <arguments>
2477 (target, ...)
2478 </arguments>
2479 <summary>
2480 <para>
2481 Specifies a list of files which should
2482 <emphasis>not</emphasis>
2483 be cached whenever the
2484 &f-link-CacheDir;
2485 method has been activated.
2486 The specified targets may be a list
2487 or an individual target.
2488 </para>
2490 <para>
2491 Multiple files should be specified
2492 either as separate arguments to the
2493 &f-NoCache;
2494 method, or as a list.
2495 &f-NoCache;
2496 will also accept the return value of any of the &consenv;
2497 Builder methods.
2498 </para>
2500 <para>
2501 Calling
2502 &f-NoCache;
2503 on directories and other non-File Node types has no effect because
2504 only File Nodes are cached.
2505 </para>
2507 <para>
2508 Examples:
2509 </para>
2511 <example_commands>
2512 NoCache('foo.elf')
2513 NoCache(env.Program('hello', 'hello.c'))
2514 </example_commands>
2515 </summary>
2516 </scons_function>
2518 <scons_function name="NoClean">
2519 <arguments>
2520 (targets, ...)
2521 </arguments>
2522 <summary>
2523 <para>
2524 Specifies files or directories which should not
2525 be removed whenever a specified
2526 <parameter>target</parameter> (or its dependencies)
2527 is selected and clean mode is active
2528 (<link linkend="opt-clean"><option>-c</option></link>
2529 command line option).
2530 <parameter>targets</parameter>
2531 may be one or more file or directory names
2532 or nodes,
2533 and/or lists of names or nodes.
2534 &f-NoClean; can be called multiple times.
2535 </para>
2537 <para>
2538 Calling
2539 &f-NoClean;
2540 for a target overrides calling
2541 &f-link-Clean;
2542 for the same target,
2543 so any targets passed to both functions will
2544 <emphasis>not</emphasis>
2545 be removed in clean mode.
2546 </para>
2548 <para>
2549 Examples:
2550 </para>
2552 <example_commands>
2553 NoClean('foo.elf')
2554 NoClean(env.Program('hello', 'hello.c'))
2555 </example_commands>
2556 </summary>
2557 </scons_function>
2559 <scons_function name="ParseConfig">
2560 <arguments signature="env">
2561 (command, [function, unique])
2562 </arguments>
2563 <summary>
2564 <para>
2565 Updates the current &consenv; with the values extracted
2566 from the output of running external <parameter>command</parameter>,
2567 by passing it to a helper <parameter>function</parameter>.
2568 <parameter>command</parameter> may be a string
2569 or a list of strings representing the command and
2570 its arguments.
2571 If <parameter>function</parameter>
2572 is omitted or <constant>None</constant>,
2573 &f-link-env-MergeFlags; is used.
2574 By default,
2575 duplicate values are not
2576 added to any &consvars;;
2577 you can specify
2578 <parameter>unique=False</parameter>
2579 to allow duplicate values to be added.
2580 </para>
2582 <para>
2583 <parameter>command</parameter> is executed using the
2584 SCons execution environment (that is, the &consvar;
2585 &cv-link-ENV; in the current &consenv;).
2586 If <parameter>command</parameter> needs additional information
2587 to operate properly, that needs to be set in the execution environment.
2588 For example, <command>pkg-config</command>
2589 may need a custom value set in the <envar>PKG_CONFIG_PATH</envar>
2590 environment variable.
2591 </para>
2593 <para>
2594 &f-env-MergeFlags; needs to understand
2595 the output produced by <parameter>command</parameter>
2596 in order to distribute it to appropriate &consvars;.
2597 &f-env-MergeFlags; uses a separate function to
2598 do that processing -
2599 see &f-link-env-ParseFlags; for the details, including
2600 a table of options and corresponding &consvars;.
2601 To provide alternative processing of the output of
2602 <parameter>command</parameter>,
2603 you can supply a custom
2604 <parameter>function</parameter>,
2605 which must accept three arguments:
2606 the &consenv; to modify,
2607 a string argument containing the output from running
2608 <parameter>command</parameter>,
2609 and the optional
2610 <parameter>unique</parameter> flag.
2611 </para>
2612 </summary>
2613 </scons_function>
2615 <scons_function name="ParseDepends">
2616 <arguments>
2617 (filename, [must_exist, only_one])
2618 </arguments>
2619 <summary>
2620 <para>
2621 Parses the contents of <parameter>filename</parameter>
2622 as a list of dependencies in the style of
2623 &Make;
2625 <application>mkdep</application>,
2626 and explicitly establishes all of the listed dependencies.
2627 </para>
2629 <para>
2630 By default,
2631 it is not an error
2632 if <parameter>filename</parameter>
2633 does not exist.
2634 The optional
2635 <parameter>must_exist</parameter>
2636 argument may be set to <constant>True</constant>
2637 to have &SCons;
2638 raise an exception if the file does not exist,
2639 or is otherwise inaccessible.
2640 </para>
2642 <para>
2643 The optional
2644 <parameter>only_one</parameter>
2645 argument may be set to <constant>True</constant>
2646 to have &SCons; raise an exception
2647 if the file contains dependency
2648 information for more than one target.
2649 This can provide a small sanity check
2650 for files intended to be generated
2651 by, for example, the
2652 <literal>gcc -M</literal>
2653 flag,
2654 which should typically only
2655 write dependency information for
2656 one output file into a corresponding
2657 <filename>.d</filename>
2658 file.
2659 </para>
2661 <para>
2662 <parameter>filename</parameter>
2663 and all of the files listed therein
2664 will be interpreted relative to
2665 the directory of the
2666 &SConscript;
2667 file which calls the
2668 &f-ParseDepends;
2669 function.
2670 </para>
2671 </summary>
2672 </scons_function>
2674 <scons_function name="ParseFlags">
2675 <arguments signature="env">
2676 (flags, ...)
2677 </arguments>
2678 <summary>
2679 <para>
2680 Parses one or more strings containing
2681 typical command-line flags for GCC-style tool chains
2682 and returns a dictionary with the flag values
2683 separated into the appropriate SCons &consvars;.
2684 Intended as a companion to the
2685 &f-link-env-MergeFlags;
2686 method, but allows for the values in the returned dictionary
2687 to be modified, if necessary,
2688 before merging them into the &consenv;.
2689 (Note that
2690 &f-env-MergeFlags;
2691 will call this method if its argument is not a dictionary,
2692 so it is usually not necessary to call
2693 &f-env-ParseFlags;
2694 directly unless you want to manipulate the values.)
2695 </para>
2697 <para>
2698 If the first character in any string is
2699 an exclamation mark (<literal>!</literal>),
2700 the rest of the string is executed as a command,
2701 and the output from the command is
2702 parsed as GCC tool chain command-line flags
2703 and added to the resulting dictionary.
2704 This can be used to call a <filename>*-config</filename>
2705 command typical of the POSIX programming environment
2706 (for example,
2707 <command>pkg-config</command>).
2708 Note that such a command is executed using the
2709 SCons execution environment;
2710 if the command needs additional information,
2711 that information needs to be explicitly provided.
2712 See &f-link-ParseConfig; for more details.
2713 </para>
2715 <para>
2716 Flag values are translated according to the prefix found,
2717 and added to the following &consvars;:
2718 </para>
2720 <example_commands>
2721 -arch                   CCFLAGS, LINKFLAGS
2722 -D                      CPPDEFINES
2723 -framework              FRAMEWORKS
2724 -frameworkdir=          FRAMEWORKPATH
2725 -fmerge-all-constants   CCFLAGS, LINKFLAGS
2726 -fopenmp                CCFLAGS, LINKFLAGS
2727 -fsanitize              CCFLAGS, LINKFLAGS
2728 -include                CCFLAGS
2729 -imacros                CCFLAGS
2730 -isysroot               CCFLAGS, LINKFLAGS
2731 -isystem                CCFLAGS
2732 -iquote                 CCFLAGS
2733 -idirafter              CCFLAGS
2734 -I                      CPPPATH
2735 -l                      LIBS
2736 -L                      LIBPATH
2737 -mno-cygwin             CCFLAGS, LINKFLAGS
2738 -mwindows               LINKFLAGS
2739 -openmp                 CCFLAGS, LINKFLAGS
2740 -pthread                CCFLAGS, LINKFLAGS
2741 -std=                   CFLAGS
2742 -stdlib=                CXXFLAGS
2743 -Wa,                    ASFLAGS, CCFLAGS
2744 -Wl,-rpath=             RPATH
2745 -Wl,-R,                 RPATH
2746 -Wl,-R                  RPATH
2747 -Wl,                    LINKFLAGS
2748 -Wp,                    CPPFLAGS
2749 -                       CCFLAGS
2750 +                       CCFLAGS, LINKFLAGS
2751 </example_commands>
2753 <para>
2754 Any other strings not associated with options
2755 are assumed to be the names of libraries
2756 and added to the
2757 &cv-LIBS; &consvar;.
2758 </para>
2760 <para>
2761 Examples (all of which produce the same result):
2762 </para>
2764 <example_commands>
2765 dict = env.ParseFlags('-O2 -Dfoo -Dbar=1')
2766 dict = env.ParseFlags('-O2', '-Dfoo', '-Dbar=1')
2767 dict = env.ParseFlags(['-O2', '-Dfoo -Dbar=1'])
2768 dict = env.ParseFlags('-O2', '!echo -Dfoo -Dbar=1')
2769 </example_commands>
2770 </summary>
2771 </scons_function>
2773 <scons_function name="Platform">
2774 <arguments signature="global">
2775 (plat)
2776 </arguments>
2777 <arguments signature="env">
2778 (plat)
2779 </arguments>
2780 <summary>
2781 <para>
2782 When called as a global function,
2783 returns a callable platform object
2784 selected by <parameter>plat</parameter>
2785 (defaults to the detected platform for the
2786 current system)
2787 that can be used to initialize
2788 a &consenv; by passing it as the
2789 <parameter>platform</parameter> keyword argument to the
2790 &f-link-Environment; function.
2791 </para>
2793 <para>
2794 Example:
2795 </para>
2797 <example_commands>
2798 env = Environment(platform=Platform('win32'))
2799 </example_commands>
2801 <para>
2802 When called as a method of an environment,
2803 calls the platform object indicated by
2804 <parameter>plat</parameter>
2805 to update that environment.
2806 </para>
2808 <example_commands>
2809 env.Platform('posix')
2810 </example_commands>
2812 <para>
2813 See the manpage section "Construction Environments" for more details.
2814 </para>
2815 </summary>
2816 </scons_function>
2818 <scons_function name="Prepend">
2819 <arguments signature="env">
2820 (key=val, [...])
2821 </arguments>
2822 <summary>
2823 <para>
2824 Prepend values to &consvars; in the current &consenv;,
2825 works like &f-link-env-Append; (see for details),
2826 except that values are added to the front,
2827 rather than the end, of any existing value of the &consvar;
2828 </para>
2830 <para>
2831 Example:
2832 </para>
2834 <example_commands>
2835 env.Prepend(CCFLAGS='-g ', FOO=['foo.yyy'])
2836 </example_commands>
2838 <para>
2839 See also &f-link-env-Append;,
2840 &f-link-env-AppendUnique;
2841 and &f-link-env-PrependUnique;.
2842 </para>
2843 </summary>
2844 </scons_function>
2846 <scons_function name="PrependENVPath">
2847 <arguments signature="env">
2848 (name, newpath, [envname, sep, delete_existing=True])
2849 </arguments>
2850 <summary>
2851 <para>
2852 Prepend path elements specified by <parameter>newpath</parameter>
2853 to the given search path string or list <parameter>name</parameter>
2854 in mapping <parameter>envname</parameter> in the &consenv;.
2855 Supplying <parameter>envname</parameter> is optional:
2856 the default is the execution environment &cv-link-ENV;.
2857 Optional <parameter>sep</parameter> is used as the search path separator,
2858 the default is the platform's separator (<systemitem>os.pathsep</systemitem>).
2859 A path element will only appear once.
2860 Any duplicates in <parameter>newpath</parameter> are dropped,
2861 keeping the first appearing (to preserve path order).
2862 If <parameter>delete_existing</parameter>
2863 is <constant>False</constant>
2864 any addition duplicating an existing path element is ignored;
2865 if <parameter>delete_existing</parameter>
2866 is <constant>True</constant> (the default) the existing value will
2867 be dropped and the path element will be inserted at the beginning.
2868 To help maintain uniqueness all paths are normalized (using
2869 <systemitem>os.path.normpath</systemitem>
2871 <systemitem>os.path.normcase</systemitem>).
2872 </para>
2874 <para>
2875 Example:
2876 </para>
2878 <example_commands>
2879 print('before:', env['ENV']['INCLUDE'])
2880 include_path = '/foo/bar:/foo'
2881 env.PrependENVPath('INCLUDE', include_path)
2882 print('after:', env['ENV']['INCLUDE'])
2883 </example_commands>
2885 <para>Yields:</para>
2887 <screen>
2888 before: /biz:/foo
2889 after: /foo/bar:/foo:/biz
2890 </screen>
2892 <para>
2893 See also &f-link-env-AppendENVPath;.
2894 </para>
2896 </summary>
2897 </scons_function>
2899 <scons_function name="PrependUnique">
2900 <arguments signature="env">
2901 (key=val, [...], [delete_existing=False])
2902 </arguments>
2903 <summary>
2904 <para>
2905 Prepend values to &consvars; in the current &consenv;,
2906 maintaining uniqueness.
2907 Works like &f-link-env-Append;,
2908 except that values are added to the front,
2909 rather than the end, of the &consvar;,
2910 and values that would become duplicates
2911 are not added.
2912 If <parameter>delete_existing</parameter>
2913 is set to a true value, then for any duplicate,
2914 the existing instance of <parameter>val</parameter> is first removed,
2915 then <parameter>val</parameter> is inserted,
2916 having the effect of moving it to the front.
2917 </para>
2919 <para>
2920 Example:
2921 </para>
2923 <example_commands>
2924 env.PrependUnique(CCFLAGS='-g', FOO=['foo.yyy'])
2925 </example_commands>
2927 <para>
2928 See also &f-link-env-Append;,
2929 &f-link-env-AppendUnique;
2930 and &f-link-env-Prepend;.
2931 </para>
2932 </summary>
2933 </scons_function>
2935 <scons_function name="PyPackageDir">
2936 <arguments>
2937 (modulename)
2938 </arguments>
2939 <summary>
2940 <para>
2941 Finds the location of <parameter>modulename</parameter>,
2942 which can be a string or a sequence of strings,
2943 each representing the name of a &Python; module.
2944 Construction variables are expanded in
2945 <parameter>modulename</parameter>.
2946 Returns a Directory Node (see &f-link-Dir;),
2947 or a list of Directory Nodes if
2948 <parameter>modulename</parameter> is a sequence.
2949 <literal>None</literal> is returned for any module not found.
2950 </para>
2952 <para>
2953 When a Tool module which is installed as a
2954 &Python; module is used, you need
2955 to specify a <parameter>toolpath</parameter> argument to
2956 &f-link-Tool;,
2957 &f-link-Environment;
2958 or &f-link-Clone;,
2959 as tools outside the standard project locations
2960 (<filename>site_scons/site_tools</filename>)
2961 will not be found otherwise.
2962 Using &f-PyPackageDir; allows this path to be
2963 discovered at runtime instead of hardcoding the path.
2964 </para>
2966 <para>
2967 Example:
2968 </para>
2970 <example_commands>
2971 env = Environment(
2972     tools=["default", "ExampleTool"],
2973     toolpath=[PyPackageDir("example_tool")]
2975 </example_commands>
2976 </summary>
2977 </scons_function>
2979 <scons_function name="Replace">
2980 <arguments signature="env">
2981 (key=val, [...])
2982 </arguments>
2983 <summary>
2984 <para>
2985 Replaces &consvars; in the Environment
2986 with the specified keyword arguments.
2987 </para>
2989 <para>
2990 Example:
2991 </para>
2993 <example_commands>
2994 env.Replace(CCFLAGS='-g', FOO='foo.xxx')
2995 </example_commands>
2996 </summary>
2997 </scons_function>
2999 <scons_function name="Repository">
3000 <arguments>
3001 (directory)
3002 </arguments>
3003 <summary>
3004 <para>
3005 Sets
3006 <parameter>directory</parameter>
3007 as a repository to be searched for files contributing to the build.
3008 Multiple calls to
3009 &f-Repository;
3010 are allowed,
3011 with repositories searched in the given order.
3012 Repositories specified via command-line option
3013 have higher priority.
3014 </para>
3016 <para>
3018 &scons;,
3019 a repository is partial or complete copy of the source tree,
3020 from the top-level directory down,
3021 containing source files
3022 that can be used to build targets in
3023 the current worktree.
3024 Repositories can also contain derived files.
3025 An example might be an official source tree maintained by an integrator.
3026 If a repository contains derived files,
3027 they should be the result of building with &SCons;,
3028 so a signature database (sconsign) is present
3029 in the repository,
3030 allowing better decisions on whether they are
3031 up-to-date or not.
3032 </para>
3034 <para>
3035 Note that if an up-to-date derived file
3036 already exists in a repository,
3037 &scons; will
3038 <emphasis>not</emphasis>
3039 make a copy in the local directory tree.
3040 If you need a local copy to be made,
3041 use the &f-link-Local; method.
3042 </para>
3043 </summary>
3044 </scons_function>
3046 <scons_function name="Requires">
3047 <arguments>
3048 (target, prerequisite)
3049 </arguments>
3050 <summary>
3051 <para>
3052 Specifies an order-only relationship
3053 between <parameter>target</parameter>
3054 and <parameter>prerequisite</parameter>.
3055 The prerequisites
3056 will be (re)built, if necessary,
3057 <emphasis>before</emphasis>
3058 the target file(s),
3059 but the target file(s) do not actually
3060 depend on the prerequisites
3061 and will not be rebuilt simply because
3062 the prerequisite file(s) change.
3063 <parameter>target</parameter> and
3064 <parameter>prerequisite</parameter> may each
3065 be a string or Node, or a list of strings or Nodes.
3066 If there are multiple
3067 <parameter>target</parameter> values,
3068 the prerequisite(s) are added to each one.
3069 Returns a list of the affected target nodes.
3070 </para>
3072 <para>
3073 Example:
3074 </para>
3076 <example_commands>
3077 env.Requires('foo', 'file-that-must-be-built-before-foo')
3078 </example_commands>
3079 </summary>
3080 </scons_function>
3082 <scons_function name="Scanner">
3083 <arguments>
3084 (function, [name, argument, skeys, path_function, node_class, node_factory, scan_check, recursive])
3085 </arguments>
3086 <summary>
3087 <para>
3088 Creates a Scanner object for
3089 the specified
3090 <parameter>function</parameter>.
3091 See manpage section "Scanner Objects"
3092 for a complete explanation of the arguments and behavior.
3093 </para>
3094 </summary>
3095 </scons_function>
3097 <scons_function name="SConscriptChdir">
3098 <arguments signature="global">
3099 (value)
3100 </arguments>
3101 <summary>
3102 <para>
3103 By default,
3104 &scons;
3105 changes its working directory
3106 to the directory in which each
3107 subsidiary SConscript file lives
3108 while reading and processing that script.
3109 This behavior may be disabled
3110 by specifying an argument which
3111 evaluates false, in which case
3112 &scons;
3113 will stay in the top-level directory
3114 while reading all SConscript files.
3115 (This may be necessary when building from repositories,
3116 when all the directories in which SConscript files may be found
3117 don't necessarily exist locally.)
3118 You may enable and disable
3119 this ability by calling
3120 &f-SConscriptChdir;
3121 multiple times.
3122 </para>
3124 <para>
3125 Example:
3126 </para>
3128 <example_commands>
3129 SConscriptChdir(False)
3130 SConscript('foo/SConscript')    # will not chdir to foo
3131 SConscriptChdir(True)
3132 SConscript('bar/SConscript')    # will chdir to bar
3133 </example_commands>
3134 </summary>
3135 </scons_function>
3137 <scons_function name="SConsignFile">
3138 <arguments>
3139 ([name, dbm_module])
3140 </arguments>
3141 <summary>
3142 <para>
3143 Specify where to store the &SCons; file signature database,
3144 and which database format to use.
3145 This may be useful to specify alternate
3146 database files and/or file locations for different types of builds.
3147 </para>
3148 <para>
3149 The optional <parameter>name</parameter> argument
3150 is the base name of the database file(s).
3151 If not an absolute path name,
3152 these are placed relative to the directory containing the
3153 top-level &SConstruct; file.
3154 The default is
3155 <filename>.sconsign</filename>.
3156 The actual database file(s) stored on disk
3157 may have an appropriate suffix appended
3158 by the chosen
3159 <parameter>dbm_module</parameter>
3160 </para>
3161 <para>
3162 The optional <parameter>dbm_module</parameter>
3163 argument specifies which
3164 &Python; database module to use
3165 for reading/writing the file.
3166 The module must be imported first;
3167 then the imported module name
3168 is passed as the argument.
3169 The default is a custom
3170 <systemitem>SCons.dblite</systemitem>
3171 module that uses pickled
3172 &Python; data structures,
3173 which works on all &Python; versions.
3174 See documentation of the &Python;
3175 <systemitem>dbm</systemitem> module
3176 for other available types.
3177 </para>
3178 <para>
3179 If called with no arguments,
3180 the database will default to
3181 <filename>.sconsign.dblite</filename>
3182 in the top directory of the project,
3183 which is also the default if
3184 if &f-SConsignFile; is not called.
3185 </para>
3186 <para>
3187 The setting is global, so the only difference
3188 between the global function and the environment method form
3189 is variable expansion on <parameter>name</parameter>.
3190 There should only be one active call to this
3191 function/method in a given build setup.
3192 </para>
3193 <para>
3195 <parameter>name</parameter>
3196 is set to
3197 <constant>None</constant>,
3198 &scons;
3199 will store file signatures
3200 in a separate
3201 <filename>.sconsign</filename>
3202 file in each directory,
3203 not in a single combined database file.
3204 This is a backwards-compatibility measure to support
3205 what was the default behavior
3206 prior to &SCons; 0.97 (i.e. before 2008).
3207 Use of this mode is discouraged and may be
3208 deprecated in a future &SCons; release.
3209 </para>
3211 <para>
3212 Examples:
3213 </para>
3215 <example_commands>
3216 # Explicitly stores signatures in ".sconsign.dblite"
3217 # in the top-level SConstruct directory (the default behavior).
3218 SConsignFile()
3220 # Stores signatures in the file "etc/scons-signatures"
3221 # relative to the top-level SConstruct directory.
3222 # SCons will add a database suffix to this name.
3223 SConsignFile("etc/scons-signatures")
3225 # Stores signatures in the specified absolute file name.
3226 # SCons will add a database suffix to this name.
3227 SConsignFile("/home/me/SCons/signatures")
3229 # Stores signatures in a separate .sconsign file
3230 # in each directory.
3231 SConsignFile(None)
3233 # Stores signatures in a GNU dbm format .sconsign file
3234 import dbm.gnu
3235 SConsignFile(dbm_module=dbm.gnu)
3236 </example_commands>
3237 </summary>
3238 </scons_function>
3240 <scons_function name="SetDefault">
3241 <arguments signature="env">
3242 (key=val, [...])
3243 </arguments>
3244 <summary>
3245 <para>
3246 Sets &consvars; to default values specified with the keyword
3247 arguments if (and only if) the variables are not already set.
3248 The following statements are equivalent:
3249 </para>
3251 <example_commands>
3252 env.SetDefault(FOO='foo')
3253 if 'FOO' not in env:
3254     env['FOO'] = 'foo'
3255 </example_commands>
3256 </summary>
3257 </scons_function>
3259 <scons_function name="SideEffect">
3260 <arguments>
3261 (side_effect, target)
3262 </arguments>
3263 <summary>
3264 <para>
3265 Declares
3266 <parameter>side_effect</parameter>
3267 as a side effect of building
3268 <parameter>target</parameter>.
3269 Both
3270 <parameter>side_effect</parameter>
3272 <parameter>target</parameter>
3273 can be a list, a file name, or a node.
3274 A side effect is a target file that is created or updated
3275 as a side effect of building other targets.
3276 For example, a Windows PDB
3277 file is created as a side effect of building the .obj
3278 files for a static library,
3279 and various log files are created updated
3280 as side effects of various TeX commands.
3281 If a target is a side effect of multiple build commands,
3282 &scons;
3283 will ensure that only one set of commands
3284 is executed at a time.
3285 Consequently, you only need to use this method
3286 for side-effect targets that are built as a result of
3287 multiple build commands.
3288 </para>
3290 <para>
3291 Because multiple build commands may update
3292 the same side effect file,
3293 by default the
3294 <parameter>side_effect</parameter>
3295 target is
3296 <emphasis>not</emphasis>
3297 automatically removed
3298 when the
3299 <parameter>target</parameter>
3300 is removed by the
3301 <option>-c</option>
3302 option.
3303 (Note, however, that the
3304 <parameter>side_effect</parameter>
3305 might be removed as part of
3306 cleaning the directory in which it lives.)
3307 If you want to make sure the
3308 <parameter>side_effect</parameter>
3309 is cleaned whenever a specific
3310 <parameter>target</parameter>
3311 is cleaned,
3312 you must specify this explicitly
3313 with the
3314 &f-link-Clean;
3316 &f-env-Clean;
3317 function.
3318 </para>
3320 <para>
3321 This function returns the list of side effect Node objects that were successfully added.
3322 If the list of side effects contained any side effects that had already been added,
3323 they are not added and included in the returned list.
3324 </para>
3325 </summary>
3326 </scons_function>
3328 <scons_function name="Split">
3329 <arguments>(arg)</arguments>
3330 <summary>
3331 <para>
3332 If <parameter>arg</parameter> is a string,
3333 splits on whitespace and returns a list of
3334 strings without whitespace.
3335 This mode is the most common case,
3336 and can be used to split a list of filenames
3337 (for example) rather than having to type them as a
3338 list of individually quoted words.
3339 If <parameter>arg</parameter> is a list or tuple
3340 returns the list or tuple unchanged.
3341 If <parameter>arg</parameter> is any other type of object,
3342 returns a list containing just the object.
3343 These non-string cases do not actually do any spliting,
3344 but allow an argument variable to be passed to
3345 &f-Split; without having to first check its type.
3346 </para>
3348 <para>
3349 Example:
3350 </para>
3352 <example_commands>
3353 files = Split("f1.c f2.c f3.c")
3354 files = env.Split("f4.c f5.c f6.c")
3355 files = Split("""
3356     f7.c
3357     f8.c
3358     f9.c
3359 """)
3360 </example_commands>
3361 </summary>
3362 </scons_function>
3364 <scons_function name="subst">
3365 <arguments signature="env">
3366 (input, [raw, target, source, conv])
3367 </arguments>
3368 <summary>
3369 <para>
3370 Performs &consvar; interpolation
3371 (<firstterm>substitution</firstterm>)
3372 on <parameter>input</parameter>,
3373 which can be a string or a sequence.
3374 Substitutable elements take the form
3375 <literal>${<replaceable>expression</replaceable>}</literal>,
3376 although if there is no ambiguity in recognizing the element,
3377 the braces can be omitted.
3378 A literal <emphasis role="bold">$</emphasis> can be entered by
3379 using <emphasis role="bold">$$</emphasis>.
3380 </para>
3382 <para>
3383 By default,
3384 leading or trailing white space will
3385 be removed from the result,
3386 and all sequences of white space
3387 will be compressed to a single space character.
3388 Additionally, any
3389 <literal>$(</literal>
3391 <literal>$)</literal>
3392 character sequences will be stripped from the returned string,
3393 The optional
3394 <parameter>raw</parameter>
3395 argument may be set to
3396 <literal>1</literal>
3397 if you want to preserve white space and
3398 <literal>$(</literal>-<literal>$)</literal>
3399 sequences.
3401 <parameter>raw</parameter>
3402 argument may be set to
3403 <literal>2</literal>
3404 if you want to additionally discard
3405 all characters between any
3406 <literal>$(</literal>
3408 <literal>$)</literal>
3409 pairs
3410 (as is done for signature calculation).
3411 </para>
3413 <para>
3414 If <parameter>input</parameter> is a sequence
3415 (list or tuple),
3416 the individual elements of
3417 the sequence will be expanded,
3418 and the results will be returned as a list.
3419 </para>
3421 <para>
3422 The optional
3423 <parameter>target</parameter>
3425 <parameter>source</parameter>
3426 keyword arguments
3427 must be set to lists of
3428 target and source nodes, respectively,
3429 if you want the
3430 &cv-TARGET;,
3431 &cv-TARGETS;,
3432 &cv-SOURCE;
3434 &cv-SOURCES;
3435 to be available for expansion.
3436 This is usually necessary if you are
3437 calling
3438 &f-env-subst;
3439 from within a &Python; function used
3440 as an SCons action.
3441 </para>
3443 <para>
3444 Returned string values or sequence elements
3445 are converted to their string representation by default.
3446 The optional
3447 <parameter>conv</parameter>
3448 argument
3449 may specify a conversion function
3450 that will be used in place of
3451 the default.
3452 For example, if you want &Python; objects
3453 (including SCons Nodes)
3454 to be returned as &Python; objects,
3455 you can use a &Python;
3456 lambda expression to pass in an unnamed function
3457 that simply returns its unconverted argument.
3458 </para>
3460 <para>
3461 Example:
3462 </para>
3464 <example_commands>
3465 print(env.subst("The C compiler is: $CC"))
3467 def compile(target, source, env):
3468     sourceDir = env.subst(
3469         "${SOURCE.srcdir}",
3470         target=target,
3471         source=source
3472     )
3474 source_nodes = env.subst('$EXPAND_TO_NODELIST', conv=lambda x: x)
3475 </example_commands>
3476 </summary>
3477 </scons_function>
3479 <scons_function name="Tool">
3480 <arguments>
3481 (name, [toolpath, key=value, ...])
3482 </arguments>
3483 <summary>
3485 <para>
3486 Locates the tool specification module <parameter>name</parameter>
3487 and returns a callable tool object for that tool.
3488 When the environment method (&f-env-Tool;) form is used,
3489 the tool object is automatically called before the method returns
3490 to update <varname>env</varname>,
3491 and <parameter>name</parameter> is
3492 appended to the &cv-link-TOOLS;
3493 &consvar; in that environment.
3494 When the global function &f-Tool; form is used,
3495 the tool object is constructed but not called,
3496 as it lacks the context of an environment to update,
3497 and the returned object needs to be used to arrange for the call.
3498 </para>
3500 <para>
3501 The tool module is searched for in the tool search paths (see the
3502 <emphasis role="bold">Tools</emphasis> section in the manual page
3503 for details)
3504 and in any paths specified by the optional
3505 <parameter>toolpath</parameter> parameter,
3506 which must be a list of strings.
3507 If <parameter>toolpath</parameter> is omitted,
3508 the <parameter>toolpath</parameter>
3509 supplied when the environment was created,
3510 if any, is used.
3511 </para>
3513 <para>
3514 Any remaining keyword arguments are saved in
3515 the tool object,
3516 and will be passed to the tool module's
3517 <function>generate</function> function
3518 when the tool object is actually called.
3519 The <function>generate</function> function
3520 can update the &consenv; with &consvars; and arrange
3521 any other initialization
3522 needed to use the mechanisms that tool describes,
3523 and can use these extra arguments to help
3524 guide its actions.
3525 </para>
3527 <para>
3528 <emphasis>Changed in version  4.2:</emphasis>
3529 &f-env-Tool; now returns the tool object,
3530 previously it did not return (i.e. returned <constant>None</constant>).
3531 </para>
3533 <para>
3534 Examples:
3535 </para>
3537 <example_commands>
3538 env.Tool('gcc')
3539 env.Tool('opengl', toolpath=['build/tools'])
3540 </example_commands>
3542 <para>
3543 The returned tool object can be passed to an
3544 &f-link-Environment; or &f-link-Clone; call
3545 as part of the <parameter>tools</parameter> keyword argument,
3546 in which case the tool is applied to the environment being constructed,
3547 or it can be called directly,
3548 in which case a &consenv; to update must be
3549 passed as the argument.
3550 Either approach will also update the
3551 &cv-TOOLS; &consvar;.
3552 </para>
3554 <para>
3555 Examples:
3556 </para>
3558 <example_commands>
3559 env = Environment(tools=[Tool('msvc')])
3561 env = Environment()
3562 msvctool = Tool('msvc')
3563 msvctool(env)  # adds 'msvc' to the TOOLS variable
3564 gltool = Tool('opengl', toolpath = ['tools'])
3565 gltool(env)  # adds 'opengl' to the TOOLS variable
3566 </example_commands>
3567 </summary>
3568 </scons_function>
3570 <scons_function name="Value">
3571 <arguments>
3572 (value, [built_value], [name])
3573 </arguments>
3574 <summary>
3575 <para>
3576 Returns a Node object representing the specified &Python;
3577 <parameter>value</parameter>.
3578 Value Nodes can be used as dependencies of targets.
3579 If the string representation of the Value Node
3580 changes between &SCons; runs, it is considered
3581 out-of-date and any targets depending on it will be rebuilt.
3582 Since Value Nodes have no filesystem representation,
3583 timestamps are not used; the timestamp deciders
3584 perform the same content-based up to date check.
3585 </para>
3586 <para>
3587 The optional
3588 <parameter>built_value</parameter>
3589 argument can be specified
3590 when the Value Node is created
3591 to indicate the Node should already be considered "built."
3592 </para>
3594 <para>
3595 The optional <parameter>name</parameter> parameter can be provided as an
3596 alternative name for the resulting <literal>Value</literal> node;
3597 this is advised if the <parameter>value</parameter> parameter
3598 cannot be converted to a string.
3599 </para>
3601 <para>
3602 Value Nodes have a
3603 <methodname>write</methodname>
3604 method that can be used to "build" a Value Node
3605 by setting a new value.
3606 The corresponding
3607 <methodname>read</methodname>
3608 method returns the built value of the Node.
3609 </para>
3611 <para>
3612 <emphasis>Changed in version 4.0:</emphasis>
3613 the <parameter>name</parameter> parameter was added.
3614 </para>
3616 <para>
3617 Examples:
3618 </para>
3620 <!-- TODO fix second example or replace - still doesn't work -->
3621 <example_commands>
3622 env = Environment()
3624 def create(target, source, env):
3625     """Action function to create a file from a Value.
3627     Writes 'prefix=$SOURCE' into the file name given as $TARGET.
3628     """
3629     with open(str(target[0]), 'wb') as f:
3630         f.write(b'prefix=' + source[0].get_contents() + b'\n')
3632 # Fetch the prefix= argument, if any, from the command line.
3633 # Use /usr/local as the default.
3634 prefix = ARGUMENTS.get('prefix', '/usr/local')
3636 # Attach builder named Config to the construction environment
3637 # using the 'create' action function above.
3638 env['BUILDERS']['Config'] = Builder(action=create)
3639 env.Config(target='package-config', source=Value(prefix))
3641 def build_value(target, source, env):
3642     """Action function to "build" a Value.
3644     Writes contents of $SOURCE into $TARGET, thus updating if it existed.
3645     """
3646     target[0].write(source[0].get_contents())
3648 output = env.Value('before')
3649 input = env.Value('after')
3651 # Attach a builder named UpdateValue to the construction environment
3652 # using the 'build_value' action function above.
3653 env['BUILDERS']['UpdateValue'] = Builder(action=build_value)
3654 env.UpdateValue(target=Value(output), source=Value(input))
3655 </example_commands>
3656 </summary>
3657 </scons_function>
3659 <scons_function name="VariantDir">
3660 <arguments>
3661 (variant_dir, src_dir, [duplicate])
3662 </arguments>
3663 <summary>
3664 <para>
3665 Sets up a mapping to define a variant build directory in
3666 <parameter>variant_dir</parameter>.
3667 <parameter>src_dir</parameter> must not be underneath
3668 <parameter>variant_dir</parameter>.
3669 A &f-VariantDir; mapping is global, even if called using the
3670 &f-env-VariantDir; form.
3671 &f-VariantDir;
3672 can be called multiple times with the same
3673 <parameter>src_dir</parameter>
3674 to set up multiple variant builds with different options.
3675 </para>
3677 <para>
3678 Note if <parameter>variant_dir</parameter>
3679 is not under the project top directory,
3680 target selection rules will not pick targets in the
3681 variant directory unless they are explicitly specified.
3682 </para>
3684 <para>
3685 When files in <parameter>variant_dir</parameter> are referenced,
3686 &SCons; backfills as needed with files from <parameter>src_dir</parameter>
3687 to create a complete build directory.
3688 By default, &SCons;
3689 physically duplicates the source files, SConscript files,
3690 and directory structure as needed into the variant directory.
3691 Thus, a build performed in the variant directory is guaranteed to be identical
3692 to a build performed in the source directory even if
3693 intermediate source files are generated during the build,
3694 or if preprocessors or other scanners search for included files
3695 using paths relative to the source file,
3696 or if individual compilers or other invoked tools are hard-coded
3697 to put derived files in the same directory as source files.
3698 Only the files &SCons; calculates are needed for the build are
3699 duplicated into <parameter>variant_dir</parameter>.
3700 If possible on the platform,
3701 the duplication is performed by linking rather than copying.
3702 This behavior is affected by the
3703 <option>--duplicate</option>
3704 command-line option.
3705 </para>
3707 <para>
3708 Duplicating the source files may be disabled by setting the
3709 <parameter>duplicate</parameter>
3710 argument to
3711 <constant>False</constant>.
3712 This will cause
3713 &SCons;
3714 to invoke Builders using the path names of source files in
3715 <parameter>src_dir</parameter>
3716 and the path names of derived files within
3717 <parameter>variant_dir</parameter>.
3718 This is more efficient than duplicating,
3719 and is safe for most builds;
3720 revert to <literal>duplicate=True</literal>
3721 if it causes problems.
3722 </para>
3724 <para>
3725 &f-VariantDir;
3726 works most naturally when used with a subsidiary SConscript file.
3727 The subsidiary SConscript file must be called as if it were in
3728 <parameter>variant_dir</parameter>,
3729 regardless of the value of
3730 <parameter>duplicate</parameter>.
3731 When calling an SConscript file, you can use the
3732 <parameter>exports</parameter> keyword argument
3733 to pass parameters (individually or as an appropriately set up environment)
3734 so the SConscript can pick up the right settings for that variant build.
3735 The SConscript must &f-link-Import; these to use them. Example:
3736 </para>
3738 <example_commands>
3739 env1 = Environment(...settings for variant1...)
3740 env2 = Environment(...settings for variant2...)
3742 # run src/SConscript in two variant directories
3743 VariantDir('build/variant1', 'src')
3744 SConscript('build/variant1/SConscript', exports={"env": env1})
3745 VariantDir('build/variant2', 'src')
3746 SConscript('build/variant2/SConscript', exports={"env": env2})
3747 </example_commands>
3749 <para>
3750 See also the
3751 &f-link-SConscript; function
3752 for another way to specify a variant directory
3753 in conjunction with calling a subsidiary SConscript file.
3754 </para>
3756 <para>
3757 More examples:
3758 </para>
3760 <example_commands>
3761 # use names in the build directory, not the source directory
3762 VariantDir('build', 'src', duplicate=0)
3763 Program('build/prog', 'build/source.c')
3765 # this builds both the source and docs in a separate subtree
3766 VariantDir('build', '.', duplicate=0)
3767 SConscript(dirs=['build/src','build/doc'])
3769 # same as previous example, but only uses SConscript
3770 SConscript(dirs='src', variant_dir='build/src', duplicate=0)
3771 SConscript(dirs='doc', variant_dir='build/doc', duplicate=0)
3772 </example_commands>
3773 </summary>
3774 </scons_function>
3776 <scons_function name="WhereIs">
3777 <arguments>
3778 (program, [path, pathext, reject])
3779 </arguments>
3780 <summary>
3781 <para>
3782 Searches for the specified executable
3783 <parameter>program</parameter>,
3784 returning the full path to the program
3785 or <constant>None</constant>.
3786 </para>
3787 <para>
3788 When called as a &consenv; method,
3789 searches the paths in the
3790 <parameter>path</parameter> keyword argument,
3791 or if <constant>None</constant> (the default)
3792 the paths listed in the &consenv;
3793 (<varname>env</varname><literal>['ENV']['PATH']</literal>).
3794 The external environment's path list
3795 (<literal>os.environ['PATH']</literal>)
3796 is used as a fallback if the key
3797 <varname>env</varname><literal>['ENV']['PATH']</literal>
3798 does not exist.
3799 </para>
3800 <para>
3801 On Windows systems, searches for executable
3802 programs with any of the file extensions listed in the
3803 <parameter>pathext</parameter> keyword argument,
3804 or if <constant>None</constant> (the default)
3805 the pathname extensions listed in the &consenv;
3806 (<varname>env</varname><literal>['ENV']['PATHEXT']</literal>).
3807 The external environment's pathname extensions list
3808 (<literal>os.environ['PATHEXT']</literal>)
3809 is used as a fallback if the key
3810 <varname>env</varname><literal>['ENV']['PATHEXT']</literal>
3811 does not exist.
3812 </para>
3813 <para>
3814 When called as a global function, uses the external
3815 environment's path
3816 <literal>os.environ['PATH']</literal>
3817 and path extensions
3818 <literal>os.environ['PATHEXT']</literal>,
3819 respectively, if
3820 <parameter>path</parameter> and
3821 <parameter>pathext</parameter> are
3822 <constant>None</constant>.
3823 </para>
3824 <para>
3825 Will not select any
3826 path name or names
3827 in the optional
3828 <parameter>reject</parameter>
3829 list.
3830 </para>
3832 </summary>
3833 </scons_function>
3835 </sconsdoc>