More User's Guide edits.
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Sat, 8 Feb 2003 13:51:02 +0000 (13:51 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Sat, 8 Feb 2003 13:51:02 +0000 (13:51 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@578 fdb21ef1-2011-0410-befe-b5e4ea1792b1

doc/SConscript
doc/scons.mod
doc/user/default.sgml
doc/user/depends.sgml
doc/user/help.sgml
doc/user/main.sgml
doc/user/repositories.sgml
doc/user/simple.sgml

index 7073246da7875c8781c12446ab33ccaaa5fe3894..feb8a7535e99103e8e0bf3f115e486a4f2d0b1a7 100644 (file)
@@ -183,6 +183,7 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE.  DO NOT EDIT.
             if tidy:
                 cmds.append("tidy -m -q $TARGET || true")
             env.Command(htmlindex, main, cmds)
+            Local(htmlindex)
 
             cmds = [
                 "rm -f ${TARGET.dir}/main.html",
@@ -192,6 +193,7 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE.  DO NOT EDIT.
             if tidy:
                 cmds.append("tidy -m -q $TARGET || true")
             env.Command(html, main, cmds)
+            Local(html)
 
             env.Ignore([html, htmlindex], "version.sgml")
 
@@ -214,6 +216,7 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE.  DO NOT EDIT.
                 "mv ${TARGET.dir}/main.ps $TARGET",
                 "rm -f ${TARGET.dir}/%s" % out,
             ])
+            Local(ps)
 
             env.Ignore(ps, "version.sgml")
 
@@ -235,6 +238,7 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE.  DO NOT EDIT.
                 "mv ${TARGET.dir}/main.pdf $TARGET",
                 "rm -f ${TARGET.dir}/out",
             ])
+            Local(pdf)
 
             env.Ignore(pdf, "version.sgml")
 
index 642f979a14721871bb924bb1da6ea6d244ffd611..9f1832c4f74922402544f02cec6c38062b3faf95 100644 (file)
 <!ENTITY RuleSet "<function>RuleSet</function>">
 <!ENTITY Salt "<function>Salt</function>">
 <!ENTITY SourceSignature "<function>SourceSignature</function>">
+<!ENTITY Split "<function>Split</function>">
 <!ENTITY Task "<function>Task</function>">
 
 
 <!ENTITY consvar "<literal>construction variable</literal>">
 <!ENTITY consvars "<literal>construction variables</literal>">
 
+<!ENTITY CPPPATH "<literal>CPPPATH</literal>">
+
 <!ENTITY Dictionary "<literal>Dictionary</literal>">
 
 <!--
 
 -->
 
+<!ENTITY goodbye "<application>goodbye</application>">
 <!ENTITY hello "<application>hello</application>">
 <!ENTITY hello_c "<filename>hello.c</filename>">
 <!ENTITY hello_h "<filename>hello.h</filename>">
index bb81a3a860787a267ffc07b09c5dca092722f4bf..eb2bdc1a69e82565096388fa6da8fed2a2b10cad 100644 (file)
@@ -60,19 +60,153 @@ default list.
 
 -->
 
- <para>
+   <para>
+
+   As mentioned previously,
+   &SCons; will build every target
+   in or below the current directory
+   by default--that is, when you don't
+   explicitly specify one or more targets
+   on the command line.
+   Sometimes, however, you may want
+   to explicitly specify that only
+   certain programs should be built by default,
+   which you do using the &Default; function:
+
+   </para>
+
+   <programlisting>
+      env = Environment()
+      hello = env.Program('hello.c')
+      env.Program('goodbye.c')
+      Default(hello)
+   </programlisting>
+
+   <para>
+
+   This &SConstruct; file builds two programs,
+   &hello; and &goodbye;,
+   but only builds the
+   &hello program by default:
+
+   </para>
+
+   <literallayout>
+      % <userinput>scons</userinput>
+      cc -c hello.c -o hello.o
+      cc -o hello hello.o
+      % <userinput>scons</userinput>
+      % <userinput>scons goodbye</userinput>
+      cc -c goodbye.c -o goodbye.o
+      cc -o goodbye goodbye.o
+      %
+   </literallayout>
+
+   <para>
+
+   Note that, even when you use the &Default;
+   function in your &SConstruct; file,
+   you can still explicitly specify the current directory
+   (<literal>.</literal>) on the command line
+   to tell &SCons; to build
+   everything in (or below) the current directory:
+
+   </para>
+
+   <literallayout>
+      % <userinput>scons .</userinput>
+      cc -c goodbye.c -o goodbye.o
+      cc -o goodbye goodbye.o
+      cc -c hello.c -o hello.o
+      cc -o hello hello.o
+      %
+   </literallayout>
+
+   <para>
 
-   X
+   You can also call the &Default;
+   function more than once,
+   in which case each call
+   adds to the list of targets to be built by default:
 
- </para>
+   </para>
+
+   <programlisting>
+      env = Environment()
+      prog1 = env.Program('prog1.c')
+      Default(prog1)
+      prog2 = env.Program('prog2.c')
+      prog3 = env.Program('prog3.c')
+      Default(prog3)
+   </programlisting>
+
+   <para>
+
+   Or you can specify more than one target
+   in a single call to the &Default; function:
+
+   </para>
+
+   <programlisting>
+      env = Environment()
+      prog1 = env.Program('prog1.c')
+      prog2 = env.Program('prog2.c')
+      prog3 = env.Program('prog3.c')
+      Default(prog1, prog3)
+   </programlisting>
+
+   <para>
+
+   Either of these last two examples
+   will build only the
+   <application>prog1</application>
+   and
+   <application>prog3</application>
+   programs:
+
+   </para>
+
+   <literallayout>
+      % <userinput>scons</userinput>
+      cc -c prog1.c -o prog1.o
+      cc -o prog1 prog1.o
+      cc -c prog3.c -o prog3.o
+      cc -o prog3 prog3.o
+      % <userinput>scons .</userinput>
+      cc -c prog2.c -o prog2.o
+      cc -o prog2 prog2.o
+      %
+   </literallayout>
+
+   <para>
+
+   Lastly, if for some reason you don't want
+   any targets built by default,
+   you can use the Python <literal>None</literal>
+   variable:
+
+   </para>
 
- <section>
- <title>The &Default; Method</title>
+   <programlisting>
+      env = Environment()
+      prog1 = env.Program('prog1.c')
+      prog2 = env.Program('prog2.c')
+      Default(None)
+   </programlisting>
 
    <para>
 
-   X
+   Which would produce build output like:
 
    </para>
 
- </section>
+   <literallayout>
+      % <userinput>scons</userinput>
+      scons: *** No targets specified and no Default() targets found.  Stop.
+      % <userinput>scons .</userinput>
+      cc -c prog1.c -o prog1.o
+      cc -o prog1 prog1.o
+      cc -c prog2.c -o prog2.o
+      cc -o prog2 prog2.o
+      %
+   </literallayout>
index c94ac0d1d18eee0b28b7e8c84237b76f57ced63d..e8491e4e2e1b0fd1b219ed47e891f2ad3ec2aa1b 100644 (file)
@@ -61,10 +61,10 @@ operating system on which the build is performed (as reported by C<uname
  </para>
 
  <literallayout>
-    % <userinput>scons .</userinput>
+    % <userinput>scons</userinput>
     cc -c hello.c -o hello.o
     cc -o hello hello.o
-    % <userinput>scons .</userinput>
+    % <userinput>scons</userinput>
     %
  </literallayout>
 
@@ -89,9 +89,9 @@ operating system on which the build is performed (as reported by C<uname
 
  <para>
 
(&SCons; only reports "...is up to date"
Note that &SCons; only reports "...is up to date"
  for target files named explicitly on the command line,
- to avoid cluttering the output.)
+ to avoid cluttering the output.
 
  </para>
 
@@ -172,14 +172,11 @@ included by included files will also be scanned.
 
    <para>
 
-   X
+   Now suppose that our "Hello, World!" program
+   actually looks like this:
 
    </para>
 
-   <programlisting>
-      #define string    "world"
-   </programlisting>
-
    <programlisting>
       #include "hello.h" 
       int
@@ -189,11 +186,44 @@ included by included files will also be scanned.
       }
    </programlisting>
 
+   <para>
+
+   That is, the first line
+   includes a &hello_h;
+   that looks like this:
+
+   </para>
+
+   <programlisting>
+      #define string    "world"
+   </programlisting>
+
+   <para>
+
+   In this case, we want &SCons; to recognize that,
+   if the contents of the &hello_h; file change,
+   the &hello; program must be recompiled.
+   To do this, we need to modify the
+   &SConstruct; file like so:
+
+   </para>
+
    <programlisting>
       env = Environment(CPPPATH = '.')  XXX IS CPPPATH NECESSARY?
       hello = env.Program('hello.c')
    </programlisting>
 
+   <para>
+
+   The &CPPPATH; assignment in the &Environment; call
+   tells &SCons; to look in the current directory
+   (<literal>'.'</literal>)
+   for any files included by C source files
+   (<filename>.c</filename> or <filename>.h</filename> files).
+   With this assignment in the &SConstruct file:
+
+   </para>
+
    <literallayout>
       % <userinput>scons hello</userinput>
       cc -c hello.c -o hello.o
@@ -210,20 +240,20 @@ included by included files will also be scanned.
 
    <para>
 
-      &SCons; knows that the &hello;
-      program must be rebuilt
-      because it scans the contents of
-      the &hello_c;
-      for the #include lines that indicate
-      another file is being included in the compilation.
-      &SCons; records these as
-      <emphasis>implicit dependencies</emphasis>
-      of the target file,
-      Consequently,
-      when the &hello_h; file changes,
-      &SCons; realizes that the &hello_c; file includes it,
-      and rebuilds the resulting &hello; program
-      that depends on both the &hello_c; and &hello_h; files.
+   &SCons; knows that the &hello;
+   program must be rebuilt
+   because it scans the contents of
+   the &hello_c; file
+   for the <literal>#include</literal> lines that indicate
+   another file is being included in the compilation.
+   &SCons; records these as
+   <emphasis>implicit dependencies</emphasis>
+   of the target file,
+   Consequently,
+   when the &hello_h; file changes,
+   &SCons; realizes that the &hello_c; file includes it,
+   and rebuilds the resulting &hello; program
+   that depends on both the &hello_c; and &hello_h; files.
 
    </para>
 
index 7c1732e78a2703f64f5d5aa196d480cd922f57f4..5e2ced380d6fb15de3af272f92b38d4bfbecc14d 100644 (file)
 
 -->
 
- <para>
-
-   X
-
- </para>
-
- <section>
- <title>Providing build-specific help instructions</title>
-
    <para>
 
    It's often very useful to be able to give
@@ -84,5 +75,3 @@
    the <literal>-H</literal> option is used.
 
    </para>
-
- </section>
index bb64b7255df550754045e6d71e272d1aacaf934a..b285696d6ec71552af4b5a36d193b17dac2566d5 100644 (file)
 
     <edition>Revision &buildrevision; (&builddate;)</edition>
 
-    <pubdate>2001</pubdate>
+    <pubdate>2003</pubdate>
 
     <copyright>
-      <year>2001</year>
+      <year>2003</year>
       <holder>Steven Knight</holder>
     </copyright>
 
index 4acc943269777b28a641b4a12bf93011ff3f00ea..2193a8fdb4cd5417647bd0bbfcbf045499e780d3 100644 (file)
@@ -142,7 +142,7 @@ subdirectories under the repository tree.
  directory trees that contain
  source code, or derived files, or both.
  You can eliminate additional unnecessary
- rebuilds of files by having &SCons;,
+ rebuilds of files by having &SCons;
  use files from one or more code repositories
  to build files in your local build tree.
 
@@ -163,8 +163,8 @@ used to build any local derived files.
 
    <para>
 
-   You use the &Repository; method
-   to tell &SCons; to search one or more
+   The &Repository; method
+   tells &SCons; to search one or more
    central code repositories (in order)
    for any source files and derived files
    that are not present in the local build tree:
@@ -223,7 +223,7 @@ used to build any local derived files.
    </para>
 
    <literallayout>
-     % <userinput>scons .</userinput>
+     % <userinput>scons</userinput>
      gcc -c hello.c -o hello.o
      gcc -o hello hello.o
    </literallayout>
@@ -238,7 +238,7 @@ used to build any local derived files.
    </para>
 
    <literallayout>
-     % <userinput>scons .</userinput>
+     % <userinput>scons</userinput>
      gcc -c /usr/repository1/hello.c -o hello.o
      gcc -o hello hello.o
    </literallayout>
@@ -252,7 +252,7 @@ used to build any local derived files.
    </para>
 
    <literallayout>
-     % <userinput>scons .</userinput>
+     % <userinput>scons</userinput>
      gcc -c /usr/repository2/hello.c -o hello.o
      gcc -o hello hello.o
    </literallayout>
@@ -281,7 +281,7 @@ used to build any local derived files.
    </para>
 
    <literallayout>
-     % <userinput>scons -Y /usr/repository1 -Y /usr/repository2 .</userinput>
+     % <userinput>scons -Y /usr/repository1 -Y /usr/repository2</userinput>
    </literallayout>
 
    <para>
@@ -303,7 +303,7 @@ used to build any local derived files.
 
    If a repository contains not only source files,
    but also derived files (such as object files,
-   libraries, or exectuables), &SCons; will perform
+   libraries, or executables), &SCons; will perform
    its normal MD5 signature calculation to
    decide if a derived file in a repository is up-to-date,
    or the derived file must be rebuilt in the local build directory.
@@ -325,7 +325,7 @@ used to build any local derived files.
 
    <literallayout>
      % <userinput>cd /usr/repository1</userinput>
-     % <userinput>scons .</userinput>
+     % <userinput>scons</userinput>
      gcc -c hello.c -o hello.o
      gcc -o hello hello.o
    </literallayout>
@@ -353,7 +353,7 @@ used to build any local derived files.
    <literallayout>
      % <userinput>cd $HOME/build</userinput>
      % <userinput>edit hello.c</userinput>
-     % <userinput>scons -Y /usr/repository1 .</userinput>
+     % <userinput>scons -Y /usr/repository1</userinput>
      gcc -c hello.c -o hello.o
      gcc -o hello hello.o
      XXXXXXX
@@ -385,8 +385,8 @@ used to build any local derived files.
    <literallayout>
      % <userinput>mkdir $HOME/build2</userinput>
      % <userinput>cd $HOME/build2</userinput>
-     % <userinput>cons -Y /usr/all/repository hello</userinput>
-     cons: "hello" is up-to-date.
+     % <userinput>scons -Y /usr/all/repository hello</userinput>
+     scons: `hello' is up-to-date.
    </literallayout>
 
    <para>
index 9071160819b86cfbcedf4769cffa4dc9326a13c2..8cafe2d87760f0622c10bb852b7555c99185299f 100644 (file)
@@ -44,7 +44,6 @@ requirements of a build.
  <para>
 
  Here's how to build the famous "Hello, World!" example using &SCons;.
- Enter the following into a file name &SConstruct;:
 
  </para>
 
@@ -56,6 +55,12 @@ requirements of a build.
     }
  </programlisting>
 
+ <para>
+
+ Enter the following into a file name &SConstruct;:
+
+ </para>
+
  <programlisting>
     env = Environment()
     env.Program('hello.c')
@@ -70,7 +75,7 @@ requirements of a build.
  </para>
 
  <literallayout>
-    % <userinput>scons .</userinput>
+    % <userinput>scons</userinput>
     cc -c hello.c -o hello.o
     cc -o hello hello.o
  </literallayout>
@@ -83,32 +88,42 @@ requirements of a build.
  </para>
 
  <literallayout>
-    C:\><userinput>scons .</userinput>
+    C:\><userinput>scons</userinput>
     cl /Fohello.obj hello.c
     link /Fohello.exe hello.obj
  </literallayout>
 
  <para>
 
- First, notice that you need to supply a '.' on the command line.
- This tells &SCons; to build everything in the current directory
- or its subdirectories.
- We'll tell you later how to avoid having to use the '.'
+ First, notice that you only need
+ to specify the name of the source file,
+ and that &SCons; deduces the names of
+ the object and executable files
+ correctly from the source file.
 
  </para>
 
  <para>
 
Next, notice that the same input &SConstruct; file
- without any special input,
- generates the right output file names on both systems:
Second, notice that the same input &SConstruct; file
+ without any changes,
+ generates the correct output file names on both systems:
  <filename>hello.o</filename> and <filename>hello</filename>
  on POSIX systems,
  <filename>hello.obj</filename> and <filename>hello.exe</filename>
  on Windows systems.
- (We won't provide side-by-side examples of POSIX
- and Windows runs for all future examples;
- just know that XXX.)
+ This is a simple example of how easy it is to
+ use &SCons; to write portable software builds.
+
+ </para>
+
+ <para>
+
+ (Note that we won't provide duplicate side-by-side
+ POSIX and Windows output for the 
+ rest of the examples in this guide;
+ just keep in mind that, unless otherwise specified,
+ any of the examples should work equally well on both types of systems.)
 
  </para>
 
@@ -132,19 +147,17 @@ requirements of a build.
    an &SConstruct; file and a &Makefile:
    the &SConstruct; file is actually a Python script.
    If you're not already familiar with Python, don't worry;
-   you don't really need to know Python to be able to use
-   &SCons; effectively.
-   But you'll see that being able to use the power of a
-   real scripting language
-   can greatly simplify the solutions
-   to complex requirements of real-world builds.
+   Python is extremely easy to learn,
+   and this User's Guide will introduce you step-by-step
+   to the relatively small amount of Python you'll
+   neede to know to be able to use &SCons; effectively.
 
    </para>
 
    <para>
 
-   For now, one ramification of using Python as the
-   scripting language means that you can put comments
+   One aspect of using Python as the
+   scripting language is that you can put comments
    in your &SConstruct; file using Python's commenting convention;
    that is, everything between a '#' and the end of the line
    will be ignored:
@@ -157,6 +170,16 @@ requirements of a build.
       env.Program('hello.c')
    </programlisting>
 
+   <para>
+
+   You'll see throughout the remainder of this Guide
+   that being able to use the power of a
+   real scripting language
+   can greatly simplify the solutions
+   to complex requirements of real-world builds.
+
+   </para>
+
  </section>
 
  <section>
@@ -164,7 +187,15 @@ requirements of a build.
 
    <para>
 
-   If you want
+   It's more common, of course,
+   that you'll need to build a program from
+   not just one, but many input source files.
+   To do this, you need to put the
+   source files in a Python list
+   (enclosed in square brackets),
+   and slide that list over to to the right
+   to make room for the output program file name.
+   For example:
 
    </para>
 
@@ -173,19 +204,156 @@ requirements of a build.
       env.Program('program', ['main.c', 'file1.c', 'file2.'])
    </programlisting>
 
-   <programlisting>
-      env = Environment()
-      env.Program('program', Split('main.c file1.c file2.'))
-   </programlisting>
+   <para>
+
+   (&SCons; puts the output file name to the left
+   of the source file names
+   so that the order mimics that of an
+   assignment statement:  "program = source files".)
+
+   </para>
+
+   <para>
+
+   A build of the above example would look:
+
+   </para>
 
    <literallayout>
-      % <userinput>scons .</userinput>
+      % <userinput>scons</userinput>
       cc -c file1.c -o file1.o
       cc -c file2.c -o file2.o
       cc -c main.c -o main.o
       cc -o program main.o file1.o file2.o
    </literallayout>
 
+   <!--
+
+   XXX DO WE NEED WINDOWS EXAMPLE OUTPUT HERE?
+
+   </para>
+
+   Or on Windows:
+
+   </para>
+
+   <literallayout>
+      C:\><userinput>scons</userinput>
+      cl /Fofile1.obj file1.c
+      cl /Fofile2.obj file2.c
+      cl /Fomain.obj main.c
+      link /Foprogram.exe main.obj file1.obj file2.obj
+   </literallayout>
+
+   -->
+
+ </section>
+
+ <section>
+ <title>Keeping &SConstruct; Files Easy to Read</title>
+
+   <para>
+
+   One minor drawback to the use of a Python list
+   for source files is that 
+   each file name must be enclosed in quotes
+   (either single quotes or double quotes).
+   This can get cumbersome and difficult to read
+   when the list of file names is long.
+   Fortunately, there are a number of things
+   we can do to make sure that
+   the &SConstruct; file stays easy to read.
+
+   </para>
+
+   <para>
+
+   To make long lists of file names
+   easier to deal with, &SCons; provides a
+   &Split; function
+   that takes a quoted list of file names,
+   with the names separated by spaces or other white-space characters,
+   and turns it into a list of separate file names.
+   Using the &Split; function turns the
+   previous example into:
+
+   </para>
+
+   <programlisting>
+      env = Environment()
+      env.Program('program', Split('main.c file1.c file2.'))
+   </programlisting>
+
+   <para>
+
+   Putting the call to the &Split; function
+   inside the <function>env.Program</function> call
+   can also be a little unwieldy.
+   A more readable alternative is to
+   assign the output from the &Split; call
+   to a variable name,
+   and then use the variable when calling the
+   <function>env.Program</function> function:
+
+   </para>
+
+   <programlisting>
+      env = Environment()
+      list = Split('main.c file1.c file2.')
+      env.Program('program', list)
+   </programlisting>
+
+   <para>
+
+   Lastly, the &Split; function
+   doesn't care how much white space separates
+   the file names in the quoted string.
+   This allows you to create lists of file
+   names that span multiple lines,
+   which often makes for easier editing:
+
+   </para>
+
+   <programlisting>
+      env = Environment()
+      list = Split('main.c
+                    file1.c
+                    file2.c')
+      env.Program('program', list)
+   </programlisting>
+
+ </section>
+
+ <section>
+ <title>Keyword Arguments</title>
+
+   <para>
+
+   &SCons; also allows you to identify
+   the output file and input source files
+   by Python keyword arguments.
+   The output file is known as the
+   <emphasis>target</emphasis>,
+   and the source file(s) are known (logically enough) as the
+   <emphasis>source</emphasis>.
+   The Python syntax for this is:
+
+   </para>
+
+   <programlisting>
+      env = Environment()
+      list = Split('main.c file1.c file2.')
+      env.Program(target = 'program', source = list)
+   </programlisting>
+
+   <para>
+
+   Whether or not you choose to use keyword arguments
+   to identify the target and source files
+   is purely a personal choice.
+
+   </para>
+
  </section>
 
  <section>
@@ -193,7 +361,11 @@ requirements of a build.
 
    <para>
 
-   If you want
+   In order to compile multiple programs
+   within the same &SConstruct; file,
+   simply call <function>env.Program</function>
+   multiple times,
+   once for each program you need to build:
 
    </para>
 
@@ -203,8 +375,14 @@ requirements of a build.
       env.Program('bar', ['bar1.c', 'bar2.c'])
    </programlisting>
 
+   <para>
+
+   &SCons; would then build the programs as follows:
+
+   </para>
+
    <literallayout>
-      % <userinput>scons .</userinput>
+      % <userinput>scons</userinput>
       cc -c bar1.c -o bar1.o
       cc -c bar2.c -o bar2.o
       cc -o bar bar1.o bar2.o
@@ -215,11 +393,11 @@ requirements of a build.
  </section>
 
  <section>
- <title>Sharing Files Between Multiple Programs</title>
+ <title>Sharing Source Files Between Multiple Programs</title>
 
    <para>
 
-   If you want
+   XXX
 
    </para>
 
@@ -231,7 +409,7 @@ requirements of a build.
    </programlisting>
 
    <literallayout>
-      % <userinput>scons .</userinput>
+      % <userinput>scons</userinput>
       cc -c bar1.c -o bar1.o
       cc -c bar2.c -o bar2.o
       cc -c common1.c -o common1.o