| <html> |
| <head> |
| <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> |
| <title>Miscellaneous</title> |
| <link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css"> |
| <meta name="generator" content="DocBook XSL Stylesheets V1.75.2"> |
| <link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset"> |
| <link rel="up" href="../jam.html" title="Chapter 32. Boost.Jam : 3.1.19"> |
| <link rel="prev" href="language.html" title="Language"> |
| <link rel="next" href="history.html" title="History"> |
| </head> |
| <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> |
| <table cellpadding="2" width="100%"><tr> |
| <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td> |
| <td align="center"><a href="../../../index.html">Home</a></td> |
| <td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td> |
| <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> |
| <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> |
| <td align="center"><a href="../../../more/index.htm">More</a></td> |
| </tr></table> |
| <hr> |
| <div class="spirit-nav"> |
| <a accesskey="p" href="language.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../jam.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="history.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> |
| </div> |
| <div class="section"> |
| <div class="titlepage"><div><div><h2 class="title" style="clear: both"> |
| <a name="jam.miscellaneous"></a><a class="link" href="miscellaneous.html" title="Miscellaneous">Miscellaneous</a> |
| </h2></div></div></div> |
| <div class="toc"><dl> |
| <dt><span class="section"><a href="miscellaneous.html#jam.miscellaneous.diagnostics">Diagnostics</a></span></dt> |
| <dt><span class="section"><a href="miscellaneous.html#jam.miscellaneous.bugs__limitations">Bugs, Limitations</a></span></dt> |
| <dt><span class="section"><a href="miscellaneous.html#jam.miscellaneous.fundamentals">Fundamentals</a></span></dt> |
| </dl></div> |
| <div class="section"> |
| <div class="titlepage"><div><div><h3 class="title"> |
| <a name="jam.miscellaneous.diagnostics"></a><a class="link" href="miscellaneous.html#jam.miscellaneous.diagnostics" title="Diagnostics">Diagnostics</a> |
| </h3></div></div></div> |
| <p> |
| In addition to generic error messages, <code class="literal">bjam</code> may emit one |
| of the following: |
| </p> |
| <pre class="programlisting">warning: unknown rule X</pre> |
| <p> |
| A rule was invoked that has not been defined with an "<code class="literal">actions</code>" |
| or "<code class="literal">rule</code>" statement. |
| </p> |
| <pre class="programlisting">using N temp target(s)</pre> |
| <p> |
| Targets marked as being temporary (but nonetheless present) have been found. |
| </p> |
| <pre class="programlisting">updating N target(s)</pre> |
| <p> |
| Targets are out-of-date and will be updated. |
| </p> |
| <pre class="programlisting">can't find N target(s)</pre> |
| <p> |
| Source files can't be found and there are no actions to create them. |
| </p> |
| <pre class="programlisting">can't make N target(s)</pre> |
| <p> |
| Due to sources not being found, other targets cannot be made. |
| </p> |
| <pre class="programlisting">warning: X depends on itself</pre> |
| <p> |
| A target depends on itself either directly or through its sources. |
| </p> |
| <pre class="programlisting">don't know how to make X</pre> |
| <p> |
| A target is not present and no actions have been defined to create it. |
| </p> |
| <pre class="programlisting">X skipped for lack of Y</pre> |
| <p> |
| A source failed to build, and thus a target cannot be built. |
| </p> |
| <pre class="programlisting">warning: using independent target X</pre> |
| <p> |
| A target that is not a dependency of any other target is being referenced |
| with <code class="literal">$(<)</code> or <code class="literal">$(>)</code>. |
| </p> |
| <pre class="programlisting">X removed</pre> |
| <p> |
| <code class="literal">BJam</code> removed a partially built target after being interrupted. |
| </p> |
| </div> |
| <div class="section"> |
| <div class="titlepage"><div><div><h3 class="title"> |
| <a name="jam.miscellaneous.bugs__limitations"></a><a class="link" href="miscellaneous.html#jam.miscellaneous.bugs__limitations" title="Bugs, Limitations">Bugs, Limitations</a> |
| </h3></div></div></div> |
| <p> |
| For parallel building to be successful, the dependencies among files must |
| be properly spelled out, as targets tend to get built in a quickest-first |
| ordering. Also, beware of un-parallelizable commands that drop fixed-named |
| files into the current directory, like <code class="literal">yacc(1)</code> does. |
| </p> |
| <p> |
| A poorly set <code class="literal">$(JAMSHELL)</code> is likely to result in silent |
| failure. |
| </p> |
| </div> |
| <div class="section"> |
| <div class="titlepage"><div><div><h3 class="title"> |
| <a name="jam.miscellaneous.fundamentals"></a><a class="link" href="miscellaneous.html#jam.miscellaneous.fundamentals" title="Fundamentals">Fundamentals</a> |
| </h3></div></div></div> |
| <p> |
| This section is derived from the official Jam documentation and from experience |
| using it and reading the Jambase rules. We repeat the information here mostly |
| because it is essential to understanding and using Jam, but is not consolidated |
| in a single place. Some of it is missing from the official documentation |
| altogether. We hope it will be useful to anyone wishing to become familiar |
| with Jam and the Boost build system. |
| </p> |
| <div class="itemizedlist"><ul class="itemizedlist" type="disc"> |
| <li class="listitem"> |
| Jam "<code class="literal">rules</code>" are actually simple procedural |
| entities. Think of them as functions. Arguments are separated by colons. |
| </li> |
| <li class="listitem"> |
| A Jam <span class="bold"><strong>target</strong></span> is an abstract entity identified |
| by an arbitrary string. The build-in <code class="literal">DEPENDS</code> rule |
| creates a link in the dependency graph between the named targets. |
| </li> |
| <li class="listitem"> |
| Note that the original Jam documentation for the built-in <code class="literal">INCLUDES</code> |
| rule is incorrect: <code class="literal">INCLUDES <span class="emphasis"><em>targets1</em></span> : |
| <span class="emphasis"><em>targets2</em></span></code> causes everything that depends |
| on a member of <span class="emphasis"><em>targets1</em></span> to depend on all members |
| of <span class="emphasis"><em>targets2</em></span>. It does this in an odd way, by tacking |
| <span class="emphasis"><em>targets2</em></span> onto a special tail section in the dependency |
| list of everything in <span class="emphasis"><em>targets1</em></span>. It seems to be OK |
| to create circular dependencies this way; in fact, it appears to be the |
| "right thing to do" when a single build action produces both |
| <span class="emphasis"><em>targets1</em></span> and <span class="emphasis"><em>targets2</em></span>. |
| </li> |
| <li class="listitem"> |
| When a rule is invoked, if there are <code class="literal">actions</code> declared |
| with the same name as the rule, the actions are added to the updating |
| actions for the target identified by the rule's first argument. It is |
| actually possible to invoke an undeclared rule if corresponding actions |
| are declared: the rule is treated as empty. |
| </li> |
| <li class="listitem"> |
| Targets (other than <code class="literal">NOTFILE</code> targets) are associated |
| with paths in the file system through a process called binding. Binding |
| is a process of searching for a file with the same name as the target |
| (sans grist), based on the settings of the target-specific <code class="literal">SEARCH</code> |
| and <code class="literal">LOCATE</code> variables. |
| </li> |
| <li class="listitem"> |
| <p class="simpara"> |
| In addition to local and global variables, jam allows you to set a variable |
| <code class="literal">on</code> a target. Target-specific variable values can usually |
| not be read, and take effect only in the following contexts: |
| </p> |
| <div class="itemizedlist"><ul class="itemizedlist" type="circle"> |
| <li class="listitem"> |
| In updating actions, variable values are first looked up <code class="literal">on</code> |
| the target named by the first argument (the target being updated). |
| Because Jam builds its entire dependency tree before executing actions, |
| Jam rules make target-specific variable settings as a way of supplying |
| parameters to the corresponding actions. |
| </li> |
| <li class="listitem"> |
| Binding is controlled <span class="emphasis"><em>entirely</em></span> by the target-specific |
| setting of the <code class="literal">SEARCH</code> and <code class="literal">LOCATE</code> |
| variables, as described here. |
| </li> |
| <li class="listitem"> |
| In the special rule used for header file scanning, variable values |
| are first looked up <code class="literal">on</code> the target named by the |
| rule's first argument (the source file being scanned). |
| </li> |
| </ul></div> |
| </li> |
| <li class="listitem"> |
| The "bound value" of a variable is the path associated with |
| the target named by the variable. In build actions, the first two arguments |
| are automatically replaced with their bound values. Target-specific variables |
| can be selectively replaced by their bound values using the <code class="literal">bind</code> |
| action modifier. |
| </li> |
| <li class="listitem"> |
| Note that the term "binding" as used in the Jam documentation |
| indicates a phase of processing that includes three sub-phases: <span class="emphasis"><em>binding</em></span> |
| (yes!), update determination, and header file scanning. The repetition |
| of the term "binding" can lead to some confusion. In particular, |
| the Modifying Binding section in the Jam documentation should probably |
| be titled "Modifying Update Determination". |
| </li> |
| <li class="listitem"> |
| <p class="simpara"> |
| "Grist" is just a string prefix of the form <<span class="emphasis"><em>characters</em></span>>. |
| It is used in Jam to create unique target names based on simpler names. |
| For example, the file name "<code class="literal">test.exe</code>" may |
| be used by targets in separate subprojects, or for the debug and release |
| variants of the "same" abstract target. Each distinct target |
| bound to a file called "test.exe" has its own unique grist |
| prefix. The Boost build system also takes full advantage of Jam's ability |
| to divide strings on grist boundaries, sometimes concatenating multiple |
| gristed elements at the beginning of a string. Grist is used instead |
| of identifying targets with absolute paths for two reasons: |
| </p> |
| <div class="orderedlist"><ol class="orderedlist" type="1"> |
| <li class="listitem"> |
| The location of targets cannot always be derived solely from what |
| the user puts in a Jamfile, but sometimes depends also on the binding |
| process. Some mechanism to distinctly identify targets with the same |
| name is still needed. |
| </li> |
| <li class="listitem"> |
| Grist allows us to use a uniform abstract identifier for each built |
| target, regardless of target file location (as allowed by setting |
| ALL_LOCATE_TARGET). |
| </li> |
| </ol></div> |
| </li> |
| <li class="listitem"> |
| When grist is extracted from a name with $(var:G), the result includes |
| the leading and trailing angle brackets. When grist is added to a name |
| with $(var:G=expr), existing grist is first stripped. Then, if expr is |
| non-empty, leading <s and trailing >s are added if necessary to |
| form an expression of the form <expr2>; <expr2> is then prepended. |
| </li> |
| <li class="listitem"> |
| When Jam is invoked it imports all environment variable settings into |
| corresponding Jam variables, followed by all command-line (-s...) variable |
| settings. Variables whose name ends in PATH, Path, or path are split |
| into string lists on OS-specific path-list separator boundaries (e.g. |
| ":" for UNIX and ";" for Windows). All other variables |
| are split on space (" ") boundaries. Boost Jam modifies that |
| behavior by allowing variables to be quoted. |
| </li> |
| <li class="listitem"> |
| A variable whose value is an empty list or which consists entirely of |
| empty strings has a negative logical value. Thus, for example, code like |
| the following allows a sensible non-empty default which can easily be |
| overridden by the user: |
| <pre class="programlisting"><span class="identifier">MESSAGE</span> <span class="special">?\=</span> <span class="identifier">starting</span> <span class="identifier">jam</span><span class="special">...</span> <span class="special">;</span> |
| <span class="keyword">if</span> <span class="error">$</span><span class="special">(</span><span class="identifier">MESSAGE</span><span class="special">)</span> <span class="special">{</span> <span class="identifier">ECHO</span> <span class="identifier">The</span> <span class="identifier">message</span> <span class="identifier">is</span><span class="special">:</span> <span class="error">$</span><span class="special">(</span><span class="identifier">MESSAGE</span><span class="special">)</span> <span class="special">;</span> <span class="special">}</span> |
| </pre> |
| If the user wants a specific message, he invokes jam with <code class="literal">"-sMESSAGE=message |
| text"</code>. If he wants no message, he invokes jam with <code class="literal">-sMESSAGE=</code> |
| and nothing at all is printed. |
| </li> |
| <li class="listitem"> |
| <p class="simpara"> |
| The parsing of command line options in Jam can be rather unintuitive, |
| with regards to how other Unix programs accept options. There are two |
| variants accepted as valid for an option: |
| </p> |
| <div class="orderedlist"><ol class="orderedlist" type="1"> |
| <li class="listitem"> |
| <code class="literal">-xvalue</code>, and |
| </li> |
| <li class="listitem"> |
| <code class="literal">-x value</code>. |
| </li> |
| </ol></div> |
| </li> |
| </ul></div> |
| </div> |
| </div> |
| <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> |
| <td align="left"></td> |
| <td align="right"><div class="copyright-footer">Copyright © 2003-2007 Rene Rivera, David Abrahams, Vladimir Prus<p> |
| Distributed under the Boost Software License, Version 1.0. (See accompanying |
| file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) |
| </p> |
| </div></td> |
| </tr></table> |
| <hr> |
| <div class="spirit-nav"> |
| <a accesskey="p" href="language.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../jam.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="history.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> |
| </div> |
| </body> |
| </html> |