summaryrefslogtreecommitdiff
path: root/doc/user/simple.in
diff options
context:
space:
mode:
Diffstat (limited to 'doc/user/simple.in')
-rw-r--r--doc/user/simple.in517
1 files changed, 0 insertions, 517 deletions
diff --git a/doc/user/simple.in b/doc/user/simple.in
deleted file mode 100644
index 76b044b..0000000
--- a/doc/user/simple.in
+++ /dev/null
@@ -1,517 +0,0 @@
-<!--
-
- Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The SCons Foundation
-
- 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>
-
- In this chapter,
- you will see several examples of
- very simple build configurations using &SCons;,
- which will demonstrate how easy
- it is to use &SCons; to
- build programs from several different programming languages
- on different types of systems.
-
- </para>
-
- <section>
- <title>Building Simple C / C++ Programs</title>
-
- <para>
-
- Here's the famous "Hello, World!" program in C:
-
- </para>
-
- <programlisting>
- int
- main()
- {
- printf("Hello, world!\n");
- }
- </programlisting>
-
- <para>
-
- And here's how to build it using &SCons;.
- Enter the following into a file named &SConstruct;:
-
- </para>
-
- <scons_example name="ex1">
- <file name="SConstruct" printme="1">
- Program('hello.c')
- </file>
- <file name="hello.c">
- int main() { printf("Hello, world!\n"); }
- </file>
- </scons_example>
-
- <para>
-
- This minimal configuration file gives
- &SCons; two pieces of information:
- what you want to build
- (an executable program),
- and the input file from
- which you want it built
- (the <filename>hello.c</filename> file).
- &b-link-Program; is a <firstterm>builder_method</firstterm>,
- a Python call that tells &SCons; that you want to build an
- executable program.
-
- </para>
-
- <para>
-
- That's it. Now run the &scons; command to build the program.
- On a POSIX-compliant system like Linux or UNIX,
- you'll see something like:
-
- </para>
-
- <scons_output example="ex1" os="posix">
- <scons_output_command>scons</scons_output_command>
- </scons_output>
-
- <para>
-
- On a Windows system with the Microsoft Visual C++ compiler,
- you'll see something like:
-
- </para>
-
- <scons_output example="ex1" os="win32">
- <scons_output_command>scons</scons_output_command>
- </scons_output>
-
- <para>
-
- First, notice that you only need
- to specify the name of the source file,
- and that &SCons; correctly deduces the names of
- the object and executable files to be built
- from the base of the source file name.
-
- </para>
-
- <para>
-
- 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.
- This is a simple example of how &SCons;
- makes it extremely easy to
- write portable software builds.
-
- </para>
-
- <para>
-
- (Note that we won't provide duplicate side-by-side
- POSIX and Windows output for all 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>
-
- </section>
-
- <section>
- <title>Building Object Files</title>
-
- <para>
-
- The &b-link-Program; builder method is only one of
- many builder methods that &SCons; provides
- to build different types of files.
- Another is the &b-link-Object; builder method,
- which tells &SCons; to build an object file
- from the specified source file:
-
- </para>
-
- <scons_example name="Object">
- <file name="SConstruct" printme="1">
- Object('hello.c')
- </file>
- <file name="hello.c">
- int main() { printf("Hello, world!\n"); }
- </file>
- </scons_example>
-
- <para>
-
- Now when you run the &scons; command to build the program,
- it will build just the &hello_o; object file on a POSIX system:
-
- </para>
-
- <scons_output example="Object" os="posix">
- <scons_output_command>scons</scons_output_command>
- </scons_output>
-
- <para>
-
- And just the &hello_obj; object file
- on a Windows system (with the Microsoft Visual C++ compiler):
-
- </para>
-
- <scons_output example="Object" os="win32">
- <scons_output_command>scons</scons_output_command>
- </scons_output>
-
- </section>
-
- <section>
- <title>Simple Java Builds</title>
-
- <para>
-
- &SCons; also makes building with Java extremely easy.
- Unlike the &b-link-Program; and &b-link-Object; builder methods,
- however, the &b-link-Java; builder method
- requires that you specify
- the name of a destination directory in which
- you want the class files placed,
- followed by the source directory
- in which the <filename>.java</filename> files live:
-
- </para>
-
- <scons_example name="java">
- <file name="SConstruct" printme="1">
- Java('classes', 'src')
- </file>
- <file name="src/hello.java">
- public class Example1
- {
- public static void main(String[] args)
- {
- System.out.println("Hello Java world!\n");
- }
- }
- </file>
- </scons_example>
-
- <para>
-
- If the <filename>src</filename> directory
- contains a single <filename>hello.java</filename> file,
- then the output from running the &scons; command
- would look something like this
- (on a POSIX system):
-
- </para>
-
- <scons_output example="java" os="posix">
- <scons_output_command>scons</scons_output_command>
- </scons_output>
-
- <para>
-
- We'll cover Java builds in more detail,
- including building Java archive (<filename>.jar</filename>)
- and other types of file,
- in <xref linkend="chap-java"></xref>.
-
- </para>
-
- </section>
-
- <section>
- <title>Cleaning Up After a Build</title>
-
- <para>
-
- When using &SCons;, it is unnecessary to add special
- commands or target names to clean up after a build.
- Instead, you simply use the
- <literal>-c</literal> or <literal>--clean</literal>
- option when you invoke &SCons;,
- and &SCons; removes the appropriate built files.
- So if we build our example above
- and then invoke <literal>scons -c</literal>
- afterwards, the output on POSIX looks like:
-
- </para>
-
- <scons_example name="clean">
- <file name="SConstruct">
- Program('hello.c')
- </file>
- <file name="hello.c">
- int main() { printf("Hello, world!\n"); }
- </file>
- </scons_example>
-
- <scons_output example="clean" os="posix">
- <scons_output_command>scons</scons_output_command>
- <scons_output_command>scons -c</scons_output_command>
- </scons_output>
-
- <para>
-
- And the output on Windows looks like:
-
- </para>
-
- <scons_output example="clean" os="win32">
- <scons_output_command>scons</scons_output_command>
- <scons_output_command>scons -c</scons_output_command>
- </scons_output>
-
- <para>
-
- Notice that &SCons; changes its output to tell you that it
- is <literal>Cleaning targets ...</literal> and
- <literal>done cleaning targets.</literal>
-
- </para>
-
- </section>
-
- <section>
- <title>The &SConstruct; File</title>
-
- <para>
-
- If you're used to build systems like &Make;
- you've already figured out that the &SConstruct; file
- is the &SCons; equivalent of a &Makefile;.
- That is, the &SConstruct; file is the input file
- that &SCons; reads to control the build.
-
- </para>
-
- <section>
- <title>&SConstruct; Files Are Python Scripts</title>
-
- <para>
-
- There is, however, an important difference between
- 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.
- This User's Guide will introduce you step-by-step
- to the relatively small amount of Python you'll
- need to know to be able to use &SCons; effectively.
- And Python is very easy to learn.
-
- </para>
-
- <para>
-
- 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:
-
- </para>
-
- <programlisting>
- # Arrange to build the "hello" program.
- Program('hello.c') # "hello.c" is the source file.
- </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>
- <title>&SCons; Functions Are Order-Independent</title>
-
- <para>
-
- One important way in which the &SConstruct;
- file is not exactly like a normal Python script,
- and is more like a &Makefile;,
- is that the order in which
- the &SCons; functions are called in
- the &SConstruct; file
- does <emphasis>not</emphasis>
- affect the order in which &SCons;
- actually builds the programs and object files
- you want it to build.<footnote>
- <para>In programming parlance,
- the &SConstruct; file is
- <emphasis>declarative</emphasis>,
- meaning you tell &SCons; what you want done
- and let it figure out the order in which to do it,
- rather than strictly <emphasis>imperative</emphasis>,
- where you specify explicitly the order in
- which to do things.
- </para>
- </footnote>
- In other words, when you call the &b-link-Program; builder
- (or any other builder method),
- you're not telling &SCons; to build
- the program at the instant the builder method is called.
- Instead, you're telling &SCons; to build the program
- that you want, for example,
- a program built from a file named &hello_c;,
- and it's up to &SCons; to build that program
- (and any other files) whenever it's necessary.
- (We'll learn more about how
- &SCons; decides when building or rebuilding a file
- is necessary in <xref linkend="chap-depends"></xref>, below.)
-
- </para>
-
- <para>
-
- &SCons; reflects this distinction between
- <emphasis>calling a builder method like</emphasis> &b-Program;
- and <emphasis>actually building the program</emphasis>
- by printing the status messages that indicate
- when it's "just reading" the &SConstruct; file,
- and when it's actually building the target files.
- This is to make it clear when &SCons; is
- executing the Python statements that make up the &SConstruct; file,
- and when &SCons; is actually executing the
- commands or other actions to
- build the necessary files.
-
- </para>
-
- <para>
-
- Let's clarify this with an example.
- Python has a <literal>print</literal> statement that
- prints a string of characters to the screen.
- If we put <literal>print</literal> statements around
- our calls to the &b-Program; builder method:
-
- </para>
-
- <scons_example name="declarative">
- <file name="SConstruct" printme="1">
- print "Calling Program('hello.c')"
- Program('hello.c')
- print "Calling Program('goodbye.c')"
- Program('goodbye.c')
- print "Finished calling Program()"
- </file>
- <file name="hello.c">
- int main() { printf("Hello, world!\n"); }
- </file>
- <file name="goodbye.c">
- int main() { printf("Goodbye, world!\n"); }
- </file>
- </scons_example>
-
- <para>
-
- Then when we execute &SCons;,
- we see the output from the <literal>print</literal>
- statements in between the messages about
- reading the &SConscript; files,
- indicating that that is when the
- Python statements are being executed:
-
- </para>
-
- <scons_output example="declarative" os="posix">
- <scons_output_command>scons</scons_output_command>
- </scons_output>
-
- <para>
-
- Notice also that &SCons; built the &goodbye; program first,
- even though the "reading &SConscript;" output
- shows that we called <literal>Program('hello.c')</literal>
- first in the &SConstruct; file.
-
- </para>
-
- </section>
-
- </section>
-
- <section>
- <title>Making the &SCons; Output Less Verbose</title>
-
- <para>
-
- You've already seen how &SCons; prints
- some messages about what it's doing,
- surrounding the actual commands used to build the software:
-
- </para>
-
- <scons_output example="ex1" os="win32">
- <scons_output_command>scons</scons_output_command>
- </scons_output>
-
- <para>
-
- These messages emphasize the
- order in which &SCons; does its work:
- all of the configuration files
- (generically referred to as &SConscript; files)
- are read and executed first,
- and only then are the target files built.
- Among other benefits, these messages help to distinguish between
- errors that occur while the configuration files are read,
- and errors that occur while targets are being built.
-
- </para>
-
- <para>
-
- One drawback, of course, is that these messages clutter the output.
- Fortunately, they're easily disabled by using
- the &Q; option when invoking &SCons;:
-
- </para>
-
- <scons_output example="ex1" os="win32">
- <scons_output_command>scons -Q</scons_output_command>
- </scons_output>
-
- <para>
-
- Because we want this User's Guide to focus
- on what &SCons; is actually doing,
- we're going to use the &Q; option
- to remove these messages from the
- output of all the remaining examples in this Guide.
-
- </para>
-
- </section>