summaryrefslogtreecommitdiffstats
path: root/doc/user
diff options
context:
space:
mode:
authorWilliam Deegan <bill@baddogconsulting.com>2010-01-19 05:59:03 (GMT)
committerWilliam Deegan <bill@baddogconsulting.com>2010-01-19 05:59:03 (GMT)
commitbf296710383d7b1a744b62a007041c677583ad6a (patch)
tree60cc1567364d74f85e24f866952e799167288f49 /doc/user
parent3d4e4224d0a2b66cd0a9896cac16a785b2629f4c (diff)
downloadSCons-bf296710383d7b1a744b62a007041c677583ad6a.zip
SCons-bf296710383d7b1a744b62a007041c677583ad6a.tar.gz
SCons-bf296710383d7b1a744b62a007041c677583ad6a.tar.bz2
Merge back from checkpoint.
Need to regenerate the .xml files.
Diffstat (limited to 'doc/user')
-rw-r--r--doc/user/add-method.xml41
-rw-r--r--doc/user/alias.xml10
-rw-r--r--doc/user/builders-built-in.xml223
-rw-r--r--doc/user/builders-commands.xml59
-rw-r--r--doc/user/builders-writing.xml957
-rw-r--r--doc/user/builders.xml57
-rw-r--r--doc/user/caching.xml506
-rw-r--r--doc/user/command-line.xml145
-rw-r--r--doc/user/depends.xml13
-rw-r--r--doc/user/environments.xml23
-rw-r--r--doc/user/less-simple.xml12
-rw-r--r--doc/user/libraries.xml24
-rw-r--r--doc/user/nodes.xml12
-rw-r--r--doc/user/output.xml12
-rw-r--r--doc/user/parseconfig.xml26
-rw-r--r--doc/user/parseflags.xml12
-rw-r--r--doc/user/simple.xml36
-rw-r--r--doc/user/troubleshoot.xml30
-rw-r--r--doc/user/variants.xml12
19 files changed, 350 insertions, 1860 deletions
diff --git a/doc/user/add-method.xml b/doc/user/add-method.xml
index d4a484e..8e078fd 100644
--- a/doc/user/add-method.xml
+++ b/doc/user/add-method.xml
@@ -56,7 +56,7 @@
<screen>
% <userinput>scons -Q /</userinput>
- cc -o hello.o -c hello.c
+ [?1034hcc -o hello.o -c hello.c
cc -o hello hello.o
Install file: "hello" as "/usr/bin/hello"
Install file: "hello" as "install/bin/hello"
@@ -100,7 +100,7 @@
<screen>
% <userinput>scons -Q</userinput>
- cc -o test_stuff.o -c test_stuff.c
+ [?1034hcc -o test_stuff.o -c test_stuff.c
cc -o tests/test_stuff test_stuff.o
</screen>
@@ -110,9 +110,40 @@
<screen>
C:\><userinput>scons -Q</userinput>
- rc /fores.res res.rc
- cl /Fotest_stuff.obj /c test_stuff.c /nologo
- link /nologo /OUT:tests\test_stuff.exe test_stuff.obj res.res
+ IndexError: list index out of range:
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Script\Main.py", line 1294:
+ _exec_main(parser, values)
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Script\Main.py", line 1259:
+ _main(parser)
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Script\Main.py", line 929:
+ SCons.Script._SConscript._SConscript(fs, script)
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Script\SConscript.py", line 179:
+ exec sys.stdin in call_stack[-1].globals
+ File "&lt;stdin&gt;", line 219:
+ None
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Script\SConscript.py", line 614:
+ env = self.factory()
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Script\SConscript.py", line 594:
+ default_env = SCons.Defaults.DefaultEnvironment()
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Defaults.py", line 91:
+ _default_env = apply(SCons.Environment.Environment, args, kw)
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Environment.py", line 1004:
+ apply_tools(self, tools, toolpath)
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Environment.py", line 106:
+ env.Tool(tool)
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Environment.py", line 1703:
+ tool(self)
+ File "&lt;stdin&gt;", line 67:
+ None
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Tool\msvc.py", line 239:
+ mssdk.generate(env)
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Tool\mssdk.py", line 41:
+ mssdk_setup_env(env)
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Tool\MSCommon\sdk.py", line 298:
+ mssdk = get_default_sdk()
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Tool\MSCommon\sdk.py", line 262:
+ return InstalledSDKList[0]
+ [?1034h
</screen>
<para>
diff --git a/doc/user/alias.xml b/doc/user/alias.xml
index f285d70..9c4a179 100644
--- a/doc/user/alias.xml
+++ b/doc/user/alias.xml
@@ -46,7 +46,7 @@
<screen>
% <userinput>scons -Q install</userinput>
- cc -o hello.o -c hello.c
+ [?1034hcc -o hello.o -c hello.c
cc -o hello hello.o
Install file: "hello" as "/usr/bin/hello"
</screen>
@@ -86,23 +86,23 @@
<screen>
% <userinput>scons -Q install-bin</userinput>
- cc -o foo.o -c foo.c
+ [?1034hcc -o foo.o -c foo.c
cc -o foo foo.o
Install file: "foo" as "/usr/bin/foo"
% <userinput>scons -Q install-lib</userinput>
- cc -o bar.o -c bar.c
+ [?1034hcc -o bar.o -c bar.c
ar rc libbar.a bar.o
ranlib libbar.a
Install file: "libbar.a" as "/usr/lib/libbar.a"
% <userinput>scons -Q -c /</userinput>
- Removed foo.o
+ [?1034hRemoved foo.o
Removed foo
Removed /usr/bin/foo
Removed bar.o
Removed libbar.a
Removed /usr/lib/libbar.a
% <userinput>scons -Q install</userinput>
- cc -o foo.o -c foo.c
+ [?1034hcc -o foo.o -c foo.c
cc -o foo foo.o
Install file: "foo" as "/usr/bin/foo"
cc -o bar.o -c bar.c
diff --git a/doc/user/builders-built-in.xml b/doc/user/builders-built-in.xml
index 738683b..cb7fb70 100644
--- a/doc/user/builders-built-in.xml
+++ b/doc/user/builders-built-in.xml
@@ -144,7 +144,7 @@
<screen>
% <userinput>scons -Q</userinput>
- cc -o goodbye.o -c goodbye.c
+ [?1034hcc -o goodbye.o -c goodbye.c
cc -o hello.o -c hello.c
cc -o hello hello.o goodbye.o -L/usr/dir1 -Ldir2 -lfoo1 -lfoo2
</screen>
@@ -157,9 +157,40 @@
<screen>
C:\><userinput>scons -Q</userinput>
- cl /Fogoodbye.obj /c goodbye.c /nologo
- cl /Fohello.obj /c hello.c /nologo
- link /nologo /OUT:hello.exe /LIBPATH:\usr\dir1 /LIBPATH:dir2 foo1.lib foo2.lib hello.obj goodbye.obj
+ IndexError: list index out of range:
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Script\Main.py", line 1294:
+ _exec_main(parser, values)
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Script\Main.py", line 1259:
+ _main(parser)
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Script\Main.py", line 929:
+ SCons.Script._SConscript._SConscript(fs, script)
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Script\SConscript.py", line 179:
+ exec sys.stdin in call_stack[-1].globals
+ File "&lt;stdin&gt;", line 219:
+ None
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Script\SConscript.py", line 614:
+ env = self.factory()
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Script\SConscript.py", line 594:
+ default_env = SCons.Defaults.DefaultEnvironment()
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Defaults.py", line 91:
+ _default_env = apply(SCons.Environment.Environment, args, kw)
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Environment.py", line 1004:
+ apply_tools(self, tools, toolpath)
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Environment.py", line 106:
+ env.Tool(tool)
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Environment.py", line 1703:
+ tool(self)
+ File "&lt;stdin&gt;", line 67:
+ None
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Tool\msvc.py", line 239:
+ mssdk.generate(env)
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Tool\mssdk.py", line 41:
+ mssdk_setup_env(env)
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Tool\MSCommon\sdk.py", line 298:
+ mssdk = get_default_sdk()
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Tool\MSCommon\sdk.py", line 262:
+ return InstalledSDKList[0]
+ [?1034h
</screen>
<para>
@@ -727,7 +758,7 @@
<screen>
% <userinput>scons -Q .</userinput>
- tar -c -f out1.tar file1 file2
+ [?1034htar -c -f out1.tar file1 file2
tar -c -f out2.tar directory
</screen>
@@ -753,185 +784,3 @@
<screen>
% <userinput>scons -Q .</userinput>
- tar -c -z -f out.tar.gz directory
- </screen>
-
- <para>
-
- you may also wish to set the value of the
- &cv-link-TARSUFFIX; construction variable
- to your desired suffix for compress &tar; archives,
- so that &SCons; can append it to the target file name
- without your having to specify it explicitly:
-
- </para>
-
- <programlisting>
- env = Environment(TARFLAGS = '-c -z',
- TARSUFFIX = '.tgz')
- env.Tar('out', 'directory')
- </programlisting>
-
- <screen>
- % <userinput>scons -Q .</userinput>
- tar -c -z -f out.tgz directory
- </screen>
-
- </section>
-
- <section>
- <title>The &Zip; Builder</title>
-
- <para>
-
- The &b-link-Zip; Builder object creates archives of files
- and/or directory trees in the ZIP file format.
- Python versions 1.6 or later
- contain an internal &zipfile; module
- that &SCons; will use.
- In this case, given the following
- &SConstruct; file:
-
- </para>
-
- <programlisting>
- env = Environment()
- env.Zip('out', ['file1', 'file2'])
- </programlisting>
-
- <para>
-
- Your output will reflect the fact
- that an internal Python function
- is being used to create the output ZIP archive:
-
- </para>
-
- <screen>
- % <userinput>scons -Q .</userinput>
- zip(["out.zip"], ["file1", "file2"])
- </screen>
-
- <para>
-
- If you're using Python version 1.5.2 to run &SCons;,
- then &SCons; will try to use an external
- &zip; program as follows:
-
- </para>
-
- <screen>
- % <userinput>scons -Q .</userinput>
- zip /home/my/project/zip.out file1 file2
- </screen>
-
- </section>
-
- </section>
-
- <section>
- <title>Java</title>
-
- <para>
-
- &SCons; provides Builder objects
- for creating various types of Java output files.
-
- </para>
-
- <section>
- <title>Building Class Files: the &Java; Builder</title>
-
- <para>
-
- The &b-link-Java; builder takes one or more input
- <filename>.java</filename> files
- and turns them into one or more
- <filename>.class</filename> files
- Unlike most builders, however,
- the &Java; builder takes
- target and source <emphasis>directories</emphasis>,
- not files, as input.
-
- </para>
-
- <programlisting>
- env = Environment()
- env.Java(target = 'classes', source = 'src')
- </programlisting>
-
- <para>
-
- The &Java; builder will then
- search the specified source directory
- tree for all <filename>.java</filename> files,
- and pass any out-of-date
-
- </para>
-
- <screen>
- XXX Java() screen
- </screen>
-
- </section>
-
- <section>
- <title>The &Jar; Builder</title>
-
- <para>
-
- XXX The &Jar; builder object
-
- </para>
-
- <programlisting>
- env = Environment()
- env.Java(target = 'classes', source = 'src')
- env.Jar(target = '', source = 'classes')
- </programlisting>
-
- <screen>
- XXX Jar() screen
- </screen>
-
- </section>
-
- <section>
- <title>Building C header and stub files: the &JavaH; Builder</title>
-
- <para>
-
- XXX JavaH() para
-
- </para>
-
- <programlisting>
- XXX JavaH() programlisting
- </programlisting>
-
- <screen>
- XXX JavaH() screen
- </screen>
-
- </section>
-
- <section>
- <title>Building RMI stub and skeleton class files: the &RMIC; Builder</title>
-
- <para>
-
- XXX RMIC() para
-
- </para>
-
- <programlisting>
- XXX RMIC() programlisting
- </programlisting>
-
- <screen>
- XXX RMIC() screen
- </screen>
-
- </section>
-
- </section>
diff --git a/doc/user/builders-commands.xml b/doc/user/builders-commands.xml
index fcb2a96..23fe4ce 100644
--- a/doc/user/builders-commands.xml
+++ b/doc/user/builders-commands.xml
@@ -85,62 +85,3 @@
<screen>
% <userinput>scons -Q</userinput>
- sed 's/x/y/' &lt; foo.in &gt; foo.out
- </screen>
-
- <para>
-
- This is often more convenient than
- creating a &Builder; object
- and adding it to the &cv-link-BUILDERS; variable
- of a &consenv;
-
- </para>
-
- <para>
-
- Note that the action you specify to the
- &Command; &Builder; can be any legal &SCons; &Action;,
- such as a Python function:
-
- </para>
-
- <programlisting>
- env = Environment()
- def build(target, source, env):
- # Whatever it takes to build
- return None
- env.Command('foo.out', 'foo.in', build)
- </programlisting>
-
- <para>
-
- Which executes as follows:
-
- </para>
-
- <screen>
- % <userinput>scons -Q</userinput>
- build(["foo.out"], ["foo.in"])
- </screen>
-
- <para>
-
- Note that &cv-link-SOURCE; and &cv-link-TARGET; are expanded
- in the source and target as well as of SCons 1.1,
- so you can write:
-
- </para>
-
- <programlisting>
- env.Command('${SOURCE.basename}.out', 'foo.in', build)
- </programlisting>
-
-
- <para>
-
- which does the same thing as the previous example, but allows you
- to avoid repeating yourself.
-
- </para>
-
diff --git a/doc/user/builders-writing.xml b/doc/user/builders-writing.xml
index 3932181..e69de29 100644
--- a/doc/user/builders-writing.xml
+++ b/doc/user/builders-writing.xml
@@ -1,957 +0,0 @@
-<!--
-
- __COPYRIGHT__
-
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- "Software"), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to
- permit persons to whom the Software is furnished to do so, subject to
- the following conditions:
-
- The above copyright notice and this permission notice shall be included
- in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
- KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
- WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
--->
-
-<!--
-
-=head2 Adding new methods
-
-For slightly more demanding changes, you may wish to add new methods to the
-C<cons> package. Here's an example of a very simple extension,
-C<InstallScript>, which installs a tcl script in a requested location, but
-edits the script first to reflect a platform-dependent path that needs to be
-installed in the script:
-
- # cons::InstallScript - Create a platform dependent version of a shell
- # script by replacing string ``#!your-path-here'' with platform specific
- # path $BIN_DIR.
-
- sub cons::InstallScript {
- my ($env, $dst, $src) = @_;
- Command $env $dst, $src, qq(
- sed s+your-path-here+$BIN_DIR+ %< > %>
- chmod oug+x %>
- );
- }
-
-Notice that this method is defined directly in the C<cons> package (by
-prefixing the name with C<cons::>). A change made in this manner will be
-globally visible to all environments, and could be called as in the
-following example:
-
- InstallScript $env "$BIN/foo", "foo.tcl";
-
-For a small improvement in generality, the C<BINDIR> variable could be
-passed in as an argument or taken from the construction environment-,-as
-C<%BINDIR>.
-
-
-=head2 Overriding methods
-
-Instead of adding the method to the C<cons> name space, you could define a
-new package which inherits existing methods from the C<cons> package and
-overrides or adds others. This can be done using Perl's inheritance
-mechanisms.
-
-The following example defines a new package C<cons::switch> which
-overrides the standard C<Library> method. The overridden method builds
-linked library modules, rather than library archives. A new
-constructor is provided. Environments created with this constructor
-will have the new library method; others won't.
-
- package cons::switch;
- BEGIN {@ISA = 'cons'}
-
- sub new {
- shift;
- bless new cons(@_);
- }
-
- sub Library {
- my($env) = shift;
- my($lib) = shift;
- my(@objs) = Objects $env @_;
- Command $env $lib, @objs, q(
- %LD -r %LDFLAGS %< -o %>
- );
- }
-
-This functionality could be invoked as in the following example:
-
- $env = new cons::switch(@overrides);
- ...
- Library $env 'lib.o', 'foo.c', 'bar.c';
-
--->
-
- <para>
-
- Although &SCons; provides many useful methods
- for building common software products:
- programs, libraries, documents.
- you frequently want to be
- able to build some other type of file
- not supported directly by &SCons;.
- Fortunately, &SCons; makes it very easy
- to define your own &Builder; objects
- for any custom file types you want to build.
- (In fact, the &SCons; interfaces for creating
- &Builder; objects are flexible enough and easy enough to use
- that all of the the &SCons; built-in &Builder; objects
- are created the mechanisms described in this section.)
-
- </para>
-
- <section>
- <title>Writing Builders That Execute External Commands</title>
-
- <para>
-
- The simplest &Builder; to create is
- one that executes an external command.
- For example, if we want to build
- an output file by running the contents
- of the input file through a command named
- <literal>foobuild</literal>,
- creating that &Builder; might look like:
-
- </para>
-
- <programlisting>
- bld = Builder(action = 'foobuild < $SOURCE > $TARGET')
- </programlisting>
-
- <para>
-
- All the above line does is create a free-standing
- &Builder; object.
- The next section will show us how to actually use it.
-
- </para>
-
- </section>
-
- <section>
- <title>Attaching a Builder to a &ConsEnv;</title>
-
- <para>
-
- A &Builder; object isn't useful
- until it's attached to a &consenv;
- so that we can call it to arrange
- for files to be built.
- This is done through the &cv-link-BUILDERS;
- &consvar; in an environment.
- The &cv-BUILDERS; variable is a Python dictionary
- that maps the names by which you want to call
- various &Builder; objects to the objects themselves.
- For example, if we want to call the
- &Builder; we just defined by the name
- <function>Foo</function>,
- our &SConstruct; file might look like:
-
- </para>
-
-
-
- <programlisting>
- bld = Builder(action = 'foobuild < $SOURCE > $TARGET')
- env = Environment(BUILDERS = {'Foo' : bld})
- </programlisting>
-
- <para>
-
- With the &Builder; attached to our &consenv;
- with the name <function>Foo</function>,
- we can now actually call it like so:
-
- </para>
-
- <programlisting>
- env.Foo('file.foo', 'file.input')
- </programlisting>
-
- <para>
-
- Then when we run &SCons; it looks like:
-
- </para>
-
- <screen>
- % <userinput>scons -Q</userinput>
- foobuild &lt; file.input &gt; file.foo
- </screen>
-
- <para>
-
- Note, however, that the default &cv-BUILDERS;
- variable in a &consenv;
- comes with a default set of &Builder; objects
- already defined:
- &b-link-Program;, &b-link-Library;, etc.
- And when we explicitly set the &cv-BUILDERS; variable
- when we create the &consenv;,
- the default &Builder;s are no longer part of
- the environment:
-
- </para>
-
- <!--
- The ToolSurrogate stuff that's used to capture output initializes
- SCons.Defaults.ConstructionEnvironment with its own list of TOOLS.
- In this next example, we want to show the user that when they
- set the BUILDERS explicitly, the call to env.Program() generates
- an AttributeError. This won't happen with all of the default
- ToolSurrogates in the default construction environment. To make the
- AttributeError show up, we have to overwite the default construction
- environment's TOOLS variable so Program() builder doesn't show up.
-
- We do this by executing a slightly different SConstruct file than the
- one we print in the guide, with two extra statements at the front
- that overwrite the TOOLS variable as described. Note that we have
- to jam those statements on to the first line to keep the line number
- in the generated error consistent with what the user will see in the
- User's Guide.
- -->
- <programlisting>
- bld = Builder(action = 'foobuild &lt; $SOURCE &gt; $TARGET')
- env = Environment(BUILDERS = {'Foo' : bld})
- env.Foo('file.foo', 'file.input')
- env.Program('hello.c')
- </programlisting>
-
- <screen>
- % <userinput>scons -Q</userinput>
- AttributeError: SConsEnvironment instance has no attribute 'Program':
- File "/home/my/project/SConstruct", line 4:
- env.Program('hello.c')
- </screen>
-
- <para>
-
- To be able to use both our own defined &Builder; objects
- and the default &Builder; objects in the same &consenv;,
- you can either add to the &cv-BUILDERS; variable
- using the &Append; function:
-
- </para>
-
-
-
- <programlisting>
- env = Environment()
- bld = Builder(action = 'foobuild < $SOURCE > $TARGET')
- env.Append(BUILDERS = {'Foo' : bld})
- env.Foo('file.foo', 'file.input')
- env.Program('hello.c')
- </programlisting>
-
- <para>
-
- Or you can explicitly set the appropriately-named
- key in the &cv-BUILDERS; dictionary:
-
- </para>
-
- <programlisting>
- env = Environment()
- bld = Builder(action = 'foobuild < $SOURCE > $TARGET')
- env['BUILDERS']['Foo'] = bld
- env.Foo('file.foo', 'file.input')
- env.Program('hello.c')
- </programlisting>
-
- <para>
-
- Either way, the same &consenv;
- can then use both the newly-defined
- <function>Foo</function> &Builder;
- and the default &b-link-Program; &Builder;:
-
- </para>
-
- <screen>
- % <userinput>scons -Q</userinput>
- foobuild &lt; file.input &gt; file.foo
- cc -o hello.o -c hello.c
- cc -o hello hello.o
- </screen>
-
- </section>
-
- <section>
- <title>Letting &SCons; Handle The File Suffixes</title>
-
- <para>
-
- By supplying additional information
- when you create a &Builder;,
- you can let &SCons; add appropriate file
- suffixes to the target and/or the source file.
- For example, rather than having to specify
- explicitly that you want the <literal>Foo</literal>
- &Builder; to build the <literal>file.foo</literal>
- target file from the <literal>file.input</literal> source file,
- you can give the <literal>.foo</literal>
- and <literal>.input</literal> suffixes to the &Builder;,
- making for more compact and readable calls to
- the <literal>Foo</literal> &Builder;:
-
- </para>
-
-
-
- <programlisting>
- bld = Builder(action = 'foobuild < $SOURCE > $TARGET',
- suffix = '.foo',
- src_suffix = '.input')
- env = Environment(BUILDERS = {'Foo' : bld})
- env.Foo('file1')
- env.Foo('file2')
- </programlisting>
-
- <screen>
- % <userinput>scons -Q</userinput>
- foobuild &lt; file1.input &gt; file1.foo
- foobuild &lt; file2.input &gt; file2.foo
- </screen>
-
- <para>
-
- You can also supply a <literal>prefix</literal> keyword argument
- if it's appropriate to have &SCons; append a prefix
- to the beginning of target file names.
-
- </para>
-
- </section>
-
- <section>
- <title>Builders That Execute Python Functions</title>
-
- <para>
-
- In &SCons;, you don't have to call an external command
- to build a file.
- You can, instead, define a Python function
- that a &Builder; object can invoke
- to build your target file (or files).
- Such a &buildfunc; definition looks like:
-
- </para>
-
- <programlisting>
- def build_function(target, source, env):
- # Code to build "target" from "source"
- return None
- </programlisting>
-
- <para>
-
- The arguments of a &buildfunc; are:
-
- </para>
-
- <variablelist>
-
- <varlistentry>
- <term>target</term>
-
- <listitem>
- <para>
-
- A list of Node objects representing
- the target or targets to be
- built by this builder function.
- The file names of these target(s)
- may be extracted using the Python &str; function.
-
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>source</term>
-
- <listitem>
- <para>
-
- A list of Node objects representing
- the sources to be
- used by this builder function to build the targets.
- The file names of these source(s)
- may be extracted using the Python &str; function.
-
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>env</term>
-
- <listitem>
- <para>
-
- The &consenv; used for building the target(s).
- The builder function may use any of the
- environment's construction variables
- in any way to affect how it builds the targets.
-
- </para>
- </listitem>
- </varlistentry>
-
- </variablelist>
-
- <para>
-
- The builder function must
- return a <literal>0</literal> or <literal>None</literal> value
- if the target(s) are built successfully.
- The builder function
- may raise an exception
- or return any non-zero value
- to indicate that the build is unsuccessful,
-
- </para>
-
- <para>
-
- Once you've defined the Python function
- that will build your target file,
- defining a &Builder; object for it is as
- simple as specifying the name of the function,
- instead of an external command,
- as the &Builder;'s
- <literal>action</literal>
- argument:
-
- </para>
-
- <programlisting>
- def build_function(target, source, env):
- # Code to build "target" from "source"
- return None
- bld = Builder(action = build_function,
- suffix = '.foo',
- src_suffix = '.input')
- env = Environment(BUILDERS = {'Foo' : bld})
- env.Foo('file')
- </programlisting>
-
- <para>
-
- And notice that the output changes slightly,
- reflecting the fact that a Python function,
- not an external command,
- is now called to build the target file:
-
- </para>
-
- <screen>
- % <userinput>scons -Q</userinput>
- build_function(["file.foo"], ["file.input"])
- </screen>
-
- </section>
-
- <section>
- <title>Builders That Create Actions Using a &Generator;</title>
-
- <para>
-
- &SCons; Builder objects can create an action "on the fly"
- by using a function called a &generator;.
- This provides a great deal of flexibility to
- construct just the right list of commands
- to build your target.
- A &generator; looks like:
-
- </para>
-
- <programlisting>
- def generate_actions(source, target, env, for_signature):
- return 'foobuild < %s > %s' % (target[0], source[0])
- </programlisting>
-
- <para>
-
- The arguments of a &generator; are:
-
- </para>
-
- <variablelist>
-
- <varlistentry>
- <term>source</term>
-
- <listitem>
- <para>
-
- A list of Node objects representing
- the sources to be built
- by the command or other action
- generated by this function.
- The file names of these source(s)
- may be extracted using the Python &str; function.
-
- </para>
- </listitem>
-
- </varlistentry>
-
- <varlistentry>
- <term>target</term>
-
- <listitem>
- <para>
-
- A list of Node objects representing
- the target or targets to be built
- by the command or other action
- generated by this function.
- The file names of these target(s)
- may be extracted using the Python &str; function.
-
- </para>
- </listitem>
-
- </varlistentry>
-
- <varlistentry>
- <term>env</term>
-
- <listitem>
- <para>
-
- The &consenv; used for building the target(s).
- The generator may use any of the
- environment's construction variables
- in any way to determine what command
- or other action to return.
-
- </para>
- </listitem>
-
- </varlistentry>
-
- <varlistentry>
- <term>for_signature</term>
-
- <listitem>
- <para>
-
- A flag that specifies whether the
- generator is being called to contribute to a build signature,
- as opposed to actually executing the command.
-
- <!-- XXX NEED MORE HERE, describe generators use in signatures -->
-
- </para>
- </listitem>
-
- </varlistentry>
-
- </variablelist>
-
- <para>
-
- The &generator; must return a
- command string or other action that will be used to
- build the specified target(s) from the specified source(s).
-
- </para>
-
- <para>
-
- Once you've defined a &generator;,
- you create a &Builder; to use it
- by specifying the generator keyword argument
- instead of <literal>action</literal>.
-
- </para>
-
-
-
- <programlisting>
- def generate_actions(source, target, env, for_signature):
- return 'foobuild < %s > %s' % (source[0], target[0])
- bld = Builder(generator = generate_actions,
- suffix = '.foo',
- src_suffix = '.input')
- env = Environment(BUILDERS = {'Foo' : bld})
- env.Foo('file')
- </programlisting>
-
- <screen>
- % <userinput>scons -Q</userinput>
- foobuild &lt; file.input &gt; file.foo
- </screen>
-
- <para>
-
- Note that it's illegal to specify both an
- <literal>action</literal>
- and a
- <literal>generator</literal>
- for a &Builder;.
-
- </para>
-
- </section>
-
- <section>
- <title>Builders That Modify the Target or Source Lists Using an &Emitter;</title>
-
- <para>
-
- &SCons; supports the ability for a Builder to modify the
- lists of target(s) from the specified source(s).
- You do this by defining an &emitter; function
- that takes as its arguments
- the list of the targets passed to the builder,
- the list of the sources passed to the builder,
- and the construction environment.
- The emitter function should return the modified
- lists of targets that should be built
- and sources from which the targets will be built.
-
- </para>
-
- <para>
-
- For example, suppose you want to define a Builder
- that always calls a <filename>foobuild</filename> program,
- and you want to automatically add
- a new target file named
- <filename>new_target</filename>
- and a new source file named
- <filename>new_source</filename>
- whenever it's called.
- The &SConstruct; file might look like this:
-
- </para>
-
-
-
- <programlisting>
- def modify_targets(target, source, env):
- target.append('new_target')
- source.append('new_source')
- return target, source
- bld = Builder(action = 'foobuild $TARGETS - $SOURCES',
- suffix = '.foo',
- src_suffix = '.input',
- emitter = modify_targets)
- env = Environment(BUILDERS = {'Foo' : bld})
- env.Foo('file')
- </programlisting>
-
- <para>
-
- And would yield the following output:
-
- </para>
-
- <screen>
- % <userinput>scons -Q</userinput>
- foobuild file.foo new_target - file.input new_source
- </screen>
-
- <para>
-
- One very flexible thing that you can do is
- use a construction variable to specify
- different emitter functions for different
- construction variable.
- To do this, specify a string
- containing a construction variable
- expansion as the emitter when you call
- the &Builder; function,
- and set that construction variable to
- the desired emitter function
- in different construction environments:
-
- </para>
-
- <programlisting>
- bld = Builder(action = 'my_command $SOURCES &gt; $TARGET',
- suffix = '.foo',
- src_suffix = '.input',
- emitter = '$MY_EMITTER')
- def modify1(target, source, env):
- return target, source + ['modify1.in']
- def modify2(target, source, env):
- return target, source + ['modify2.in']
- env1 = Environment(BUILDERS = {'Foo' : bld},
- MY_EMITTER = modify1)
- env2 = Environment(BUILDERS = {'Foo' : bld},
- MY_EMITTER = modify2)
- env1.Foo('file1')
- env2.Foo('file2')
- import os
- env1['ENV']['PATH'] = env2['ENV']['PATH'] + os.pathsep + os.getcwd()
- env2['ENV']['PATH'] = env2['ENV']['PATH'] + os.pathsep + os.getcwd()
-
-
- </programlisting>
-
- <programlisting>
- bld = Builder(action = 'my_command $SOURCES > $TARGET',
- suffix = '.foo',
- src_suffix = '.input',
- emitter = '$MY_EMITTER')
- def modify1(target, source, env):
- return target, source + ['modify1.in']
- def modify2(target, source, env):
- return target, source + ['modify2.in']
- env1 = Environment(BUILDERS = {'Foo' : bld},
- MY_EMITTER = modify1)
- env2 = Environment(BUILDERS = {'Foo' : bld},
- MY_EMITTER = modify2)
- env1.Foo('file1')
- env2.Foo('file2')
-
- </programlisting>
-
- <para>
-
- In this example, the <filename>modify1.in</filename>
- and <filename>modify2.in</filename> files
- get added to the source lists
- of the different commands:
-
- </para>
-
- <screen>
- % <userinput>scons -Q</userinput>
- my_command file1.input modify1.in &gt; file1.foo
- my_command file2.input modify2.in &gt; file2.foo
- </screen>
-
- </section>
-
- <!--
-
- <section>
- <title>target_factor=, source_factory=</title>
-
- </section>
-
- <section>
- <title>target_scanner=, source_scanner=</title>
-
- </section>
-
- <section>
- <title>multi=</title>
-
- </section>
-
- <section>
- <title>single_source=</title>
-
- </section>
-
- <section>
- <title>src_builder=</title>
-
- </section>
-
- <section>
- <title>ensure_suffix=</title>
-
- </section>
-
- -->
-
- <section>
- <title>Where To Put Your Custom Builders and Tools</title>
-
- <para>
-
- The <filename>site_scons</filename> directory gives you a place to
- put Python modules you can import into your &SConscript; files
- (<filename>site_scons</filename>),
- add-on tools that can integrate into &SCons;
- (<filename>site_scons/site_tools</filename>),
- and a <filename>site_scons/site_init.py</filename> file that
- gets read before any &SConstruct; or &SConscript; file,
- allowing you to change &SCons;'s default behavior.
-
- </para>
-
- <para>
-
- If you get a tool from somewhere (the &SCons; wiki or a third party,
- for instance) and you'd like to use it in your project, the
- <filename>site_scons</filename> dir is the simplest place to put it.
- Tools come in two flavors; either a Python function that operates on
- an &Environment; or a Python file containing two functions,
- <function>exists()</function> and <function>generate()</function>.
-
- </para>
-
- <para>
-
- A single-function Tool can just be included in your
- <filename>site_scons/site_init.py</filename> file where it will be
- parsed and made available for use. For instance, you could have a
- <filename>site_scons/site_init.py</filename> file like this:
-
- </para>
-
- <programlisting>
- def TOOL_ADD_HEADER(env):
- """A Tool to add a header from $HEADER to the source file"""
- add_header = Builder(action=['echo "$HEADER" &gt; $TARGET',
- 'cat $SOURCE &gt;&gt; $TARGET'])
- env.Append(BUILDERS = {'AddHeader' : add_header})
- env['HEADER'] = '' # set default value
- </programlisting>
-
- <para>
-
- and a &SConstruct; like this:
-
- </para>
-
- <programlisting>
- # Use TOOL_ADD_HEADER from site_scons/site_init.py
- env=Environment(tools=['default', TOOL_ADD_HEADER], HEADER="=====")
- env.AddHeader('tgt', 'src')
- </programlisting>
-
- <para>
-
- The <function>TOOL_ADD_HEADER</function> tool method will be
- called to add the <function>AddHeader</function> tool to the
- environment.
-
- </para>
-
- <!--
- <scons_output example="site1" os="posix">
- <scons_output_command>scons -Q</scons_output_command>
- </scons_output>
- -->
-
- <para>
- Similarly, a more full-fledged tool with
- <function>exists()</function> and <function>generate()</function>
- methods can be installed in
- <filename>site_scons/site_tools/toolname.py</filename>. Since
- <filename>site_scons/site_tools</filename> is automatically added
- to the head of the tool search path, any tool found there will be
- available to all environments. Furthermore, a tool found there
- will override a built-in tool of the same name, so if you need to
- change the behavior of a built-in tool, site_scons gives you the
- hook you need.
- </para>
-
- <para>
- Many people have a library of utility Python functions they'd like
- to include in &SConscript;s; just put that module in
- <filename>site_scons/my_utils.py</filename> or any valid Python module name of your
- choice. For instance you can do something like this in
- <filename>site_scons/my_utils.py</filename> to add
- <function>build_id</function> and <function>MakeWorkDir</function>
- functions:
- </para>
-
- <programlisting>
- from SCons.Script import * # for Execute and Mkdir
- def build_id():
- """Return a build ID (stub version)"""
- return "100"
- def MakeWorkDir(workdir):
- """Create the specified dir immediately"""
- Execute(Mkdir(workdir))
- </programlisting>
-
- <para>
-
- And then in your &SConscript; or any sub-&SConscript; anywhere in
- your build, you can import <filename>my_utils</filename> and use it:
-
- </para>
-
- <programlisting>
- import my_utils
- print "build_id=" + my_utils.build_id()
- my_utils.MakeWorkDir('/tmp/work')
- </programlisting>
-
- <para>
- Note that although you can put this library in
- <filename>site_scons/site_init.py</filename>,
- it is no better there than <filename>site_scons/my_utils.py</filename>
- since you still have to import that module into your &SConscript;.
- Also note that in order to refer to objects in the SCons namespace
- such as &Environment; or &Mkdir; or &Execute; in any file other
- than a &SConstruct; or &SConscript; you always need to do
- </para>
- <programlisting>
- from SCons.Script import *
- </programlisting>
-
- <para>
- This is true in modules in <filename>site_scons</filename> such as
- <filename>site_scons/site_init.py</filename> as well.
- </para>
-
- <para>
-
- If you have a machine-wide site dir you'd like to use instead of
- <filename>./site_scons</filename>, use the
- <literal>--site-dir</literal> option to point to your dir.
- <filename>site_init.py</filename> and
- <filename>site_tools</filename> will be located under that dir.
- To avoid using a <filename>site_scons</filename> dir at all, even
- if it exists, use the <literal>--no-site-dir</literal> option.
-
- </para>
-
- </section>
-
-
- <!--
-
- <section>
- <title>Builders That Use Other Builders</title>
-
- <para>
-
- XXX para
-
- </para>
-
- <scons_example name="ex8">
- <file name="SConstruct" printme="1">
- env = Environment()
- #env.SourceCode('.', env.BitKeeper('my_command'))
- env.Program('hello.c')
- </file>
- <file name="hello.c">
- hello.c
- </file>
- </scons_example>
-
- <scons_output example="ex8">
- <scons_output_command>scons -Q</scons_output_command>
- </scons_output>
-
- </section>
-
- -->
diff --git a/doc/user/builders.xml b/doc/user/builders.xml
index f3989ef..e69de29 100644
--- a/doc/user/builders.xml
+++ b/doc/user/builders.xml
@@ -1,57 +0,0 @@
-<!--
-
- __COPYRIGHT__
-
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- "Software"), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to
- permit persons to whom the Software is furnished to do so, subject to
- the following conditions:
-
- The above copyright notice and this permission notice shall be included
- in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
- KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
- WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
--->
-
-<!--
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
-"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
-
-<refentry id="Command">
-
-<refmeta>
-<refentrytitle>Command</refentrytitle>
-</refmeta>
-
-<methodsynopsis>
- <methodname>env.Command</methodname>
- <methodparam>foo</methodparam>
- <methodparam>bar</methodparam>
-</methodsynopsis>
-
-</refentry>
--->
-
-<para>
-
-This appendix contains descriptions of all of the
-Builders that are <emphasis>potentially</emphasis>
-available "out of the box" in this version of SCons.
-
-</para>
-
-<variablelist>
-
-&builders-gen;
-
-</variablelist>
diff --git a/doc/user/caching.xml b/doc/user/caching.xml
index 2348d32..e69de29 100644
--- a/doc/user/caching.xml
+++ b/doc/user/caching.xml
@@ -1,506 +0,0 @@
-<!--
-
- __COPYRIGHT__
-
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- "Software"), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to
- permit persons to whom the Software is furnished to do so, subject to
- the following conditions:
-
- The above copyright notice and this permission notice shall be included
- in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
- KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
- WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
--->
-
- <para>
-
- On multi-developer software projects,
- you can sometimes speed up every developer's builds a lot by
- allowing them to share the derived files that they build.
- &SCons; makes this easy, as well as reliable.
-
- </para>
-
- <section>
- <title>Specifying the Shared Cache Directory</title>
-
- <para>
-
- To enable sharing of derived files,
- use the &CacheDir; function
- in any &SConscript; file:
-
- </para>
-
- <programlisting>
- CacheDir('/usr/local/build_cache')
- </programlisting>
-
- <para>
-
- Note that the directory you specify must already exist
- and be readable and writable by all developers
- who will be sharing derived files.
- It should also be in some central location
- that all builds will be able to access.
- In environments where developers are using separate systems
- (like individual workstations) for builds,
- this directory would typically be
- on a shared or NFS-mounted file system.
-
- </para>
-
- <para>
-
- Here's what happens:
- When a build has a &CacheDir; specified,
- every time a file is built,
- it is stored in the shared cache directory
- along with its MD5 build signature.
- <footnote>
- <para>
- Actually, the MD5 signature is used as the name of the file
- in the shared cache directory in which the contents are stored.
- </para>
- </footnote>
- On subsequent builds,
- before an action is invoked to build a file,
- &SCons; will check the shared cache directory
- to see if a file with the exact same build
- signature already exists.
- If so, the derived file will not be built locally,
- but will be copied into the local build directory
- from the shared cache directory,
- like so:
-
- </para>
-
- <screen>
- % <userinput>scons -Q</userinput>
- cc -o hello.o -c hello.c
- cc -o hello hello.o
- % <userinput>scons -Q -c</userinput>
- Removed hello.o
- Removed hello
- % <userinput>scons -Q</userinput>
- Retrieved `hello.o' from cache
- Retrieved `hello' from cache
- </screen>
-
- <para>
-
- Note that the &CacheDir; feature still calculates
- MD5 build sigantures for the shared cache file names
- even if you configure &SCons; to use timestamps
- to decide if files are up to date.
- (See the <xref linkend="chap-depends"></xref>
- chapter for information about the &Decider; function.)
- Consequently, using &CacheDir; may reduce or eliminate any
- potential performance improvements
- from using timestamps for up-to-date decisions.
-
- </para>
-
- </section>
-
- <section>
- <title>Keeping Build Output Consistent</title>
-
- <para>
-
- One potential drawback to using a shared cache
- is that the output printed by &SCons;
- can be inconsistent from invocation to invocation,
- because any given file may be rebuilt one time
- and retrieved from the shared cache the next time.
- This can make analyzing build output more difficult,
- especially for automated scripts that
- expect consistent output each time.
-
- </para>
-
- <para>
-
- If, however, you use the <literal>--cache-show</literal> option,
- &SCons; will print the command line that it
- <emphasis>would</emphasis> have executed
- to build the file,
- even when it is retrieving the file from the shared cache.
- This makes the build output consistent
- every time the build is run:
-
- </para>
-
- <screen>
- % <userinput>scons -Q</userinput>
- cc -o hello.o -c hello.c
- cc -o hello hello.o
- % <userinput>scons -Q -c</userinput>
- Removed hello.o
- Removed hello
- % <userinput>scons -Q --cache-show</userinput>
- cc -o hello.o -c hello.c
- cc -o hello hello.o
- </screen>
-
- <para>
-
- The trade-off, of course, is that you no longer
- know whether or not &SCons;
- has retrieved a derived file from cache
- or has rebuilt it locally.
-
- </para>
-
- </section>
-
- <section>
- <title>Not Using the Shared Cache for Specific Files</title>
-
- <para>
-
- You may want to disable caching for certain
- specific files in your configuration.
- For example, if you only want to put
- executable files in a central cache,
- but not the intermediate object files,
- you can use the &NoCache;
- function to specify that the
- object files should not be cached:
-
- </para>
-
- <programlisting>
- env = Environment()
- obj = env.Object('hello.c')
- env.Program('hello.c')
- CacheDir('cache')
- NoCache('hello.o')
- </programlisting>
-
- <para>
-
- Then when you run &scons; after cleaning
- the built targets,
- it will recompile the object file locally
- (since it doesn't exist in the shared cache directory),
- but still realize that the shared cache directory
- contains an up-to-date executable program
- that can be retrieved instead of re-linking:
-
- </para>
-
- <!--
-
- <scons_output example="ex1">
- <scons_output_command>scons -Q</scons_output_command>
- <scons_output_command>scons -Q -c</scons_output_command>
- <scons_output_command>scons -Q</scons_output_command>
- </scons_output>
-
- -->
-
- <screen>
- % <userinput>scons -Q</userinput>
- cc -o hello.o -c hello.c
- cc -o hello hello.o
- % <userinput>scons -Q -c</userinput>
- Removed hello.o
- Removed hello
- % <userinput>scons -Q</userinput>
- cc -o hello.o -c hello.c
- Retrieved `hello' from cache
- </screen>
-
- </section>
-
- <section>
- <title>Disabling the Shared Cache</title>
-
- <para>
-
- Retrieving an already-built file
- from the shared cache
- is usually a significant time-savings
- over rebuilding the file,
- but how much of a savings
- (or even whether it saves time at all)
- can depend a great deal on your
- system or network configuration.
- For example, retrieving cached files
- from a busy server over a busy network
- might end up being slower than
- rebuilding the files locally.
-
- </para>
-
- <para>
-
- In these cases, you can specify
- the <literal>--cache-disable</literal>
- command-line option to tell &SCons;
- to not retrieve already-built files from the
- shared cache directory:
-
- </para>
-
- <screen>
- % <userinput>scons -Q</userinput>
- cc -o hello.o -c hello.c
- cc -o hello hello.o
- % <userinput>scons -Q -c</userinput>
- Removed hello.o
- Removed hello
- % <userinput>scons -Q</userinput>
- Retrieved `hello.o' from cache
- Retrieved `hello' from cache
- % <userinput>scons -Q -c</userinput>
- Removed hello.o
- Removed hello
- % <userinput>scons -Q --cache-disable</userinput>
- cc -o hello.o -c hello.c
- cc -o hello hello.o
- </screen>
-
- </section>
-
- <section>
- <title>Populating a Shared Cache With Already-Built Files</title>
-
- <para>
-
- Sometimes, you may have one or more derived files
- already built in your local build tree
- that you wish to make available to other people doing builds.
- For example, you may find it more effective to perform
- integration builds with the cache disabled
- (per the previous section)
- and only populate the shared cache directory
- with the built files after the integration build
- has completed successfully.
- This way, the cache will only get filled up
- with derived files that are part of a complete, successful build
- not with files that might be later overwritten
- while you debug integration problems.
-
- </para>
-
- <para>
-
- In this case, you can use the
- the <literal>--cache-force</literal> option
- to tell &SCons; to put all derived files in the cache,
- even if the files already exist in your local tree
- from having been built by a previous invocation:
-
- </para>
-
- <screen>
- % <userinput>scons -Q --cache-disable</userinput>
- cc -o hello.o -c hello.c
- cc -o hello hello.o
- % <userinput>scons -Q -c</userinput>
- Removed hello.o
- Removed hello
- % <userinput>scons -Q --cache-disable</userinput>
- cc -o hello.o -c hello.c
- cc -o hello hello.o
- % <userinput>scons -Q --cache-force</userinput>
- scons: `.' is up to date.
- % <userinput>scons -Q</userinput>
- scons: `.' is up to date.
- </screen>
-
- <para>
-
- Notice how the above sample run
- demonstrates that the <literal>--cache-disable</literal>
- option avoids putting the built
- <filename>hello.o</filename>
- and
- <filename>hello</filename> files in the cache,
- but after using the <literal>--cache-force</literal> option,
- the files have been put in the cache
- for the next invocation to retrieve.
-
- </para>
-
- </section>
-
- <section>
- <title>Minimizing Cache Contention: the <literal>--random</literal> Option</title>
-
- <para>
-
- If you allow multiple builds to update the
- shared cache directory simultaneously,
- two builds that occur at the same time
- can sometimes start "racing"
- with one another to build the same files
- in the same order.
- If, for example,
- you are linking multiple files into an executable program:
-
- </para>
-
- <programlisting>
- Program('prog',
- ['f1.c', 'f2.c', 'f3.c', 'f4.c', 'f5.c'])
- </programlisting>
-
- <para>
-
- &SCons; will normally build the input object files
- on which the program depends in their normal, sorted order:
-
- </para>
-
- <screen>
- % <userinput>scons -Q</userinput>
- cc -o f1.o -c f1.c
- cc -o f2.o -c f2.c
- cc -o f3.o -c f3.c
- cc -o f4.o -c f4.c
- cc -o f5.o -c f5.c
- cc -o prog f1.o f2.o f3.o f4.o f5.o
- </screen>
-
- <para>
-
- But if two such builds take place simultaneously,
- they may each look in the cache at nearly the same
- time and both decide that <filename>f1.o</filename>
- must be rebuilt and pushed into the shared cache directory,
- then both decide that <filename>f2.o</filename>
- must be rebuilt (and pushed into the shared cache directory),
- then both decide that <filename>f3.o</filename>
- must be rebuilt...
- This won't cause any actual build problems--both
- builds will succeed,
- generate correct output files,
- and populate the cache--but
- it does represent wasted effort.
-
- </para>
-
- <para>
-
- To alleviate such contention for the cache,
- you can use the <literal>--random</literal> command-line option
- to tell &SCons; to build dependencies
- in a random order:
-
- </para>
-
- <!--
-
- The following <screen> output was generated by this:
-
- <scons_output example="ex-random">
- <scons_output_command>scons -Q - -random</scons_output_command>
- </scons_output>
-
- We captured it directly here to guarantee a "random" order,
- guarding against the potential for - -random to happen
- to return things in the original sorted order.
-
- -->
-
- <screen>
- % <userinput>scons -Q --random</userinput>
- cc -o f3.o -c f3.c
- cc -o f1.o -c f1.c
- cc -o f5.o -c f5.c
- cc -o f2.o -c f2.c
- cc -o f4.o -c f4.c
- cc -o prog f1.o f2.o f3.o f4.o f5.o
- </screen>
-
- <para>
-
- Multiple builds using the <literal>--random</literal> option
- will usually build their dependencies in different,
- random orders,
- which minimizes the chances for a lot of
- contention for same-named files
- in the shared cache directory.
- Multiple simultaneous builds might still race to try to build
- the same target file on occasion,
- but long sequences of inefficient contention
- should be rare.
-
- </para>
-
- <para>
-
- Note, of course,
- the <literal>--random</literal> option
- will cause the output that &SCons; prints
- to be inconsistent from invocation to invocation,
- which may be an issue when
- trying to compare output from different build runs.
-
- </para>
-
- <para>
-
- If you want to make sure dependencies will be built
- in a random order without having to specify
- the <literal>--random</literal> on very command line,
- you can use the &SetOption; function to
- set the <literal>random</literal> option
- within any &SConscript; file:
-
- </para>
-
- <programlisting>
- Program('prog',
- ['f1.c', 'f2.c', 'f3.c', 'f4.c', 'f5.c'])
-
- SetOption('random', 1)
- Program('prog',
- ['f1.c', 'f2.c', 'f3.c', 'f4.c', 'f5.c'])
- </programlisting>
-
- </section>
-
- <!--
-
- <section>
- <title>Troubleshooting Shared Caching: the &cache-debug; Option</title>
-
- <para>
-
- XXX describe the - - cache-debug option
- XXX maybe point to the troubleshooting appendix?
-
- </para>
-
- </section>
-
- -->
-
- <!--
-
- <section>
-
- <para>
-
- XXX describe CacheDir management: monitoring, deleting, etc.
-
- </para>
-
- </section>
-
- -->
diff --git a/doc/user/command-line.xml b/doc/user/command-line.xml
index 148922e..3d48b2a 100644
--- a/doc/user/command-line.xml
+++ b/doc/user/command-line.xml
@@ -150,14 +150,14 @@
<screen>
% <userinput>scons</userinput>
- scons: Reading SConscript files ...
+ [?1034hscons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
... [build output] ...
scons: done building targets.
% <userinput>export SCONSFLAGS="-Q"</userinput>
% <userinput>scons</userinput>
- ... [build output] ...
+ [?1034h ... [build output] ...
</screen>
<para>
@@ -309,7 +309,7 @@
<screen>
% <userinput>scons -Q</userinput>
- running with -j 2
+ [?1034hrunning with -j 2
scons: `.' is up to date.
</screen>
@@ -324,7 +324,7 @@
<screen>
% <userinput>export NUM_CPU="4"</userinput>
% <userinput>scons -Q</userinput>
- running with -j 4
+ [?1034hrunning with -j 4
scons: `.' is up to date.
</screen>
@@ -341,11 +341,11 @@
<screen>
% <userinput>scons -Q -j 7</userinput>
- running with -j 7
+ [?1034hrunning with -j 7
scons: `.' is up to date.
% <userinput>export NUM_CPU="4"</userinput>
% <userinput>scons -Q -j 3</userinput>
- running with -j 3
+ [?1034hrunning with -j 3
scons: `.' is up to date.
</screen>
@@ -630,7 +630,7 @@
<screen>
% <userinput>scons -Q -n</userinput>
- Install file: "foo.in" as "/usr/bin/foo.in"
+ [?1034hInstall file: "foo.in" as "/usr/bin/foo.in"
</screen>
<para>
@@ -643,7 +643,7 @@
<screen>
% <userinput>scons -Q -n --prefix=/tmp/install</userinput>
- Install file: "foo.in" as "/tmp/install/usr/bin/foo.in"
+ [?1034hInstall file: "foo.in" as "/tmp/install/usr/bin/foo.in"
</screen>
</section>
@@ -718,15 +718,14 @@
<screen>
% <userinput>scons -Q debug=0</userinput>
- cc -o prog.o -c prog.c
+ [?1034hcc -o prog.o -c prog.c
cc -o prog prog.o
% <userinput>scons -Q debug=0</userinput>
- scons: `.' is up to date.
+ [?1034hscons: `.' is up to date.
% <userinput>scons -Q debug=1</userinput>
- cc -o prog.o -c -g prog.c
- cc -o prog prog.o
+ [?1034hscons: `.' is up to date.
% <userinput>scons -Q debug=1</userinput>
- scons: `.' is up to date.
+ [?1034hscons: `.' is up to date.
</screen>
<para>
@@ -806,9 +805,9 @@
<screen>
% <userinput>scons -Q define=FOO</userinput>
- cc -o prog.o -c -DFOO prog.c
+ [?1034hcc -o prog.o -c -DFOO prog.c
% <userinput>scons -Q define=FOO define=BAR</userinput>
- cc -o prog.o -c -DFOO -DBAR prog.c
+ [?1034hscons: `.' is up to date.
</screen>
<para>
@@ -909,7 +908,7 @@
<screen>
% <userinput>scons -Q RELEASE=1</userinput>
- cc -o bar.o -c -DRELEASE_BUILD=1 bar.c
+ [?1034hcc -o bar.o -c -DRELEASE_BUILD=1 bar.c
cc -o foo.o -c -DRELEASE_BUILD=1 foo.c
cc -o foo foo.o bar.o
</screen>
@@ -972,7 +971,7 @@
<screen>
% <userinput>scons -Q -h</userinput>
-
+ [?1034h
RELEASE: Set to 1 to build for release
default: 0
actual: 0
@@ -1037,7 +1036,7 @@
<screen>
% <userinput>scons -Q</userinput>
- cc -o bar.o -c -DRELEASE_BUILD=1 bar.c
+ [?1034hcc -o bar.o -c -DRELEASE_BUILD=1 bar.c
cc -o foo.o -c -DRELEASE_BUILD=1 foo.c
cc -o foo foo.o bar.o
</screen>
@@ -1061,7 +1060,7 @@
<screen>
% <userinput>scons -Q</userinput>
- cc -o bar.o -c -DRELEASE_BUILD=0 bar.c
+ [?1034hcc -o bar.o -c -DRELEASE_BUILD=0 bar.c
cc -o foo.o -c -DRELEASE_BUILD=0 foo.c
cc -o foo foo.o bar.o
</screen>
@@ -1127,12 +1126,12 @@
<screen>
% <userinput>scons -Q RELEASE=yes foo.o</userinput>
- cc -o foo.o -c -DRELEASE_BUILD=True foo.c
+ [?1034hcc -o foo.o -c -DRELEASE_BUILD=True foo.c
</screen>
<screen>
% <userinput>scons -Q RELEASE=t foo.o</userinput>
- cc -o foo.o -c -DRELEASE_BUILD=True foo.c
+ [?1034hcc -o foo.o -c -DRELEASE_BUILD=True foo.c
</screen>
<para>
@@ -1158,12 +1157,12 @@
<screen>
% <userinput>scons -Q RELEASE=no foo.o</userinput>
- cc -o foo.o -c -DRELEASE_BUILD=False foo.c
+ [?1034hcc -o foo.o -c -DRELEASE_BUILD=False foo.c
</screen>
<screen>
% <userinput>scons -Q RELEASE=f foo.o</userinput>
- cc -o foo.o -c -DRELEASE_BUILD=False foo.c
+ [?1034hcc -o foo.o -c -DRELEASE_BUILD=False foo.c
</screen>
<para>
@@ -1190,7 +1189,8 @@
scons: *** Error converting option: RELEASE
Invalid value for boolean option: bad_value
- File "/home/my/project/SConstruct", line 4, in &lt;module&gt;
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Variables\__init__.py", line 214, in Update
+ [?1034h
</screen>
</section>
@@ -1233,11 +1233,11 @@
<screen>
% <userinput>scons -Q COLOR=red foo.o</userinput>
- cc -o foo.o -c -DCOLOR="red" foo.c
+ [?1034hcc -o foo.o -c -DCOLOR="red" foo.c
% <userinput>scons -Q COLOR=blue foo.o</userinput>
- cc -o foo.o -c -DCOLOR="blue" foo.c
+ [?1034hscons: `foo.o' is up to date.
% <userinput>scons -Q COLOR=green foo.o</userinput>
- cc -o foo.o -c -DCOLOR="green" foo.c
+ [?1034hscons: `foo.o' is up to date.
</screen>
<para>
@@ -1253,7 +1253,8 @@
% <userinput>scons -Q COLOR=magenta foo.o</userinput>
scons: *** Invalid value for option COLOR: magenta
- File "/home/my/project/SConstruct", line 5, in &lt;module&gt;
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Variables\EnumVariable.py", line 51, in _validator
+ [?1034h
</screen>
<para>
@@ -1292,7 +1293,7 @@
<screen>
% <userinput>scons -Q COLOR=navy foo.o</userinput>
- cc -o foo.o -c -DCOLOR="blue" foo.c
+ [?1034hcc -o foo.o -c -DCOLOR="blue" foo.c
</screen>
<para>
@@ -1309,15 +1310,18 @@
% <userinput>scons -Q COLOR=Red foo.o</userinput>
scons: *** Invalid value for option COLOR: Red
- File "/home/my/project/SConstruct", line 5, in &lt;module&gt;
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Variables\EnumVariable.py", line 51, in _validator
+ [?1034h
% <userinput>scons -Q COLOR=BLUE foo.o</userinput>
scons: *** Invalid value for option COLOR: BLUE
- File "/home/my/project/SConstruct", line 5, in &lt;module&gt;
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Variables\EnumVariable.py", line 51, in _validator
+ [?1034h
% <userinput>scons -Q COLOR=nAvY foo.o</userinput>
scons: *** Invalid value for option COLOR: nAvY
- File "/home/my/project/SConstruct", line 5, in &lt;module&gt;
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Variables\EnumVariable.py", line 51, in _validator
+ [?1034h
</screen>
<para>
@@ -1349,13 +1353,13 @@
<screen>
% <userinput>scons -Q COLOR=Red foo.o</userinput>
- cc -o foo.o -c -DCOLOR="Red" foo.c
+ [?1034hcc -o foo.o -c -DCOLOR="Red" foo.c
% <userinput>scons -Q COLOR=BLUE foo.o</userinput>
- cc -o foo.o -c -DCOLOR="BLUE" foo.c
+ [?1034hscons: `foo.o' is up to date.
% <userinput>scons -Q COLOR=nAvY foo.o</userinput>
- cc -o foo.o -c -DCOLOR="blue" foo.c
+ [?1034hscons: `foo.o' is up to date.
% <userinput>scons -Q COLOR=green foo.o</userinput>
- cc -o foo.o -c -DCOLOR="green" foo.c
+ [?1034hscons: `foo.o' is up to date.
</screen>
<para>
@@ -1393,11 +1397,11 @@
<screen>
% <userinput>scons -Q COLOR=Red foo.o</userinput>
- cc -o foo.o -c -DCOLOR="red" foo.c
+ [?1034hcc -o foo.o -c -DCOLOR="red" foo.c
% <userinput>scons -Q COLOR=nAvY foo.o</userinput>
- cc -o foo.o -c -DCOLOR="blue" foo.c
+ [?1034hscons: `foo.o' is up to date.
% <userinput>scons -Q COLOR=GREEN foo.o</userinput>
- cc -o foo.o -c -DCOLOR="green" foo.c
+ [?1034hscons: `foo.o' is up to date.
</screen>
</section>
@@ -1436,9 +1440,9 @@
<screen>
% <userinput>scons -Q COLORS=red,blue foo.o</userinput>
- cc -o foo.o -c -DCOLORS="red blue" foo.c
+ [?1034hcc -o foo.o -c -DCOLORS="red blue" foo.c
% <userinput>scons -Q COLORS=blue,green,red foo.o</userinput>
- cc -o foo.o -c -DCOLORS="blue green red" foo.c
+ [?1034hscons: `foo.o' is up to date.
</screen>
<para>
@@ -1453,9 +1457,9 @@
<screen>
% <userinput>scons -Q COLORS=all foo.o</userinput>
- cc -o foo.o -c -DCOLORS="red green blue" foo.c
+ [?1034hcc -o foo.o -c -DCOLORS="red green blue" foo.c
% <userinput>scons -Q COLORS=none foo.o</userinput>
- cc -o foo.o -c -DCOLORS="" foo.c
+ [?1034hscons: `foo.o' is up to date.
</screen>
<para>
@@ -1470,7 +1474,8 @@
scons: *** Error converting option: COLORS
Invalid value(s) for option: magenta
- File "/home/my/project/SConstruct", line 5, in &lt;module&gt;
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Variables\__init__.py", line 214, in Update
+ [?1034h
</screen>
</section>
@@ -1510,9 +1515,9 @@
<screen>
% <userinput>scons -Q foo.o</userinput>
- cc -o foo.o -c -DCONFIG_FILE="/etc/my_config" foo.c
+ [?1034hcc -o foo.o -c -DCONFIG_FILE="/etc/my_config" foo.c
% <userinput>scons -Q CONFIG=/usr/local/etc/other_config foo.o</userinput>
- scons: `foo.o' is up to date.
+ [?1034hscons: `foo.o' is up to date.
</screen>
<para>
@@ -1527,7 +1532,8 @@
% <userinput>scons -Q CONFIG=/does/not/exist foo.o</userinput>
scons: *** Path for option CONFIG does not exist: /does/not/exist
- File "/home/my/project/SConstruct", line 6, in &lt;module&gt;
+ File "p:\cyghome\bdeegan\scons\trunk\bootstrap\src\engine\SCons\Variables\PathVariable.py", line 117, in PathExists
+ [?1034h
</screen>
<para>
@@ -1655,13 +1661,13 @@
<screen>
% <userinput>scons -Q foo.o</userinput>
- cc -o foo.o -c -DPACKAGE="/opt/location" foo.c
+ [?1034hcc -o foo.o -c -DPACKAGE="/opt/location" foo.c
% <userinput>scons -Q PACKAGE=/usr/local/location foo.o</userinput>
- cc -o foo.o -c -DPACKAGE="/usr/local/location" foo.c
+ [?1034hscons: `foo.o' is up to date.
% <userinput>scons -Q PACKAGE=yes foo.o</userinput>
- cc -o foo.o -c -DPACKAGE="True" foo.c
+ [?1034hscons: `foo.o' is up to date.
% <userinput>scons -Q PACKAGE=no foo.o</userinput>
- cc -o foo.o -c -DPACKAGE="False" foo.c
+ [?1034hscons: `foo.o' is up to date.
</screen>
</section>
@@ -1781,7 +1787,7 @@
<screen>
% <userinput>scons -Q NOT_KNOWN=foo</userinput>
- Unknown variables: ['NOT_KNOWN']
+ [?1034hUnknown variables: ['NOT_KNOWN']
</screen>
<para>
@@ -1849,10 +1855,10 @@
<screen>
% <userinput>scons -Q</userinput>
- cc -o foo.o -c foo.c
+ [?1034hcc -o foo.o -c foo.c
cc -o foo foo.o
% <userinput>scons -Q bar</userinput>
- Don't forget to copy `bar' to the archive!
+ [?1034hDon't forget to copy `bar' to the archive!
cc -o bar.o -c bar.c
cc -o bar bar.o
</screen>
@@ -1908,12 +1914,12 @@
<screen>
% <userinput>scons -Q</userinput>
- cc -o hello.o -c hello.c
+ [?1034hcc -o hello.o -c hello.c
cc -o hello hello.o
% <userinput>scons -Q</userinput>
- scons: `hello' is up to date.
+ [?1034hscons: `hello' is up to date.
% <userinput>scons -Q goodbye</userinput>
- cc -o goodbye.o -c goodbye.c
+ [?1034hcc -o goodbye.o -c goodbye.c
cc -o goodbye goodbye.o
</screen>
@@ -1930,7 +1936,7 @@
<screen>
% <userinput>scons -Q .</userinput>
- cc -o goodbye.o -c goodbye.c
+ [?1034hcc -o goodbye.o -c goodbye.c
cc -o goodbye goodbye.o
cc -o hello.o -c hello.c
cc -o hello hello.o
@@ -1982,12 +1988,12 @@
<screen>
% <userinput>scons -Q</userinput>
- cc -o prog1.o -c prog1.c
+ [?1034hcc -o prog1.o -c prog1.c
cc -o prog1 prog1.o
cc -o prog3.o -c prog3.c
cc -o prog3 prog3.o
% <userinput>scons -Q .</userinput>
- cc -o prog2.o -c prog2.c
+ [?1034hcc -o prog2.o -c prog2.c
cc -o prog2 prog2.o
</screen>
@@ -2014,13 +2020,13 @@
<screen>
% <userinput>scons -Q</userinput>
- cc -o prog1/foo.o -c prog1/foo.c
+ [?1034hcc -o prog1/foo.o -c prog1/foo.c
cc -o prog1/main.o -c prog1/main.c
cc -o prog1/main prog1/main.o prog1/foo.o
% <userinput>scons -Q</userinput>
- scons: `prog1' is up to date.
+ [?1034hscons: `prog1' is up to date.
% <userinput>scons -Q .</userinput>
- cc -o prog2/bar.o -c prog2/bar.c
+ [?1034hcc -o prog2/bar.o -c prog2/bar.c
cc -o prog2/main.o -c prog2/main.c
cc -o prog2/main prog2/main.o prog2/bar.o
</screen>
@@ -2050,8 +2056,9 @@
<screen>
% <userinput>scons -Q</userinput>
scons: *** No targets specified and no Default() targets found. Stop.
+ [?1034h
% <userinput>scons -Q .</userinput>
- cc -o prog1.o -c prog1.c
+ [?1034hcc -o prog1.o -c prog1.c
cc -o prog1 prog1.o
cc -o prog2.o -c prog2.c
cc -o prog2 prog2.o
@@ -2094,7 +2101,7 @@
<screen>
% <userinput>scons</userinput>
- scons: Reading SConscript files ...
+ [?1034hscons: Reading SConscript files ...
DEFAULT_TARGETS is ['prog1']
scons: done reading SConscript files.
scons: Building targets ...
@@ -2129,7 +2136,7 @@
<screen>
% <userinput>scons</userinput>
- scons: Reading SConscript files ...
+ [?1034hscons: Reading SConscript files ...
DEFAULT_TARGETS is now ['prog1']
DEFAULT_TARGETS is now ['prog1', 'prog2']
scons: done reading SConscript files.
@@ -2224,15 +2231,15 @@
<screen>
% <userinput>scons -Q</userinput>
- BUILD_TARGETS is ['prog1']
+ [?1034hBUILD_TARGETS is ['prog1']
cc -o prog1.o -c prog1.c
cc -o prog1 prog1.o
% <userinput>scons -Q prog2</userinput>
- BUILD_TARGETS is ['prog2']
+ [?1034hBUILD_TARGETS is ['prog2']
cc -o prog2.o -c prog2.c
cc -o prog2 prog2.o
% <userinput>scons -Q -c .</userinput>
- BUILD_TARGETS is ['.']
+ [?1034hBUILD_TARGETS is ['.']
Removed prog1.o
Removed prog1
Removed prog2.o
diff --git a/doc/user/depends.xml b/doc/user/depends.xml
index c9207d5..873c5f1 100644
--- a/doc/user/depends.xml
+++ b/doc/user/depends.xml
@@ -347,6 +347,7 @@
% <userinput>touch -t 198901010000 hello.c</userinput>
% <userinput>scons -Q hello.o</userinput>
cc -o hello.o -c hello.c
+ cc -o hello hello.o
</screen>
<para>
@@ -986,6 +987,12 @@
<screen>
C:\><userinput>scons -Q hello.exe</userinput>
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
cl /Fohello.obj /c hello.c /nologo /Iinclude /I\home\project\inc
link /nologo /OUT:hello.exe hello.obj
</screen>
@@ -1650,17 +1657,15 @@
<screen>
% <userinput>scons -Q hello</userinput>
cc -o version.o -c version.c
- cc -o hello.o -c hello.c
- cc -o hello version.o hello.o
- % <userinput>sleep 1</userinput>
- % <userinput>scons -Q hello</userinput>
cc -o version.o -c version.c
+ cc -o hello.o -c hello.c
scons: `hello' is up to date.
% <userinput>sleep 1</userinput>
% <userinput>edit hello.c</userinput>
[CHANGE THE CONTENTS OF hello.c]
% <userinput>scons -Q hello</userinput>
cc -o version.o -c version.c
+ cc -o version.o -c version.c
cc -o hello.o -c hello.c
cc -o hello version.o hello.o
% <userinput>sleep 1</userinput>
diff --git a/doc/user/environments.xml b/doc/user/environments.xml
index 0746793..f81dac7 100644
--- a/doc/user/environments.xml
+++ b/doc/user/environments.xml
@@ -656,6 +656,18 @@ environment, of directory names, suffixes, etc.
<screen>
C:\><userinput>scons -Q</userinput>
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
key = OBJSUFFIX, value = .obj
key = LIBSUFFIX, value = .lib
key = PROGSUFFIX, value = .exe
@@ -951,8 +963,15 @@ environment, of directory names, suffixes, etc.
<screen>
% <userinput>scons -Q</userinput>
- scons: *** Two environments with different actions were specified for the same target: foo.o
- File "/home/my/project/SConstruct", line 6, in &lt;module&gt;
+ scons: warning: Two different environments were specified for target foo.o,
+ but they appear to have the same action: CCCom(target, source, env)
+ File "/home/my/project/SConstruct", line 6, in ?
+
+ scons: warning: Two different environments were specified for target foo,
+ but they appear to have the same action: Cat(target, source, env)
+ File "/home/my/project/SConstruct", line 6, in ?
+ cc -o foo.o -c -g foo.c
+ cc -o foo foo.o
</screen>
<para>
diff --git a/doc/user/less-simple.xml b/doc/user/less-simple.xml
index 0bc382e..e7db86d 100644
--- a/doc/user/less-simple.xml
+++ b/doc/user/less-simple.xml
@@ -100,6 +100,12 @@
<screen>
C:\><userinput>scons -Q</userinput>
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
cl /Fohello.obj /c hello.c /nologo
link /nologo /OUT:new_hello.exe hello.obj
</screen>
@@ -189,6 +195,12 @@
<screen>
C:\><userinput>scons -Q</userinput>
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
cl /Fofile1.obj /c file1.c /nologo
cl /Fofile2.obj /c file2.c /nologo
cl /Foprog.obj /c prog.c /nologo
diff --git a/doc/user/libraries.xml b/doc/user/libraries.xml
index 1fa06af..45ad16a 100644
--- a/doc/user/libraries.xml
+++ b/doc/user/libraries.xml
@@ -73,6 +73,12 @@
<screen>
C:\><userinput>scons -Q</userinput>
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
cl /Fof1.obj /c f1.c /nologo
cl /Fof2.obj /c f2.c /nologo
cl /Fof3.obj /c f3.c /nologo
@@ -201,6 +207,12 @@
<screen>
C:\><userinput>scons -Q</userinput>
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
cl /Fof1.obj /c f1.c /nologo
cl /Fof2.obj /c f2.c /nologo
cl /Fof3.obj /c f3.c /nologo
@@ -282,6 +294,12 @@
<screen>
C:\><userinput>scons -Q</userinput>
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
cl /Fof1.obj /c f1.c /nologo
cl /Fof2.obj /c f2.c /nologo
cl /Fof3.obj /c f3.c /nologo
@@ -410,6 +428,12 @@
<screen>
C:\><userinput>scons -Q</userinput>
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
cl /Foprog.obj /c prog.c /nologo
link /nologo /OUT:prog.exe /LIBPATH:\usr\lib /LIBPATH:\usr\local\lib m.lib prog.obj
</screen>
diff --git a/doc/user/nodes.xml b/doc/user/nodes.xml
index 8f3436a..394ec37 100644
--- a/doc/user/nodes.xml
+++ b/doc/user/nodes.xml
@@ -128,6 +128,12 @@
<screen>
C:\><userinput>scons -Q</userinput>
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
cl /Fogoodbye.obj /c goodbye.c -DGOODBYE
cl /Fohello.obj /c hello.c -DHELLO
link /nologo /OUT:hello.exe hello.obj goodbye.obj
@@ -271,6 +277,12 @@
<screen>
C:\><userinput>scons -Q</userinput>
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
The object file is: hello.obj
The program file is: hello.exe
cl /Fohello.obj /c hello.c /nologo
diff --git a/doc/user/output.xml b/doc/user/output.xml
index ff39fca..8a9b67e 100644
--- a/doc/user/output.xml
+++ b/doc/user/output.xml
@@ -132,6 +132,18 @@
<screen>
C:\><userinput>scons -h</userinput>
scons: Reading SConscript files ...
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
scons: done reading SConscript files.
Type: 'scons program' to build the production program.
diff --git a/doc/user/parseconfig.xml b/doc/user/parseconfig.xml
index 3613d77..4adf97d 100644
--- a/doc/user/parseconfig.xml
+++ b/doc/user/parseconfig.xml
@@ -89,8 +89,17 @@
<screen>
% <userinput>scons -Q</userinput>
- ['/lib/compat', '/usr/X11/include']
- scons: `.' is up to date.
+ Package x11 was not found in the pkg-config search path.
+ Perhaps you should add the directory containing `x11.pc'
+ to the PKG_CONFIG_PATH environment variable
+ No package 'x11' found
+ OSError: 'pkg-config x11 --cflags --libs' exited 1:
+ File "/home/my/project/SConstruct", line 3:
+ env.ParseConfig("pkg-config x11 --cflags --libs")
+ File "bootstrap/src/engine/SCons/Environment.py", line 1474:
+ None
+ File "bootstrap/src/engine/SCons/Environment.py", line 593:
+ None
</screen>
<para>
@@ -131,6 +140,15 @@
<screen>
% <userinput>scons -Q</userinput>
- ['/usr/X11/include']
- scons: `.' is up to date.
+ Package x11 was not found in the pkg-config search path.
+ Perhaps you should add the directory containing `x11.pc'
+ to the PKG_CONFIG_PATH environment variable
+ No package 'x11' found
+ OSError: 'pkg-config x11 --cflags --libs' exited 1:
+ File "/home/my/project/SConstruct", line 2:
+ env.ParseConfig("pkg-config x11 --cflags --libs")
+ File "bootstrap/src/engine/SCons/Environment.py", line 1474:
+ None
+ File "bootstrap/src/engine/SCons/Environment.py", line 593:
+ None
</screen>
diff --git a/doc/user/parseflags.xml b/doc/user/parseflags.xml
index 632077e..1a169ac 100644
--- a/doc/user/parseflags.xml
+++ b/doc/user/parseflags.xml
@@ -88,6 +88,18 @@
<screen>
C:\><userinput>scons -Q</userinput>
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
CPPPATH ['/opt/include']
LIBPATH ['/opt/lib']
LIBS ['foo']
diff --git a/doc/user/simple.xml b/doc/user/simple.xml
index 6bd70b0..3089854 100644
--- a/doc/user/simple.xml
+++ b/doc/user/simple.xml
@@ -106,6 +106,12 @@
<screen>
C:\><userinput>scons</userinput>
scons: Reading SConscript files ...
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
scons: done reading SConscript files.
scons: Building targets ...
cl /Fohello.obj /c hello.c /nologo
@@ -193,6 +199,12 @@
<screen>
C:\><userinput>scons</userinput>
scons: Reading SConscript files ...
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
scons: done reading SConscript files.
scons: Building targets ...
cl /Fohello.obj /c hello.c /nologo
@@ -296,6 +308,12 @@
<screen>
C:\><userinput>scons</userinput>
scons: Reading SConscript files ...
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
scons: done reading SConscript files.
scons: Building targets ...
cl /Fohello.obj /c hello.c /nologo
@@ -303,6 +321,12 @@
scons: done building targets.
C:\><userinput>scons -c</userinput>
scons: Reading SConscript files ...
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
scons: done reading SConscript files.
scons: Cleaning targets ...
Removed hello.obj
@@ -503,6 +527,12 @@
<screen>
C:\><userinput>scons</userinput>
scons: Reading SConscript files ...
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
scons: done reading SConscript files.
scons: Building targets ...
cl /Fohello.obj /c hello.c /nologo
@@ -534,6 +564,12 @@
<screen>
C:\><userinput>scons -Q</userinput>
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
cl /Fohello.obj /c hello.c /nologo
link /nologo /OUT:hello.exe hello.obj
</screen>
diff --git a/doc/user/troubleshoot.xml b/doc/user/troubleshoot.xml
index 857fcc3..2ac91ec 100644
--- a/doc/user/troubleshoot.xml
+++ b/doc/user/troubleshoot.xml
@@ -341,6 +341,18 @@
<screen>
C:\><userinput>scons</userinput>
scons: Reading SConscript files ...
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
{ 'BUILDERS': {'_InternalInstall': &lt;function InstallBuilderWrapper at 0x700000&gt;, 'Object': &lt;SCons.Builder.CompositeBuilder instance at 0x700000&gt;, 'PCH': &lt;SCons.Builder.BuilderBase instance at 0x700000&gt;, 'RES': &lt;SCons.Builder.BuilderBase instance at 0x700000&gt;, 'SharedObject': &lt;SCons.Builder.CompositeBuilder instance at 0x700000&gt;, 'StaticObject': &lt;SCons.Builder.CompositeBuilder instance at 0x700000&gt;, '_InternalInstallAs': &lt;function InstallAsBuilderWrapper at 0x700000&gt;},
'CC': 'cl',
'CCCOM': &lt;SCons.Action.FunctionAction instance at 0x700000&gt;,
@@ -379,7 +391,7 @@
'DSUFFIXES': ['.d'],
'Dir': &lt;SCons.Defaults.Variable_Method_Caller instance at 0x700000&gt;,
'Dirs': &lt;SCons.Defaults.Variable_Method_Caller instance at 0x700000&gt;,
- 'ENV': { 'PATH': 'C:\\WINDOWS\\System32',
+ 'ENV': { 'PATH': 'C:/WINDOWS\\System32',
'PATHEXT': '.COM;.EXE;.BAT;.CMD',
'SystemRoot': 'C:\\WINDOWS'},
'ESCAPE': &lt;function escape at 0x700000&gt;,
@@ -505,7 +517,18 @@
<screen>
C:\><userinput>scons</userinput>
scons: Reading SConscript files ...
- { 'PATH': 'C:\\WINDOWS\\System32',
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
+ { 'PATH': 'C:/WINDOWS\\System32',
'PATHEXT': '.COM;.EXE;.BAT;.CMD',
'SystemRoot': 'C:\\WINDOWS'}
scons: done reading SConscript files.
@@ -1121,11 +1144,8 @@
File "bootstrap/src/engine/SCons/Job.py", line 197, in start
task.prepare()
File "bootstrap/src/engine/SCons/Script/Main.py", line 167, in prepare
- return SCons.Taskmaster.OutOfDateTask.prepare(self)
File "bootstrap/src/engine/SCons/Taskmaster.py", line 190, in prepare
- executor.prepare()
File "bootstrap/src/engine/SCons/Executor.py", line 397, in prepare
- raise SCons.Errors.StopError, msg % (s, self.batches[0].targets[0])
</screen>
<para>
diff --git a/doc/user/variants.xml b/doc/user/variants.xml
index 3ae3e4a..e60dd8c 100644
--- a/doc/user/variants.xml
+++ b/doc/user/variants.xml
@@ -108,6 +108,18 @@ is pretty smart about rebuilding things when you change options.
<screen>
C:\><userinput>scons -Q OS=windows</userinput>
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No installed VCs
+ File "&lt;stdin&gt;", line 67, in __call__
+
+ scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
+ File "&lt;stdin&gt;", line 67, in __call__
Install file: "build/windows/world/world.h" as "export/windows/include/world.h"
cl /Fobuild\windows\hello\hello.obj /c build\windows\hello\hello.c /nologo /Iexport\windows\include
cl /Fobuild\windows\world\world.obj /c build\windows\world\world.c /nologo /Iexport\windows\include