5 Permission is hereby granted, free of charge, to any person obtaining
6 a copy of this software and associated documentation files (the
7 "Software"), to deal in the Software without restriction, including
8 without limitation the rights to use, copy, modify, merge, publish,
9 distribute, sublicense, and/or sell copies of the Software, and to
10 permit persons to whom the Software is furnished to do so, subject to
11 the following conditions:
13 The above copyright notice and this permission notice shall be included
14 in all copies or substantial portions of the Software.
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
17 KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
18 WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 The experience of configuring any
29 software build tool to build a large code base
30 usually, at some point,
31 involves trying to figure out why
32 the tool is behaving a certain way,
33 and how to get it to behave the way you want.
34 &SCons; is no different.
35 This appendix contains a number of
36 different ways in which you can
37 get some additional insight into &SCons;' behavior.
43 Note that we're always interested in trying to
44 improve how you can troubleshoot configuration problems.
45 If you run into a problem that has
46 you scratching your head,
47 and which there just doesn't seem to be a good way to debug,
48 odds are pretty good that someone else will run into
49 the same problem, too.
50 If so, please let the SCons development team know
51 (preferably by filing a bug report
52 or feature request at our project pages at tigris.org)
53 so that we can use your feedback
54 to try to come up with a better way to help you,
55 and others, get the necessary insight into &SCons; behavior
56 to help identify and fix configuration issues.
61 <title>Why is That Target Being Rebuilt? the &debug-explain; Option</title>
65 Let's look at a simple example of
67 that causes a target to be rebuilt
68 every time &SCons; is run:
73 # Intentionally misspell the output file name in the
74 # command used to create the file:
75 Command('file.out', 'file.in', 'cp $SOURCE file.oout')
80 (Note to Windows users: The POSIX &cp; command
81 copies the first file named on the command line
83 In our example, it copies the &file_in; file
84 to the &file_out; file.)
90 Now if we run &SCons; multiple times on this example,
91 we see that it re-runs the &cp;
97 % <userinput>scons -Q</userinput>
99 % <userinput>scons -Q</userinput>
101 % <userinput>scons -Q</userinput>
108 the underlying cause is obvious:
109 we've intentionally misspelled the output file name
111 so the command doesn't actually
112 build the &file_out; file that we've told &SCons; to expect.
113 But if the problem weren't obvious,
115 to specify the &debug-explain; option
117 to have &SCons; tell us very specifically
118 why it's decided to rebuild the target:
123 % <userinput>scons -Q --debug=explain</userinput>
124 scons: building `file.out' because it doesn't exist
130 If this had been a more complicated example
131 involving a lot of build output,
132 having &SCons; tell us that
133 it's trying to rebuild the target file
134 because it doesn't exist
135 would be an important clue
136 that something was wrong with
137 the command that we invoked to build it.
143 The &debug-explain; option also comes in handy
144 to help figure out what input file changed.
145 Given a simple configuration that builds
146 a program from three source files,
147 changing one of the source files
148 and rebuilding with the &debug-explain;
149 option shows very specifically
150 why &SCons; rebuilds the files that it does:
157 % <userinput>scons -Q</userinput>
158 cc -o file1.o -c file1.c
159 cc -o file2.o -c file2.c
160 cc -o file3.o -c file3.c
161 cc -o prog file1.o file2.o file3.o
162 % <userinput>edit file2.c</userinput>
163 [CHANGE THE CONTENTS OF file2.c]
164 % <userinput>scons -Q --debug=explain</userinput>
165 scons: rebuilding `file2.o' because `file2.c' changed
166 cc -o file2.o -c file2.c
167 scons: rebuilding `prog' because `file2.o' changed
168 cc -o prog file1.o file2.o file3.o
173 This becomes even more helpful
174 in identifying when a file is rebuilt
175 due to a change in an implicit dependency,
176 such as an incuded <filename>.h</filename> file.
177 If the <filename>file1.c</filename>
178 and <filename>file3.c</filename> files
180 both included a &hello_h; file,
181 then changing that included file
182 and re-running &SCons; with the &debug-explain; option
183 will pinpoint that it's the change to the included file
184 that starts the chain of rebuilds:
191 % <userinput>scons -Q</userinput>
192 cc -o file1.o -c -I. file1.c
193 cc -o file2.o -c -I. file2.c
194 cc -o file3.o -c -I. file3.c
195 cc -o prog file1.o file2.o file3.o
196 % <userinput>edit hello.h</userinput>
197 [CHANGE THE CONTENTS OF hello.h]
198 % <userinput>scons -Q --debug=explain</userinput>
199 scons: rebuilding `file1.o' because `hello.h' changed
200 cc -o file1.o -c -I. file1.c
201 scons: rebuilding `file3.o' because `hello.h' changed
202 cc -o file3.o -c -I. file3.c
203 scons: rebuilding `prog' because:
206 cc -o prog file1.o file2.o file3.o
211 (Note that the &debug-explain; option will only tell you
212 why &SCons; decided to rebuild necessary targets.
213 It does not tell you what files it examined
214 when deciding <emphasis>not</emphasis>
215 to rebuild a target file,
216 which is often a more valuable question to answer.)
223 <title>What's in That Construction Environment? the &Dump; Method</title>
227 When you create a construction environment,
229 with construction variables that are set up
230 for various compilers, linkers and utilities
231 that it finds on your system.
232 Although this is usually helpful and what you want,
233 it might be frustrating if &SCons;
234 doesn't set certain variables that you
236 In situations like this,
237 it's sometimes helpful to use the
238 construction environment &Dump; method
239 to print all or some of
240 the construction variables.
241 Note that the &Dump; method
242 <emphasis>returns</emphasis>
243 the representation of the variables
245 for you to print (or otherwise manipulate):
256 On a POSIX system with gcc installed,
262 % <userinput>scons</userinput>
263 scons: Reading SConscript files ...
265 'CONFIGUREDIR': '#/.sconf_temp',
266 'CONFIGURELOG': '#/config.log',
267 'CPPSUFFIXES': [ '.c',
287 'Dir': <SCons.Defaults.Variable_Method_Caller instance at 0xb7c3fdac>,
288 'Dirs': <SCons.Defaults.Variable_Method_Caller instance at 0xb7c3fdcc>,
289 'ENV': {'PATH': '/usr/local/bin:/opt/bin:/bin:/usr/bin'},
290 'ESCAPE': <function escape at 0xb7ba1f0c>,
291 'File': <SCons.Defaults.Variable_Method_Caller instance at 0xb7c3fdec>,
292 'IDLSUFFIXES': ['.idl', '.IDL'],
293 'INSTALL': <function installFunc at 0xb7c4317c>,
294 'INSTALLSTR': <function installStr at 0xb7c431b4>,
295 'LATEXSUFFIXES': ['.tex', '.ltx', '.latex'],
297 'LIBPREFIXES': '$LIBPREFIX',
299 'LIBSUFFIXES': ['$LIBSUFFIX', '$SHLIBSUFFIX'],
300 'MAXLINELENGTH': 128072,
306 'PSPAWN': <function piped_env_spawn at 0xb7bb12cc>,
307 'RDirs': <SCons.Defaults.Variable_Method_Caller instance at 0xb7c3fe0c>,
310 'SHLIBPREFIX': '$LIBPREFIX',
311 'SHLIBSUFFIX': '.so',
312 'SHOBJPREFIX': '$OBJPREFIX',
313 'SHOBJSUFFIX': '$OBJSUFFIX',
314 'SPAWN': <function spawnvpe_spawn at 0xb7ba1d4c>,
315 'TEMPFILE': <class SCons.Platform.TempFileMunge at 0xb7bce89c>,
316 'TEMPFILEPREFIX': '@',
318 '_CPPDEFFLAGS': '${_defines(CPPDEFPREFIX, CPPDEFINES, CPPDEFSUFFIX, __env__)}',
319 '_CPPINCFLAGS': '$( ${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)',
320 '_LIBDIRFLAGS': '$( ${_concat(LIBDIRPREFIX, LIBPATH, LIBDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)',
321 '_LIBFLAGS': '${_concat(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, __env__)}',
322 '__RPATH': '$_RPATH',
323 '_concat': <function _concat at 0xb7c43224>,
324 '_defines': <function _defines at 0xb7c432cc>,
325 '_installStr': <function installStr at 0xb7c431b4>,
326 '_stripixes': <function _stripixes at 0xb7c43294>}
327 scons: done reading SConscript files.
328 scons: Building targets ...
329 scons: `.' is up to date.
330 scons: done building targets.
335 On a Windows system with Visual C++
336 the output might look like:
341 C:\><userinput>scons</userinput>
342 scons: Reading SConscript files ...
343 { 'BUILDERS': {'Object': <SCons.Builder.CompositeBuilder instance at 0xb7b6354c>, 'SharedObject': <SCons.Builder.CompositeBuilder instance at 0xb7b636cc>, 'StaticObject': <SCons.Builder.CompositeBuilder instance at 0xb7b6354c>, 'PCH': <SCons.Builder.BuilderBase instance at 0xb7bd6e8c>, 'RES': <SCons.Builder.BuilderBase instance at 0xb7b5b9ec>},
345 'CCCOM': <SCons.Action.FunctionAction instance at 0xb7b63b6c>,
346 'CCCOMFLAGS': '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo$TARGET $CCPCHFLAGS $CCPDBFLAGS',
347 'CCFLAGS': ['/nologo'],
348 'CCPCHFLAGS': ['${(PCH and "/Yu%s /Fp%s"%(PCHSTOP or "",File(PCH))) or ""}'],
349 'CCPDBFLAGS': ['${(PDB and "/Z7") or ""}'],
352 'CONFIGUREDIR': '#/.sconf_temp',
353 'CONFIGURELOG': '#/config.log',
354 'CPPDEFPREFIX': '/D',
356 'CPPSUFFIXES': [ '.c',
376 'CXXCOM': '$CXX $CXXFLAGS $CCCOMFLAGS',
377 'CXXFILESUFFIX': '.cc',
378 'CXXFLAGS': ['$CCFLAGS', '$(', '/TP', '$)'],
380 'Dir': <SCons.Defaults.Variable_Method_Caller instance at 0xb7c5adac>,
381 'Dirs': <SCons.Defaults.Variable_Method_Caller instance at 0xb7c5adcc>,
382 'ENV': { 'INCLUDE': 'C:\\Program Files\\Microsoft Visual Studio/VC98\\include',
383 'LIB': 'C:\\Program Files\\Microsoft Visual Studio/VC98\\lib',
384 'PATH': 'C:\\Program Files\\Microsoft Visual Studio\\Common\\tools\\WIN95;C:\\Program Files\\Microsoft Visual Studio\\Common\\MSDev98\\bin;C:\\Program Files\\Microsoft Visual Studio\\Common\\tools;C:\\Program Files\\Microsoft Visual Studio/VC98\\bin',
385 'PATHEXT': '.COM;.EXE;.BAT;.CMD',
386 'SystemRoot': 'C:/WINDOWS'},
387 'ESCAPE': <function escape at 0xb7bcf454>,
388 'File': <SCons.Defaults.Variable_Method_Caller instance at 0xb7c5adec>,
389 'IDLSUFFIXES': ['.idl', '.IDL'],
392 'INSTALL': <function installFunc at 0xb7c5e17c>,
393 'INSTALLSTR': <function installStr at 0xb7c5e1b4>,
394 'LATEXSUFFIXES': ['.tex', '.ltx', '.latex'],
396 'LIBPREFIXES': ['$LIBPREFIX'],
398 'LIBSUFFIXES': ['$LIBSUFFIX'],
399 'MAXLINELENGTH': 2048,
400 'MSVS': {'VERSION': '6.0', 'VERSIONS': ['6.0']},
401 'MSVS_VERSION': '6.0',
404 'PCHCOM': '$CXX $CXXFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo${TARGETS[1]} /Yc$PCHSTOP /Fp${TARGETS[0]} $CCPDBFLAGS $PCHPDBFLAGS',
405 'PCHPDBFLAGS': ['${(PDB and "/Yd") or ""}'],
408 'PROGSUFFIX': '.exe',
409 'PSPAWN': <function piped_spawn at 0xb7bcf3ac>,
411 'RCCOM': '$RC $_CPPDEFFLAGS $_CPPINCFLAGS $RCFLAGS /fo$TARGET $SOURCES',
413 'RDirs': <SCons.Defaults.Variable_Method_Caller instance at 0xb7c5ae0c>,
416 'SHCCCOM': <SCons.Action.FunctionAction instance at 0xb7b63bcc>,
417 'SHCCFLAGS': ['$CCFLAGS'],
418 'SHCFLAGS': ['$CFLAGS'],
420 'SHCXXCOM': '$SHCXX $SHCXXFLAGS $CCCOMFLAGS',
421 'SHCXXFLAGS': ['$CXXFLAGS'],
424 'SHLIBSUFFIX': '.dll',
425 'SHOBJPREFIX': '$OBJPREFIX',
426 'SHOBJSUFFIX': '$OBJSUFFIX',
427 'SPAWN': <function spawn at 0xb7bcf41c>,
428 'STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME': 1,
429 'TEMPFILE': <class SCons.Platform.TempFileMunge at 0xb7be989c>,
430 'TEMPFILEPREFIX': '@',
432 '_CPPDEFFLAGS': '${_defines(CPPDEFPREFIX, CPPDEFINES, CPPDEFSUFFIX, __env__)}',
433 '_CPPINCFLAGS': '$( ${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)',
434 '_LIBDIRFLAGS': '$( ${_concat(LIBDIRPREFIX, LIBPATH, LIBDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)',
435 '_LIBFLAGS': '${_concat(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, __env__)}',
436 '_concat': <function _concat at 0xb7c5e224>,
437 '_defines': <function _defines at 0xb7c5e2cc>,
438 '_installStr': <function installStr at 0xb7c5e1b4>,
439 '_stripixes': <function _stripixes at 0xb7c5e294>}
440 scons: done reading SConscript files.
441 scons: Building targets ...
442 scons: `.' is up to date.
443 scons: done building targets.
448 The construction environments in these examples have
449 actually been restricted to just gcc and Visual C++,
451 In a real-life situation,
452 the construction environments will
453 likely contain a great many more variables.
459 To make it easier to see just what you're
461 the &Dump; method allows you to
462 specify a specific constrcution variable
463 that you want to disply.
465 it's not unusual to want to verify
466 the external environment used to execute build commands,
467 to make sure that the PATH and other
468 environment variables are set up the way they should be.
469 You can do this as follows:
475 print env.Dump('ENV')
480 Which might display the following when executed on a POSIX system:
485 % <userinput>scons</userinput>
486 scons: Reading SConscript files ...
487 {'PATH': '/usr/local/bin:/opt/bin:/bin:/usr/bin'}
488 scons: done reading SConscript files.
489 scons: Building targets ...
490 scons: `.' is up to date.
491 scons: done building targets.
496 And the following when executed on a Windows system:
501 C:\><userinput>scons</userinput>
502 scons: Reading SConscript files ...
503 { 'INCLUDE': 'C:\\Program Files\\Microsoft Visual Studio/VC98\\include',
504 'LIB': 'C:\\Program Files\\Microsoft Visual Studio/VC98\\lib',
505 'PATH': 'C:\\Program Files\\Microsoft Visual Studio\\Common\\tools\\WIN95;C:\\Program Files\\Microsoft Visual Studio\\Common\\MSDev98\\bin;C:\\Program Files\\Microsoft Visual Studio\\Common\\tools;C:\\Program Files\\Microsoft Visual Studio/VC98\\bin',
506 'PATHEXT': '.COM;.EXE;.BAT;.CMD',
507 'SystemRoot': 'C:/WINDOWS'}
508 scons: done reading SConscript files.
509 scons: Building targets ...
510 scons: `.' is up to date.
511 scons: done building targets.
518 <title>What Dependencies Does &SCons; Know About? the &tree; Option</title>
522 Sometimes the best way to try to figure out what
523 &SCons; is doing is simply to take a look at the
524 dependency graph that it constructs
525 based on your &SConscript; files.
526 The <literal>--tree</literal> option
527 will display all or part of the
528 &SCons; dependency graph in an
529 "ASCII art" graphical format
530 that shows the dependency hierarchy.
536 For example, given the following input &SConstruct; file:
541 env = Environment(CPPPATH = ['.'])
542 env.Program('prog', ['f1.c', 'f2.c', 'f3.c'])
547 Running &SCons; with the <literal>--tree=all</literal>
553 % <userinput>scons -Q --tree=all</userinput>
554 cc -o f1.o -c -I. f1.c
555 cc -o f2.o -c -I. f2.c
556 cc -o f3.o -c -I. f3.c
557 cc -o prog f1.o f2.o f3.o
588 The tree will also be printed when the
589 <literal>-n</literal> (no execute) option is used,
590 which allows you to examine the dependency graph
591 for a configuration without actually
592 rebuilding anything in the tree.
598 The <literal>--tree</literal> option only prints
599 the dependency graph for the specified targets
600 (or the default target(s) if none are specified on the command line).
601 So if you specify a target like <filename>f2.o</filename>
603 the <literal>--tree</literal> option will only
604 print the dependency graph for that file:
609 % <userinput>scons -Q --tree=all f2.o</userinput>
610 cc -o f2.o -c -I. f2.c
618 This is, of course, useful for
619 restricting the output from a very large
620 build configuration to just a
621 portion in which you're interested.
622 Multiple targets are fine,
623 in which case a tree will be printed
624 for each specified target:
629 % <userinput>scons -Q --tree=all f1.o f3.o</userinput>
630 cc -o f1.o -c -I. f1.c
634 cc -o f3.o -c -I. f3.c
642 The <literal>status</literal> argument may be used
643 to tell &SCons; to print status information about
644 each file in the dependency graph:
649 % <userinput>scons -Q --tree=status</userinput>
650 cc -o f1.o -c -I. f1.c
651 cc -o f2.o -c -I. f2.c
652 cc -o f3.o -c -I. f3.c
653 cc -o prog f1.o f2.o f3.o
655 R = exists in repository only
695 Note that <literal>--tree=all,status</literal> is equivalent;
696 the <literal>all</literal>
697 is assumed if only <literal>status</literal> is present.
698 As an alternative to <literal>all</literal>,
699 you can specify <literal>--tree=derived</literal>
700 to have &SCons; only print derived targets
702 skipping source files
703 (like <filename>.c</filename> and <filename>.h</filename> files):
708 % <userinput>scons -Q --tree=derived</userinput>
709 cc -o f1.o -c -I. f1.c
710 cc -o f2.o -c -I. f2.c
711 cc -o f3.o -c -I. f3.c
712 cc -o prog f1.o f2.o f3.o
718 You can use the <literal>status</literal>
719 modifier with <literal>derived</literal> as well:
724 % <userinput>scons -Q --tree=derived,status</userinput>
725 cc -o f1.o -c -I. f1.c
726 cc -o f2.o -c -I. f2.c
727 cc -o f3.o -c -I. f3.c
728 cc -o prog f1.o f2.o f3.o
730 R = exists in repository only
752 Note that the order of the <literal>--tree=</literal>
753 arguments doesn't matter;
754 <literal>--tree=status,derived</literal> is
755 completely equivalent.
761 The default behavior of the <literal>--tree</literal> option
762 is to repeat all of the dependencies each time the library dependency
763 (or any other dependency file) is encountered in the tree.
764 If certain target files share other target files,
765 such as two programs that use the same library:
770 env = Environment(CPPPATH = ['.'],
773 env.Library('foo', ['f1.c', 'f2.c', 'f3.c'])
774 env.Program('prog1.c')
775 env.Program('prog2.c')
780 Then there can be a <emphasis>lot</emphasis> of repetition in the
781 <literal>--tree=</literal> output:
786 % <userinput>scons -Q --tree=all</userinput>
787 cc -o f1.o -c -I. f1.c
788 cc -o f2.o -c -I. f2.c
789 cc -o f3.o -c -I. f3.c
790 ar rc libfoo.a f1.o f2.o f3.o
792 cc -o prog1.o -c -I. prog1.c
793 cc -o prog1 prog1.o -L. -lfoo
794 cc -o prog2.o -c -I. prog2.c
795 cc -o prog2 prog2.o -L. -lfoo
862 In a large configuration with many internal libraries
864 this can very quickly lead to huge output trees.
865 To help make this more manageable,
866 a <literal>prune</literal> modifier may
867 be added to the option list,
868 in which case &SCons;
869 will print the name of a target that has
870 already been visited during the tree-printing
871 in <literal>[square brackets]</literal>
872 as an indication that the dependencies
873 of the target file may be found
874 by looking farther up the tree:
879 % <userinput>scons -Q --tree=prune</userinput>
880 cc -o f1.o -c -I. f1.c
881 cc -o f2.o -c -I. f2.c
882 cc -o f3.o -c -I. f3.c
883 ar rc libfoo.a f1.o f2.o f3.o
885 cc -o prog1.o -c -I. prog1.c
886 cc -o prog1 prog1.o -L. -lfoo
887 cc -o prog2.o -c -I. prog2.c
888 cc -o prog2 prog2.o -L. -lfoo
927 Like the <literal>status</literal> keyword,
928 the <literal>prune</literal> argument by itself
929 is equivalent to <literal>--tree=all,prune</literal>.
937 <title>How is &SCons; Constructing the Command Lines It Executes? the &debug-presub; Option</title>
941 Sometimes it's useful to look at the
942 pre-substitution string
943 that &SCons; uses to generate
944 the command lines it executes.
945 This can be done with the &debug-presub; option:
953 Have to capture output here, otherwise the - -debug=presub output
954 shows the Python functions from the sconsdoc.py execution wrapper
955 used to generate this manual, not the underlying command-line strings.
957 <scons_output example="presub">
958 <scons_output_command>scons -Q - -debug=presub</scons_output_command>
964 % <userinput>scons -Q --debug=presub</userinput>
965 Building prog.o with action:
966 $CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCOMCOM $SOURCES
967 cc -o prog.o -c -I. prog.c
968 Building prog with action:
977 <title>Where is &SCons; Searching for Libraries? the &debug-findlibs; Option</title>
981 To get some insight into what library names
982 &SCons; is searching for,
983 and in which directories it is searching,
984 Use the <literal>--debug=findlibs</literal> option.
985 Given the following input &SConstruct; file:
990 env = Environment(LIBPATH = ['libs1', 'libs2'])
991 env.Program('prog.c', LIBS=['foo', 'bar'])
996 And the libraries <filename>libfoo.a</filename>
997 and <filename>libbar.a</filename>
998 in <filename>libs1</filename> and <filename>libs2</filename>,
1000 use of the <literal>--debug=findlibs</literal> option yields:
1005 % <userinput>scons -Q --debug=findlibs</userinput>
1006 findlibs: looking for 'libfoo.a' in 'libs1' ...
1007 findlibs: ... FOUND 'libfoo.a' in 'libs1'
1008 findlibs: looking for 'libfoo.so' in 'libs1' ...
1009 findlibs: looking for 'libfoo.so' in 'libs2' ...
1010 findlibs: looking for 'libbar.a' in 'libs1' ...
1011 findlibs: looking for 'libbar.a' in 'libs2' ...
1012 findlibs: ... FOUND 'libbar.a' in 'libs2'
1013 findlibs: looking for 'libbar.so' in 'libs1' ...
1014 findlibs: looking for 'libbar.so' in 'libs2' ...
1015 cc -o prog.o -c prog.c
1016 cc -o prog prog.o -Llibs1 -Llibs2 -lfoo -lbar
1025 <title>What Implicit Dependencies Did the &SCons; Scanner find? the &debug-includes; Option</title>
1029 XXX explain the - - debug=includes option
1033 <scons_example name="includes">
1034 <file name="SConstruct" printme="1">
1035 env = Environment(CPPPATH = ['inc1', 'inc2'])
1036 env.Program('prog.c')
1038 <file name="prog.c">
1043 <file name="inc1/file1.h">
1046 <file name="inc2/file2.h">
1051 <scons_output example="includes">
1052 <scons_output_command>scons -Q - - debug=includes prog</scons_output_command>
1061 <title>Where is &SCons; Blowing Up? the &debug-stacktrace; Option</title>
1065 In general, &SCons; tries to keep its error
1066 messages short and informative.
1067 That means we usually try to avoid showing
1068 the stack traces that are familiar
1069 to experienced Python programmers,
1070 since they usually contain much more
1071 information than is useful to most people.
1077 For example, the following &SConstruct; file:
1087 Generates the following error if the
1088 <filename>prog.c</filename> file
1094 % <userinput>scons -Q</userinput>
1095 scons: *** Source `prog.c' not found, needed by target `prog.o'. Stop.
1101 the error is pretty obvious.
1103 and you wanted to try to get more information
1105 the &debug-stacktrace; option
1106 would show you exactly where in the &SCons; source code
1112 % <userinput>scons -Q --debug=stacktrace</userinput>
1113 scons: *** Source `prog.c' not found, needed by target `prog.o'. Stop.
1114 scons: internal stack trace:
1115 File "/home/knight/SCons/scons.0.96.C763/bootstrap/src/engine/SCons/Job.py", line 111, in start
1117 File "/home/knight/SCons/scons.0.96.C763/bootstrap/src/engine/SCons/Taskmaster.py", line 166, in prepare
1119 File "/home/knight/SCons/scons.0.96.C763/bootstrap/src/engine/SCons/Node/FS.py", line 2137, in prepare
1120 SCons.Node.Node.prepare(self)
1121 File "/home/knight/SCons/scons.0.96.C763/bootstrap/src/engine/SCons/Node/__init__.py", line 806, in prepare
1122 raise SCons.Errors.StopError, desc
1127 Of course, if you do need to dive into the &SCons; source code,
1128 we'd like to know if, or how,
1129 the error messages or troubleshooting options
1130 could have been improved to avoid that.
1131 Not everyone has the necessary time or
1132 Python skill to dive into the source code,
1133 and we'd like to improve &SCons;
1134 for those people as well...
1142 <title>How is &SCons; Making Its Decisions? the &taskmastertrace; Option</title>
1146 The internal &SCons; subsystem that handles walking
1147 the dependency graph
1148 and controls the decision-making about what to rebuild
1149 is the <literal>Taskmaster</literal>.
1150 &SCons; supports a <literal>--taskmastertrace</literal>
1151 option that tells the Taskmaster to print
1152 information about the children (dependencies)
1153 of the various Nodes on its walk down the graph,
1154 which specific dependent Nodes are being evaluated,
1161 The <literal>--taskmastertrace</literal> option
1162 takes as an argument the name of a file in
1163 which to put the trace output,
1164 with <filename>-</filename> (a single hyphen)
1165 indicating that the trace messages
1166 should be printed to the standard output:
1171 env = Environment(CPPPATH = ['.'])
1172 env.Program('prog.c')
1176 % <userinput>scons -Q --taskmastertrace=- prog</userinput>
1177 Taskmaster: 'prog': children:
1179 waiting on unstarted children:
1181 Taskmaster: 'prog.o': children:
1184 cc -o prog.o -c -I. prog.c
1185 Taskmaster: 'prog': children:
1189 Taskmaster: 'prog': already handled (executed)
1194 The <literal>--taskmastertrace</literal> option
1195 doesn't provide information about the actual
1196 calculations involved in deciding if a file is up-to-date,
1197 but it does show all of the dependencies
1198 it knows about for each Node,
1199 and the order in which those dependencies are evaluated.
1200 This can be useful as an alternate way to determine
1201 whether or not your &SCons; configuration,
1202 or the implicit dependency scan,
1203 has actually identified all the correct dependencies
1214 <title>Where Are My Build Bottlenecks? the &profile; Option</title>
1218 XXX explain the - - profile= option
1229 <title>Troubleshooting Shared Caching: the &cache-debug; Option</title>
1233 XXX describe the - - cache-debug option
1234 XXX maybe point to the caching.in chapter?