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 ...
264 { 'BUILDERS': {'_InternalInstall': <function InstallBuilderWrapper at 0x700000>, '_InternalInstallAs': <function InstallAsBuilderWrapper at 0x700000>},
265 'CONFIGUREDIR': '#/.sconf_temp',
266 'CONFIGURELOG': '#/config.log',
267 'CPPSUFFIXES': [ '.c',
287 'Dir': <SCons.Defaults.Variable_Method_Caller instance at 0x700000>,
288 'Dirs': <SCons.Defaults.Variable_Method_Caller instance at 0x700000>,
289 'ENV': {'PATH': '/usr/local/bin:/opt/bin:/bin:/usr/bin'},
290 'ESCAPE': <function escape at 0x700000>,
291 'File': <SCons.Defaults.Variable_Method_Caller instance at 0x700000>,
294 'IDLSUFFIXES': ['.idl', '.IDL'],
295 'INSTALL': <function copyFunc at 0x700000>,
297 'LIBPREFIXES': ['$LIBPREFIX'],
299 'LIBSUFFIXES': ['$LIBSUFFIX', '$SHLIBSUFFIX'],
300 'MAXLINELENGTH': 128072,
306 'PSPAWN': <function piped_env_spawn at 0x700000>,
307 'RDirs': <SCons.Defaults.Variable_Method_Caller instance at 0x700000>,
310 'SHLIBPREFIX': '$LIBPREFIX',
311 'SHLIBSUFFIX': '.so',
312 'SHOBJPREFIX': '$OBJPREFIX',
313 'SHOBJSUFFIX': '$OBJSUFFIX',
314 'SPAWN': <function spawnvpe_spawn at 0x700000>,
317 'TEMPFILE': <class SCons.Platform.TempFileMunge at 0x700000>,
318 'TEMPFILEPREFIX': '@',
319 'TOOLS': ['install', 'install'],
320 '_CPPDEFFLAGS': '${_defines(CPPDEFPREFIX, CPPDEFINES, CPPDEFSUFFIX, __env__)}',
321 '_CPPINCFLAGS': '$( ${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)',
322 '_LIBDIRFLAGS': '$( ${_concat(LIBDIRPREFIX, LIBPATH, LIBDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)',
323 '_LIBFLAGS': '${_concat(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, __env__)}',
324 '__RPATH': '$_RPATH',
325 '_concat': <function _concat at 0x700000>,
326 '_defines': <function _defines at 0x700000>,
327 '_stripixes': <function _stripixes at 0x700000>}
328 scons: done reading SConscript files.
329 scons: Building targets ...
330 scons: `.' is up to date.
331 scons: done building targets.
336 On a Windows system with Visual C++
337 the output might look like:
342 C:\><userinput>scons</userinput>
343 scons: Reading SConscript files ...
345 scons: warning: No installed VCs
346 File "<stdin>", line 67, in __call__
348 scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
349 File "<stdin>", line 67, in __call__
351 scons: warning: No installed VCs
352 File "<stdin>", line 67, in __call__
354 scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
355 File "<stdin>", line 67, in __call__
356 { 'BUILDERS': {'_InternalInstall': <function InstallBuilderWrapper at 0x700000>, 'Object': <SCons.Builder.CompositeBuilder instance at 0x700000>, 'PCH': <SCons.Builder.BuilderBase instance at 0x700000>, 'RES': <SCons.Builder.BuilderBase instance at 0x700000>, 'SharedObject': <SCons.Builder.CompositeBuilder instance at 0x700000>, 'StaticObject': <SCons.Builder.CompositeBuilder instance at 0x700000>, '_InternalInstallAs': <function InstallAsBuilderWrapper at 0x700000>},
358 'CCCOM': <SCons.Action.FunctionAction instance at 0x700000>,
359 'CCFLAGS': ['/nologo'],
360 'CCPCHFLAGS': ['${(PCH and "/Yu%s /Fp%s"%(PCHSTOP or "",File(PCH))) or ""}'],
361 'CCPDBFLAGS': ['${(PDB and "/Z7") or ""}'],
364 'CONFIGUREDIR': '#/.sconf_temp',
365 'CONFIGURELOG': '#/config.log',
366 'CPPDEFPREFIX': '/D',
368 'CPPSUFFIXES': [ '.c',
388 'CXXCOM': '$CXX $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $CXXFLAGS $CCFLAGS $_CCCOMCOM',
389 'CXXFILESUFFIX': '.cc',
390 'CXXFLAGS': ['$(', '/TP', '$)'],
392 'Dir': <SCons.Defaults.Variable_Method_Caller instance at 0x700000>,
393 'Dirs': <SCons.Defaults.Variable_Method_Caller instance at 0x700000>,
394 'ENV': { 'PATH': 'C:/WINDOWS\\System32',
395 'PATHEXT': '.COM;.EXE;.BAT;.CMD',
396 'SystemRoot': 'C:\\WINDOWS'},
397 'ESCAPE': <function escape at 0x700000>,
398 'File': <SCons.Defaults.Variable_Method_Caller instance at 0x700000>,
401 'IDLSUFFIXES': ['.idl', '.IDL'],
404 'INSTALL': <function copyFunc at 0x700000>,
406 'LIBPREFIXES': ['$LIBPREFIX'],
408 'LIBSUFFIXES': ['$LIBSUFFIX'],
409 'MAXLINELENGTH': 2048,
410 'MSVC_SETUP_RUN': True,
413 'PCHCOM': '$CXX /Fo${TARGETS[1]} $CXXFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Yc$PCHSTOP /Fp${TARGETS[0]} $CCPDBFLAGS $PCHPDBFLAGS',
414 'PCHPDBFLAGS': ['${(PDB and "/Yd") or ""}'],
417 'PROGSUFFIX': '.exe',
418 'PSPAWN': <function piped_spawn at 0x700000>,
420 'RCCOM': <SCons.Action.FunctionAction instance at 0x700000>,
422 'RCSUFFIXES': ['.rc', '.rc2'],
423 'RDirs': <SCons.Defaults.Variable_Method_Caller instance at 0x700000>,
426 'SHCCCOM': <SCons.Action.FunctionAction instance at 0x700000>,
427 'SHCCFLAGS': ['$CCFLAGS'],
428 'SHCFLAGS': ['$CFLAGS'],
430 'SHCXXCOM': '$SHCXX $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $SHCXXFLAGS $SHCCFLAGS $_CCCOMCOM',
431 'SHCXXFLAGS': ['$CXXFLAGS'],
434 'SHLIBSUFFIX': '.dll',
435 'SHOBJPREFIX': '$OBJPREFIX',
436 'SHOBJSUFFIX': '$OBJSUFFIX',
437 'SPAWN': <function spawn at 0x700000>,
438 'STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME': 1,
440 'TARGET_OS': 'win32',
441 'TEMPFILE': <class SCons.Platform.TempFileMunge at 0x700000>,
442 'TEMPFILEPREFIX': '@',
443 'TOOLS': ['msvc', 'install', 'install'],
444 '_CCCOMCOM': '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS $CCPCHFLAGS $CCPDBFLAGS',
445 '_CPPDEFFLAGS': '${_defines(CPPDEFPREFIX, CPPDEFINES, CPPDEFSUFFIX, __env__)}',
446 '_CPPINCFLAGS': '$( ${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)',
447 '_LIBDIRFLAGS': '$( ${_concat(LIBDIRPREFIX, LIBPATH, LIBDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)',
448 '_LIBFLAGS': '${_concat(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, __env__)}',
449 '_MSVC_OUTPUT_FLAG': <function msvc_output_flag at 0x700000>,
450 '_concat': <function _concat at 0x700000>,
451 '_defines': <function _defines at 0x700000>,
452 '_stripixes': <function _stripixes at 0x700000>}
453 scons: done reading SConscript files.
454 scons: Building targets ...
455 scons: `.' is up to date.
456 scons: done building targets.
461 The construction environments in these examples have
462 actually been restricted to just gcc and Visual C++,
464 In a real-life situation,
465 the construction environments will
466 likely contain a great many more variables.
467 Also note that we've massaged the example output above
468 to make the memory address of all objects a constant 0x700000.
469 In reality, you would see a different hexadecimal
470 number for each object.
476 To make it easier to see just what you're
478 the &Dump; method allows you to
479 specify a specific constrcution variable
480 that you want to disply.
482 it's not unusual to want to verify
483 the external environment used to execute build commands,
484 to make sure that the PATH and other
485 environment variables are set up the way they should be.
486 You can do this as follows:
492 print env.Dump('ENV')
497 Which might display the following when executed on a POSIX system:
502 % <userinput>scons</userinput>
503 scons: Reading SConscript files ...
504 {'PATH': '/usr/local/bin:/opt/bin:/bin:/usr/bin'}
505 scons: done reading SConscript files.
506 scons: Building targets ...
507 scons: `.' is up to date.
508 scons: done building targets.
513 And the following when executed on a Windows system:
518 C:\><userinput>scons</userinput>
519 scons: Reading SConscript files ...
520 scons: warning: No installed VCs
521 File "<stdin>", line 67, in __call__
523 scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
524 File "<stdin>", line 67, in __call__
526 scons: warning: No installed VCs
527 File "<stdin>", line 67, in __call__
529 scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
530 File "<stdin>", line 67, in __call__
531 { 'PATH': 'C:/WINDOWS\\System32',
532 'PATHEXT': '.COM;.EXE;.BAT;.CMD',
533 'SystemRoot': 'C:\\WINDOWS'}
534 scons: done reading SConscript files.
535 scons: Building targets ...
536 scons: `.' is up to date.
537 scons: done building targets.
544 <title>What Dependencies Does &SCons; Know About? the &tree; Option</title>
548 Sometimes the best way to try to figure out what
549 &SCons; is doing is simply to take a look at the
550 dependency graph that it constructs
551 based on your &SConscript; files.
552 The <literal>--tree</literal> option
553 will display all or part of the
554 &SCons; dependency graph in an
555 "ASCII art" graphical format
556 that shows the dependency hierarchy.
562 For example, given the following input &SConstruct; file:
567 env = Environment(CPPPATH = ['.'])
568 env.Program('prog', ['f1.c', 'f2.c', 'f3.c'])
573 Running &SCons; with the <literal>--tree=all</literal>
579 % <userinput>scons -Q --tree=all</userinput>
580 cc -o f1.o -c -I. f1.c
581 cc -o f2.o -c -I. f2.c
582 cc -o f3.o -c -I. f3.c
583 cc -o prog f1.o f2.o f3.o
613 The tree will also be printed when the
614 <literal>-n</literal> (no execute) option is used,
615 which allows you to examine the dependency graph
616 for a configuration without actually
617 rebuilding anything in the tree.
623 The <literal>--tree</literal> option only prints
624 the dependency graph for the specified targets
625 (or the default target(s) if none are specified on the command line).
626 So if you specify a target like <filename>f2.o</filename>
628 the <literal>--tree</literal> option will only
629 print the dependency graph for that file:
634 % <userinput>scons -Q --tree=all f2.o</userinput>
635 cc -o f2.o -c -I. f2.c
643 This is, of course, useful for
644 restricting the output from a very large
645 build configuration to just a
646 portion in which you're interested.
647 Multiple targets are fine,
648 in which case a tree will be printed
649 for each specified target:
654 % <userinput>scons -Q --tree=all f1.o f3.o</userinput>
655 cc -o f1.o -c -I. f1.c
659 cc -o f3.o -c -I. f3.c
667 The <literal>status</literal> argument may be used
668 to tell &SCons; to print status information about
669 each file in the dependency graph:
674 % <userinput>scons -Q --tree=status</userinput>
675 cc -o f1.o -c -I. f1.c
676 cc -o f2.o -c -I. f2.c
677 cc -o f3.o -c -I. f3.c
678 cc -o prog f1.o f2.o f3.o
680 R = exists in repository only
719 Note that <literal>--tree=all,status</literal> is equivalent;
720 the <literal>all</literal>
721 is assumed if only <literal>status</literal> is present.
722 As an alternative to <literal>all</literal>,
723 you can specify <literal>--tree=derived</literal>
724 to have &SCons; only print derived targets
726 skipping source files
727 (like <filename>.c</filename> and <filename>.h</filename> files):
732 % <userinput>scons -Q --tree=derived</userinput>
733 cc -o f1.o -c -I. f1.c
734 cc -o f2.o -c -I. f2.c
735 cc -o f3.o -c -I. f3.c
736 cc -o prog f1.o f2.o f3.o
749 You can use the <literal>status</literal>
750 modifier with <literal>derived</literal> as well:
755 % <userinput>scons -Q --tree=derived,status</userinput>
756 cc -o f1.o -c -I. f1.c
757 cc -o f2.o -c -I. f2.c
758 cc -o f3.o -c -I. f3.c
759 cc -o prog f1.o f2.o f3.o
761 R = exists in repository only
783 Note that the order of the <literal>--tree=</literal>
784 arguments doesn't matter;
785 <literal>--tree=status,derived</literal> is
786 completely equivalent.
792 The default behavior of the <literal>--tree</literal> option
793 is to repeat all of the dependencies each time the library dependency
794 (or any other dependency file) is encountered in the tree.
795 If certain target files share other target files,
796 such as two programs that use the same library:
801 env = Environment(CPPPATH = ['.'],
804 env.Library('foo', ['f1.c', 'f2.c', 'f3.c'])
805 env.Program('prog1.c')
806 env.Program('prog2.c')
811 Then there can be a <emphasis>lot</emphasis> of repetition in the
812 <literal>--tree=</literal> output:
817 % <userinput>scons -Q --tree=all</userinput>
818 cc -o f1.o -c -I. f1.c
819 cc -o f2.o -c -I. f2.c
820 cc -o f3.o -c -I. f3.c
821 ar rc libfoo.a f1.o f2.o f3.o
823 cc -o prog1.o -c -I. prog1.c
824 cc -o prog1 prog1.o -L. -lfoo
825 cc -o prog2.o -c -I. prog2.c
826 cc -o prog2 prog2.o -L. -lfoo
892 In a large configuration with many internal libraries
894 this can very quickly lead to huge output trees.
895 To help make this more manageable,
896 a <literal>prune</literal> modifier may
897 be added to the option list,
898 in which case &SCons;
899 will print the name of a target that has
900 already been visited during the tree-printing
901 in <literal>[square brackets]</literal>
902 as an indication that the dependencies
903 of the target file may be found
904 by looking farther up the tree:
909 % <userinput>scons -Q --tree=prune</userinput>
910 cc -o f1.o -c -I. f1.c
911 cc -o f2.o -c -I. f2.c
912 cc -o f3.o -c -I. f3.c
913 ar rc libfoo.a f1.o f2.o f3.o
915 cc -o prog1.o -c -I. prog1.c
916 cc -o prog1 prog1.o -L. -lfoo
917 cc -o prog2.o -c -I. prog2.c
918 cc -o prog2 prog2.o -L. -lfoo
956 Like the <literal>status</literal> keyword,
957 the <literal>prune</literal> argument by itself
958 is equivalent to <literal>--tree=all,prune</literal>.
966 <title>How is &SCons; Constructing the Command Lines It Executes? the &debug-presub; Option</title>
970 Sometimes it's useful to look at the
971 pre-substitution string
972 that &SCons; uses to generate
973 the command lines it executes.
974 This can be done with the &debug-presub; option:
982 Have to capture output here, otherwise the - -debug=presub output
983 shows the Python functions from the sconsdoc.py execution wrapper
984 used to generate this manual, not the underlying command-line strings.
986 <scons_output example="presub">
987 <scons_output_command>scons -Q - -debug=presub</scons_output_command>
993 % <userinput>scons -Q --debug=presub</userinput>
994 Building prog.o with action:
995 $CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCOMCOM $SOURCES
996 cc -o prog.o -c -I. prog.c
997 Building prog with action:
1006 <title>Where is &SCons; Searching for Libraries? the &debug-findlibs; Option</title>
1010 To get some insight into what library names
1011 &SCons; is searching for,
1012 and in which directories it is searching,
1013 Use the <literal>--debug=findlibs</literal> option.
1014 Given the following input &SConstruct; file:
1019 env = Environment(LIBPATH = ['libs1', 'libs2'])
1020 env.Program('prog.c', LIBS=['foo', 'bar'])
1025 And the libraries <filename>libfoo.a</filename>
1026 and <filename>libbar.a</filename>
1027 in <filename>libs1</filename> and <filename>libs2</filename>,
1029 use of the <literal>--debug=findlibs</literal> option yields:
1034 % <userinput>scons -Q --debug=findlibs</userinput>
1035 findlibs: looking for 'libfoo.a' in 'libs1' ...
1036 findlibs: ... FOUND 'libfoo.a' in 'libs1'
1037 findlibs: looking for 'libfoo.so' in 'libs1' ...
1038 findlibs: looking for 'libfoo.so' in 'libs2' ...
1039 findlibs: looking for 'libbar.a' in 'libs1' ...
1040 findlibs: looking for 'libbar.a' in 'libs2' ...
1041 findlibs: ... FOUND 'libbar.a' in 'libs2'
1042 findlibs: looking for 'libbar.so' in 'libs1' ...
1043 findlibs: looking for 'libbar.so' in 'libs2' ...
1044 cc -o prog.o -c prog.c
1045 cc -o prog prog.o -Llibs1 -Llibs2 -lfoo -lbar
1054 <title>What Implicit Dependencies Did the &SCons; Scanner find? the &debug-includes; Option</title>
1058 XXX explain the - - debug=includes option
1062 <scons_example name="includes">
1063 <file name="SConstruct" printme="1">
1064 env = Environment(CPPPATH = ['inc1', 'inc2'])
1065 env.Program('prog.c')
1067 <file name="prog.c">
1072 <file name="inc1/file1.h">
1075 <file name="inc2/file2.h">
1080 <scons_output example="includes">
1081 <scons_output_command>scons -Q - - debug=includes prog</scons_output_command>
1090 <title>Where is &SCons; Blowing Up? the &debug-stacktrace; Option</title>
1094 In general, &SCons; tries to keep its error
1095 messages short and informative.
1096 That means we usually try to avoid showing
1097 the stack traces that are familiar
1098 to experienced Python programmers,
1099 since they usually contain much more
1100 information than is useful to most people.
1106 For example, the following &SConstruct; file:
1116 Generates the following error if the
1117 <filename>prog.c</filename> file
1123 % <userinput>scons -Q</userinput>
1124 scons: *** [prog.o] Source `prog.c' not found, needed by target `prog.o'.
1130 the error is pretty obvious.
1132 and you wanted to try to get more information
1134 the &debug-stacktrace; option
1135 would show you exactly where in the &SCons; source code
1141 % <userinput>scons -Q --debug=stacktrace</userinput>
1142 scons: *** [prog.o] Source `prog.c' not found, needed by target `prog.o'.
1143 scons: internal stack trace:
1144 File "bootstrap/src/engine/SCons/Job.py", line 197, in start
1146 File "bootstrap/src/engine/SCons/Script/Main.py", line 167, in prepare
1147 File "bootstrap/src/engine/SCons/Taskmaster.py", line 190, in prepare
1148 File "bootstrap/src/engine/SCons/Executor.py", line 397, in prepare
1153 Of course, if you do need to dive into the &SCons; source code,
1154 we'd like to know if, or how,
1155 the error messages or troubleshooting options
1156 could have been improved to avoid that.
1157 Not everyone has the necessary time or
1158 Python skill to dive into the source code,
1159 and we'd like to improve &SCons;
1160 for those people as well...
1168 <title>How is &SCons; Making Its Decisions? the &taskmastertrace; Option</title>
1172 The internal &SCons; subsystem that handles walking
1173 the dependency graph
1174 and controls the decision-making about what to rebuild
1175 is the <literal>Taskmaster</literal>.
1176 &SCons; supports a <literal>--taskmastertrace</literal>
1177 option that tells the Taskmaster to print
1178 information about the children (dependencies)
1179 of the various Nodes on its walk down the graph,
1180 which specific dependent Nodes are being evaluated,
1187 The <literal>--taskmastertrace</literal> option
1188 takes as an argument the name of a file in
1189 which to put the trace output,
1190 with <filename>-</filename> (a single hyphen)
1191 indicating that the trace messages
1192 should be printed to the standard output:
1197 env = Environment(CPPPATH = ['.'])
1198 env.Program('prog.c')
1202 % <userinput>scons -Q --taskmastertrace=- prog</userinput>
1204 Taskmaster: Looking for a node to evaluate
1205 Taskmaster: Considering node <no_state 0 'prog'> and its children:
1206 Taskmaster: <no_state 0 'prog.o'>
1207 Taskmaster: adjusted ref count: <pending 1 'prog'>, child 'prog.o'
1208 Taskmaster: Considering node <no_state 0 'prog.o'> and its children:
1209 Taskmaster: <no_state 0 'prog.c'>
1210 Taskmaster: <no_state 0 'inc.h'>
1211 Taskmaster: adjusted ref count: <pending 1 'prog.o'>, child 'prog.c'
1212 Taskmaster: adjusted ref count: <pending 2 'prog.o'>, child 'inc.h'
1213 Taskmaster: Considering node <no_state 0 'prog.c'> and its children:
1214 Taskmaster: Evaluating <pending 0 'prog.c'>
1216 Task.make_ready_current(): node <pending 0 'prog.c'>
1217 Task.prepare(): node <up_to_date 0 'prog.c'>
1218 Task.executed_with_callbacks(): node <up_to_date 0 'prog.c'>
1219 Task.postprocess(): node <up_to_date 0 'prog.c'>
1220 Task.postprocess(): removing <up_to_date 0 'prog.c'>
1221 Task.postprocess(): adjusted parent ref count <pending 1 'prog.o'>
1223 Taskmaster: Looking for a node to evaluate
1224 Taskmaster: Considering node <no_state 0 'inc.h'> and its children:
1225 Taskmaster: Evaluating <pending 0 'inc.h'>
1227 Task.make_ready_current(): node <pending 0 'inc.h'>
1228 Task.prepare(): node <up_to_date 0 'inc.h'>
1229 Task.executed_with_callbacks(): node <up_to_date 0 'inc.h'>
1230 Task.postprocess(): node <up_to_date 0 'inc.h'>
1231 Task.postprocess(): removing <up_to_date 0 'inc.h'>
1232 Task.postprocess(): adjusted parent ref count <pending 0 'prog.o'>
1234 Taskmaster: Looking for a node to evaluate
1235 Taskmaster: Considering node <pending 0 'prog.o'> and its children:
1236 Taskmaster: <up_to_date 0 'prog.c'>
1237 Taskmaster: <up_to_date 0 'inc.h'>
1238 Taskmaster: Evaluating <pending 0 'prog.o'>
1240 Task.make_ready_current(): node <pending 0 'prog.o'>
1241 Task.prepare(): node <executing 0 'prog.o'>
1242 Task.execute(): node <executing 0 'prog.o'>
1243 cc -o prog.o -c -I. prog.c
1244 Task.executed_with_callbacks(): node <executing 0 'prog.o'>
1245 Task.postprocess(): node <executed 0 'prog.o'>
1246 Task.postprocess(): removing <executed 0 'prog.o'>
1247 Task.postprocess(): adjusted parent ref count <pending 0 'prog'>
1249 Taskmaster: Looking for a node to evaluate
1250 Taskmaster: Considering node <pending 0 'prog'> and its children:
1251 Taskmaster: <executed 0 'prog.o'>
1252 Taskmaster: Evaluating <pending 0 'prog'>
1254 Task.make_ready_current(): node <pending 0 'prog'>
1255 Task.prepare(): node <executing 0 'prog'>
1256 Task.execute(): node <executing 0 'prog'>
1258 Task.executed_with_callbacks(): node <executing 0 'prog'>
1259 Task.postprocess(): node <executed 0 'prog'>
1261 Taskmaster: Looking for a node to evaluate
1262 Taskmaster: No candidate anymore.
1267 The <literal>--taskmastertrace</literal> option
1268 doesn't provide information about the actual
1269 calculations involved in deciding if a file is up-to-date,
1270 but it does show all of the dependencies
1271 it knows about for each Node,
1272 and the order in which those dependencies are evaluated.
1273 This can be useful as an alternate way to determine
1274 whether or not your &SCons; configuration,
1275 or the implicit dependency scan,
1276 has actually identified all the correct dependencies
1287 <title>Where Are My Build Bottlenecks? the &profile; Option</title>
1291 XXX explain the - - profile= option
1302 <title>Troubleshooting Shared Caching: the &cache-debug; Option</title>
1306 XXX describe the - - cache-debug option
1307 XXX maybe point to the caching.in chapter?