Jam.html #2

  • //
  • guest/
  • dick_dunbar/
  • jam/
  • src/
  • Jam.html
  • View
  • Commits
  • Open Download .zip Download (46 KB)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>

<HEAD>
	<META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=iso-8859-1">
<META NAME="VPSiteProject" CONTENT="file:///D|/rld/Docs/Project.vpp">

	<META NAME="GENERATOR" Content="Visual Page 2.0 for Windows">
	<TITLE>Jam - Make(1) Redux</TITLE>
</HEAD>

<BODY>

<H1 ALIGN="CENTER">Jam - Command</H1>
<P ALIGN="CENTER">The <A HREF="http://ddunbar/Analytics/Jam/Jam.html">Jam</A> Executable</P>

<DL>
	<H2>USAGE</H2>
	<PRE>jam [ -a ] [ -g ] [ -n ] [ -q ] [ -v ]
    [ -d <I>display</I> ]
    [ -f <I>Jambase</I> ]
    [ -j <I>jobs</I> ]
    [ -o <I>actionsfile</I> ]
    [ -s <I>var</I>=<I>value</I> ]
    [ -t <I>target</I> ]
    [ <I>target</I> ... ]</PRE>
	<P>
	<H2>DESCRIPTION</H2>
	<P><B>Jam</B> is a program construction tool, like <B>make</B>(1).</P>
	<P><B>Jam</B> recursively builds target files from source files, using dependency information and updating actions
	expressed in the Jambase file, which is written in <B>jam</B>'s own interpreted language. The default Jambase is
	compiled into <B>jam</B> and provides a boilerplate for common use, relying on a user-provide file &quot;Jamfile&quot;
	to enumerate actual targets and sources.</P>
	<P>The Jambase is described in the <A HREF="Jambase.html">Jambase Reference</A> and the document <A HREF="Jamfile.html">Using
	Jamfile, Jamrules and Jambase</A>.</P>
	<H2><A NAME="options"></A>OPTIONS</H2>
	<P>If <I>target</I> is provided on the command line, <B>jam</B> builds <I>target;</I> otherwise <B>jam</B> builds
	the target 'all'.</P>
	<P><B>Jam</B> may be invoked with the following options:</P>
	<P>
	<TABLE BORDER="1" CELLPADDING="2" WIDTH="85%">
<tbody>       																				<TR>
			<TD WIDTH="20%" VALIGN="TOP"><CODE> -a</CODE></TD>
			<TD>Build all targets anyway, even if they are up-to-date.</TD>
		</TR>
		<TR>
			<TD WIDTH="20%" VALIGN="TOP"><CODE>-d <I>c<BR>
				-d n<BR>
				-d +n</I></CODE></TD>
			<TD>Display: <BR>
				change default option to <I>c</I><BR>
				change default option to 1 thru n<BR>
				add default option +n <BR>
				<BR>
				
				<TABLE BORDER="1" WIDTH="100%">
					<TR>
						<TD WIDTH="7%">
							<P ALIGN="CENTER">a
						</TD>
						<TD WIDTH="93%">Show summary info, actions, quiet actions, temporary targets (-d2)</TD>
					</TR>
					<TR>
						<TD WIDTH="7%">
							<P ALIGN="CENTER">c
						</TD>
						<TD WIDTH="93%">Show the cause (file names) cause rebuilds; new sources, missing targets</TD>
					</TR>
					<TR>
						<TD WIDTH="7%">
							<P ALIGN="CENTER">d
						</TD>
						<TD WIDTH="93%">Display a dependency graph (in <B>jam</B> syntax).</TD>
					</TR>
					<TR>
						<TD WIDTH="7%">
							<P ALIGN="CENTER">m
						</TD>
						<TD WIDTH="93%">Display the dependency analysis, and target/source timestamps and paths (-d3)</TD>
					</TR>
					<TR>
						<TD WIDTH="7%">
							<P ALIGN="CENTER">x
						</TD>
						<TD WIDTH="93%">Show shell arguments (-d2)</TD>
					</TR>
					<TR>
						<TD WIDTH="7%">
							<P ALIGN="CENTER">0
						</TD>
						<TD WIDTH="93%">Turn off all display. Only errors are emitted.</TD>
					</TR>
					<TR>
						<TD WIDTH="7%">
							<P ALIGN="CENTER">1
						</TD>
						<TD WIDTH="93%">Show actions and summary info (the default)</TD>
					</TR>
					<TR>
						<TD WIDTH="7%">
							<P ALIGN="CENTER">3
						</TD>
						<TD WIDTH="93%">dependency analysis (-dm)</TD>
					</TR>
					<TR>
						<TD WIDTH="7%">
							<P ALIGN="CENTER">5
						</TD>
						<TD WIDTH="93%">Show rule invocations and variable expansions</TD>
					</TR>
					<TR>
						<TD WIDTH="7%">
							<P ALIGN="CENTER">6
						</TD>
						<TD WIDTH="93%">Show directory/header file/archive scans</TD>
					</TR>
					<TR>
						<TD WIDTH="7%">
							<P ALIGN="CENTER">7
						</TD>
						<TD WIDTH="93%">Show variable settings</TD>
					</TR>
					<TR>
						<TD WIDTH="7%">
							<P ALIGN="CENTER">8
						</TD>
						<TD WIDTH="93%">Show variable fetches</TD>
					</TR>
					<TR>
						<TD WIDTH="7%">
							<P ALIGN="CENTER">9
						</TD>
						<TD WIDTH="93%">Show variable manipulation, scanner tokens</TD>
					</TR>
				</TABLE>
			</TD>
		</TR>
		<TR>
			<TD WIDTH="20%" VALIGN="TOP"><CODE> -f <I>Jambase</I></CODE></TD>
			<TD>Read <I>Jambase</I> instead of using the built-in Jambase. <BR>
				Multiple -f flags are permitted.</TD>
		</TR>
		<TR>
			<TD WIDTH="20%" VALIGN="TOP"><CODE> -g</CODE></TD>
			<TD>Build targets with the newest sources first, rather than the order of appearance in the Jambase/Jamfiles.</TD>
		</TR>
		<TR>
			<TD WIDTH="20%" VALIGN="TOP"><CODE> -j <I>n</I></CODE></TD>
			<TD>Run up to <I>n</I> shell commands concurrently. The default is 1.</TD>
		</TR>
		<TR>
			<TD WIDTH="20%" VALIGN="TOP"><CODE> -n</CODE></TD>
			<TD>Don't actually execute the updating actions, but do everything else. This changes the debug level to -dax.</TD>
		</TR>
		<TR>
			<TD WIDTH="20%" VALIGN="TOP"><CODE> -o <I>file</I></CODE></TD>
			<TD>Write the updating actions to the specified file instead of running them. These are the actual compiler commands;
				 different from the output from -dx.</TD>
		</TR>
		<TR>
			<TD WIDTH="20%" VALIGN="TOP"><CODE> -q</CODE></TD>
			<TD>Quit quickly (as if an interrupt was received) as soon as any target build fails.</TD>
		</TR>
		<TR>
			<TD WIDTH="20%" VALIGN="TOP"><CODE> -s <I>var</I>=<I>value</I></CODE></TD>
			<TD>Set the variable <I>var</I> to <I>value</I>, overriding both internal variables and variables imported from the
				environment.</TD>
		</TR>
		<TR>
			<TD WIDTH="20%" VALIGN="TOP"><CODE> -t <I>target</I></CODE></TD>
			<TD>Touch <I>target</I> and rebuild everything that depends on it, even if it is up-to-date.</TD>
		</TR>
		<TR>
			<TD WIDTH="20%" VALIGN="TOP"><CODE> -v</CODE></TD>
			<TD>Print the version of <B>jam</B> and exit.</TD>
		</TR>
</tbody>    										</TABLE>
</P>
	<H2>OPERATION</H2>
	<P><B>Jam</B> has four phases of operation: start-up, parsing, binding, and updating.</P>
	<H3>Start-up</H3>
	<P>Upon start-up, <B>jam</B> imports environment variable settings into <B>jam</B> variables. Environment variables
	are split at blanks with each word becoming an element in the variable's list of values. Environment variables
	whose names end in PATH are split at $(SPLITPATH) characters (e.g., &quot;:&quot; for Unix).</P>
	<P>To set a variable's value on the command line, overriding the variable's environment value, use the -s option.
	To see variable assignments made during <B>jam</B>'s execution, use the -d+7 option.</P>
	<H3>Parsing</H3>
	<P>In the parsing phase, <B>jam</B> reads and executes the Jambase file, by default the built-in one. It is written
	in the <B>jam</B> language. See <A HREF="#language">Language</A> below. The last action of the Jambase is to read
	(via the &quot;include&quot; rule) a user-provided file called &quot;Jamfile&quot;.</P>
	<P>Collectively, the purpose of the Jambase and the Jamfile is to name built target and source files, construct
	the dependency graph among them, and associate build actions with targets. The Jambase defines boilerplate rules
	and variable assignments, and the Jamfile uses these to specify the actual relationship among the target and source
	files. See the <A HREF="Jambase.html">Jambase Reference</A> and the document <A HREF="Jamfile.html">Using Jamfiles
	and Jambase</A> for information. <A NAME="binding"></A></P>
	<H3><A NAME="binding"></A> Binding</H3>
	After parsing, <B>jam</B> recursively descends the dependency graph and binds every file target with a location
	in the filesystem.
	<P>
	<H5><A NAME="targets"></A><FONT SIZE="4">Targets</FONT></H5>
	<DD>Any string value in <B>jam</B> can represent a target, and it does so if the Depends or Includes rules make
	it part of the dependency graph. Build targets are files to be updated. Source targets are the files used in updating
	build targets. Build targets and source targets are collectively referred to as file targets, and frequently build
	targets are source targets for other build targets. Pseudotargets are symbols which represent dependencies on other
	targets, but which are not themselves associated with any real file.
	<P>A file target's identifier is generally the file's name, which can be absolutely rooted, relative to the directory
	of <B>jam</B>'s invocation, or simply local (no directory). Most often it is the last case, and the actual file
	path is bound using the $(SEARCH) and $(LOCATE) special variables. See <A HREF="#search">SEARCH and LOCATE Variables</A>
	below. A local filename is optionally qualified with &quot;grist,&quot; a string value used to assure uniqueness.
	A file target with an identifier of the form <I>file(member)</I> is a library member (usually an ar(1) archive
	on UNIX).</P>
	<P>The use of $(SEARCH) and $(LOCATE) allows <B>jam</B> to separate the the location of files from their names,
	so that Jamfiles can refer to files locally (i.e. relative to the Jamfile's directory), yet still be usable when
	<B>jam</B> is invoked from a distant directory. The use of grist allows files with the same name to be identified
	uniquely, so that <B>jam</B> can read a whole directory tree of Jamfiles and not mix up same-named targets.</P>
	<P><B>ToDo: </B>LOCATE_SEARCH and LOCATE_TARGET
	<H5><FONT SIZE="4">Update Determination</FONT></H5>
	After binding each target, <B>jam</B> determines whether the target needs updating, and if so marks the target
	for the updating phase. A target is normally so marked if it is missing, it is older than any of its sources, or
	any of its sources are marked for updating. This behavior can be modified by the application of special built-in
	rules. See <A HREF="#bindingmods">Modifying Binding</A> below.
	<P>
	<H5><FONT SIZE="4">Header File Scanning</FONT></H5>
	During the binding phase, <B>jam</B> also performs header file scanning, where it looks inside source files for
	the implicit dependencies on other files caused by C's #include syntax. This is controlled by the special variables
	$(HDRSCAN) and $(HDRRULE). The result of the scan is formed into a rule invocation, with the scanned file as the
	target and the found included file names as the sources. Note that this is the only case where rules are invoked
	outside the parsing phase. See <A HREF="#hdrscan">HDRSCAN and HDRRULE Variables</A> below.
	<DT></DT>
	<P>
	<H3>Updating</H3>
	<P>After binding, <B>jam</B> again recursively descends the dependency graph, this time executing the update actions
	for each target marked for update during the binding phase. If a target's updating actions fail, then all other
	targets which depend on that target are skipped.</P>
	<P>The -j flag instructs <B>jam</B> to build more than one target at a time. If there are multiple actions on a
	single target, they are run sequentially. The -g flag reorders builds so that targets with newest sources are built
	first. Normally, they are built in the order of appearance in the Jamfiles.</P>
	<H2><A NAME="language"></A> LANGUAGE</H2>
	<H3>Overview</H3>
	<DD><B>Jam</B> has an interpreted, procedural language with a few select features to effect program construction.
	Statements in <B>jam</B> are rule (procedure) definitions, rule invocations, updating action definitions, flow-of-control
	structures, variable assignments, and sundry language support.
	<P>
	<H3>Lexical Features</H3>
	<P><B>Jam</B> treats its input files as whitespace-separated tokens, with two exceptions: double quotes (&quot;)
	can enclose whitespace to embed it into a token, and everything between the matching curly braces ({}) in the definition
	of updating actions is treated as a single string. A backslash (\) can escape a double quote, or any single whitespace
	character. <B>ToDo: </B>rephrase this.</P>
	<P><B>Jam</B> requires whitespace (blanks, tabs, or newlines) to surround all tokens, <B>including the colon (:)
	and semicolon (;) tokens</B>.</P>
	<P><B>Jam</B> keywords (as mentioned in this document) are reserved and generally must be quoted with double quotes
	(&quot;) to be used as arbitrary tokens, such as variable or target names.</P>
	<P><B>Name conventions:<BR>
	</B>
	<TABLE BORDER="1" WIDTH="63%">
		<TR>
			<TD WIDTH="12%"><I>lowercase</I></TD>
			<TD WIDTH="88%">pseudo target names (<FONT SIZE="2" FACE="Courier New, Courier">all, clean, obj, exe </FONT>... ), language syntax
				(<FONT SIZE="2" FACE="Courier New, Courier">if, on, case</FONT> ...)</TD>
		</TR>
		<TR>
			<TD WIDTH="12%"><I>InitialCap</I></TD>
			<TD WIDTH="88%">rule name convention</TD>
		</TR>
		<TR>
			<TD WIDTH="12%"><I>UPPER</I></TD>
			<TD WIDTH="88%">variable name convention</TD>
		</TR>
	</TABLE>

	<H3>Datatype</H3>
	<P><B>Jam</B>'s only data type is a one-dimensional list of arbitrary strings. <BR>
	They arise as literal (whitespace-separated) tokens in the Jambase or included files, as the result of variable
	expansion of those tokens, or as the return value from a rule invocation.</P>
	<H3>Rules</H3>
	<P>The basic <B>jam</B> language entity is called a rule. A rule is simply a procedure definition, with a body
	of <B>jam</B> statements to be run when the rule is invoked. The syntax of rule invocation makes it possible to
	write Jamfiles that look a bit like Makefiles.</P>
	<P>Rules take up to 9 arguments ($(1) through $(9), each a list) and can have a return value (a single list). <BR>
	A rule's return value can be expanded in a list by enclosing the rule invocation with <TT>[</TT> and <TT>]</TT>.
	<B>ToDo: </B>examples<BR>
	$(&lt;) is a synonym for $(1) ... the argument before the (<B>:</B>)<BR>
	$(&gt;) is a synonym for $(2) ... the argument after the (<B>:</B>) <B>ToDo: </B>so where are $(3) - $(9) ?</P>
	<H3>Updating Actions</H3>
	<P>A rule may have updating actions associated with it, in which case arguments $(1) and $(2) are treated as built
	targets and sources, respectively. Updating actions are the OS shell commands to execute when updating the built
	targets of the rule.</P>
	<P>When a rule with updating actions is invoked, the actions are added to those associated with its built targets
	($(1)) before the rule's procedure is run. To build the targets in the updating phase, the actions are passed to
	the OS command shell ($JAMSHELL), with $(1) and $(2) replaced by bound versions of the target names. See <A HREF="#binding">Binding</A>
	above.</P>
	<H3>Statements</H3>
	<P><B>Jam</B>'s language has the following statements: <BR>
	<B>ToDo: </B>what happened to &quot;set&quot;? &quot;set variable&quot; ??
</DL>

<P>
<TABLE BORDER="0">
	<CAPTION>
		<P>actions <I>Rule</I> { <I>commands</I> ; }
	</CAPTION>
<BLOCKQUOTE>
			<P>Causes jam to invoke <I>commands </I>to build the target specified by <I>Rule</I> name.
		</BLOCKQUOTE>
	</CAPTION>
					<TR>
		<TD WIDTH="15%">
			<P ALIGN="CENTER"><CODE>bind <I>vars</I></CODE>
		</TD>
		<TD>$(vars) will be replaced with bound values.</TD>
	</TR>
	<TR>
		<TD WIDTH="15%">
			<P ALIGN="CENTER"><CODE>existing</CODE>
		</TD>
		<TD>$(&gt;) includes only source targets that currently exist.</TD>
	</TR>
	<TR>
		<TD WIDTH="15%">
			<P ALIGN="CENTER"><CODE>ignore</CODE>
		</TD>
		<TD>The return status of the <I>commands</I> is ignored.</TD>
	</TR>
	<TR>
		<TD WIDTH="15%">
			<P ALIGN="CENTER"><CODE>piecemeal</CODE>
		</TD>
		<TD><I>commands</I> are repeatedly invoked with a subset of $(&gt;) small enough to fit in the command buffer on this
			OS.</TD>
	</TR>
	<TR>
		<TD WIDTH="15%">
			<P ALIGN="CENTER"><CODE>quietly</CODE>
		</TD>
		<TD>The action is not echoed to the standard output.</TD>
	</TR>
	<TR>
		<TD WIDTH="15%">
			<P ALIGN="CENTER"><CODE>together</CODE>
		</TD>
		<TD>The $(&gt;) from multiple invocations of the same action on the same built target are glommed together.</TD>
	</TR>
	<TR>
		<TD WIDTH="15%">
			<P ALIGN="CENTER"><CODE>updated</CODE>
		</TD>
		<TD>$(&gt;) includes only source targets themselves marked for updating.</TD>
	</TR>
</tbody>                
<B>ToDo: </B>Where does NoCare fit in?</P>
					<P>
					<DT><CODE>break</CODE></DT>
					<P>
					<DD>Breaks out of the closest enclosing <I>for</I> or <I>while</I> loop.
					<P>
					<DT><CODE>continue</CODE></DT>
					<P>
					<DD>Jumps to the end of the closest enclosing <I>for</I> or <I>while</I> loop.
					<P>
					<DT><CODE>for <I>var</I> in <I>list</I> { <I>statements</I> }</CODE></DT>
					<P>
					<DD>Executes <I>statements</I> for each element in <I>list</I>, setting the variable <I>var</I> to the element
					value. <A NAME="if"></A>
					<P>
					<DT><A NAME="if"></A><CODE> if <I>cond</I> { <I>statements</I> } [ else <I>statement</I> ]</CODE></DT>
					<P>
					<DD>Does the obvious; the else clause is optional. <I>cond</I> is built of: 
					<TABLE BORDER="1" WIDTH="587">
<tbody>                       																														<TR>
		<TD WIDTH="15%">
			<P ALIGN="CENTER"><CODE><I>a</I></CODE>
		</TD>
		<TD>true if any <I>a</I> element is a non-zero-length string</TD>
	</TR>
	<TR>
		<TD WIDTH="15%">
			<P ALIGN="CENTER"><CODE><I>a</I> = <I>b</I></CODE>
		</TD>
		<TD>list <I>a</I> matches list <I>b</I> string-for-string</TD>
	</TR>
	<TR>
		<TD WIDTH="15%">
			<P ALIGN="CENTER"><CODE><I>a</I> != <I>b</I></CODE>
		</TD>
		<TD>list <I>a</I> does not match list <I>b</I></TD>
	</TR>
	<TR>
		<TD WIDTH="15%">
			<P ALIGN="CENTER"><CODE><I>a</I> &lt; <I>b</I></CODE>
		</TD>
		<TD><I>a[i]</I> string is less than <I>b[i]</I> string, where <I>i</I> is first mismatched element in lists <I>a</I>
			and <I>b</I></TD>
	</TR>
	<TR>
		<TD WIDTH="15%">
			<P ALIGN="CENTER"><CODE><I>a</I> &lt;= <I>b</I></CODE>
		</TD>
		<TD>every <I>a</I> string is less than or equal to its <I>b</I> counterpart</TD>
	</TR>
	<TR>
		<TD WIDTH="15%">
			<P ALIGN="CENTER"><CODE><I>a</I> &gt; <I>b</I></CODE>
		</TD>
		<TD><I>a[i]</I> string is greater than <I>b[i]</I> string, where <I>i</I> is first mismatched element</TD>
	</TR>
	<TR>
		<TD WIDTH="15%">
			<P ALIGN="CENTER"><CODE><I>a</I> &gt;= <I>b</I></CODE>
		</TD>
		<TD>every <I>a</I> string is greater than or equal to its <I>b</I> counterpart</TD>
	</TR>
	<TR>
		<TD WIDTH="15%">
			<P ALIGN="CENTER"><CODE><I>a</I> in <I>b</I></CODE>
		</TD>
		<TD>true if all elements of <I>a</I> can be found in <I>b</I>, or if <I>a</I> has no elements</TD>
	</TR>
	<TR>
		<TD WIDTH="15%">
			<P ALIGN="CENTER"><CODE>! <I>cond</I></CODE>
		</TD>
		<TD>condition not true</TD>
	</TR>
	<TR>
		<TD WIDTH="15%">
			<P ALIGN="CENTER"><CODE><I>cond</I> &amp;&amp; <I>cond</I></CODE>
		</TD>
		<TD>conjunction</TD>
	</TR>
	<TR>
		<TD WIDTH="15%">
			<P ALIGN="CENTER"><CODE><I>cond</I> || <I>cond</I></CODE>
		</TD>
		<TD>disjunction</TD>
	</TR>
	<TR>
		<TD WIDTH="15%">
			<P ALIGN="CENTER"><CODE>( <I>cond</I> )</CODE>
		</TD>
		<TD>precedence grouping</TD>
	</TR>
</tbody>                    																				</TABLE>
</P>
<P><CODE>include <I>file</I> ;</CODE>

<DL>
	<DD>Causes <B>jam</B> to read the named <I>file</I>. The file is bound like a regular target (see <A HREF="#binding">Binding</A>
	above) but unlike a regular target the include file cannot be built. Marking an include file target with the <B>NoCare</B>
	rule makes it optional: if it is missing, it causes no error.
	<P>The include file is inserted into the input stream during the parsing phase. The primary input file and all
	the included file(s) are treated as a single file; that is, <B>jam</B> infers no scope boundaries from included
	files.</P>
	<P>
	<DT><CODE>local <I>vars</I> [ = <I>values</I> ] ;</CODE></DT>
	<P>
	<DD>Creates new <I>vars</I> inside to the enclosing {} block, obscuring any previous values they might have. The
	previous values for <I>vars</I> are restored when the current block ends. Any rule called or file included will
	see the local and not the previous value (this is sometimes called Dynamic Scoping). The local statement may appear
	anywhere, even outside of a block (in which case the previous value is restored when the input ends). The <I>vars</I>
	are initialized to <I>values</I> if present, or left uninitialized otherwise.
	<P>
	<DT><CODE>on <I>target</I> <I>statement</I> ;</CODE></DT>
	<P>
	<DD>Run <I>statement</I> under the influence of <I>target</I>'s target-specific variables. These variables become
	local copies during <I>statement</I>'s run, but they may be updated as target-specific variables using the usual
	&quot;<I>variable</I> on <I>targets</I> =&quot; syntax.
	<P>
	<DT><CODE>return <I>values</I> ;</CODE></DT>
	<P>
	<DD>Within a rule body, the return statement sets the return value for an invocation of the rule and terminates
	the rule's execution.
	<P>
	<DT><CODE>rule <I>Rulename</I> [ : <I>vars</I> ] { <I>statements</I> }</CODE></DT>
	<P>
	<DD>Define a rule's procedure, replacing any previous definition. If <I>vars</I> are provided, they are assigned
	the values of the parameters ($(1) to $(9)) when <I>statements</I> are executed, as with the <B>local</B> statement.
	<DT>set <I>var</I> = <I>value</I> ; <B></B></DT>
	<DD>Assigns a value to symbol.
	<P>
	<DT><A NAME="switch"></A><CODE> switch <I>value</I> {</CODE></DT>
	<DL>
		<DT><CODE>case <I>pattern1</I> : <I>statements</I> ; <BR>
		case <I>pattern2</I> : <I>statements</I> ; <BR>
		... <BR>
		}</CODE></DT>
	</DL>
	<DD>The switch statement executes zero or one of the enclosed <I>statements</I>, depending on which, if any, is
	the first case whose <I>pattern</I> matches <I>value</I>. The <I>pattern</I> values are not variable-expanded.
	The <I>pattern</I> values may include the following wildcards: 
	<TABLE BORDER="0">
<tbody>                       																																				<TR>
			<TD><CODE> ?</CODE></TD>
			<TD>match any single character</TD>
		</TR>
		<TR>
			<TD><CODE> *</CODE></TD>
			<TD>match zero or more characters</TD>
		</TR>
		<TR>
			<TD><CODE> [<I>chars</I>]</CODE></TD>
			<TD>match any single character in <I>chars</I></TD>
		</TR>
		<TR>
			<TD><CODE> [^<I>chars</I>]</CODE></TD>
			<TD>match any single character not in <I>chars</I></TD>
		</TR>
		<TR>
			<TD><CODE> \<I>x</I></CODE></TD>
			<TD>match <I>x</I> (escapes the other wildcards)</TD>
		</TR>
</tbody>                    																										</TABLE>

	<DT><CODE>while <I>cond</I> { <I>statements</I> }</CODE></DT>
	<P>
	<DD>Repeatedly execute <I>statements</I> while <I>cond</I> remains true upon entry. (See the description of <I>cond</I>
	expression syntax under <A HREF="#if">if</A>, above).
	<P>
</DL>

<H3>Flow-of-Control</H3>
<P>In addition to statements for defining and invoking rules and setting variables, the Jam language contains statements
for flow-of-control and file inclusion. The statements are:</P>
<PRE>    if &lt;cond&gt; { &lt;statements&gt; } [ else { &lt;statements&gt; } ]
    for &lt;var&gt; in &lt;list&gt; { &lt;statements&gt; } 
    while &lt;cond&gt; { &lt;statements&gt; } ;
    switch &lt;value&gt; { case &lt;pattern1&gt; : &lt;statements&gt; ; ... }
    break ;
    continue ;
    return &lt;values&gt; ;
    include &lt;file&gt; ;
</PRE>
<P>The <CITE>if</CITE> statement does the obvious; the &lt;condition&gt; is the usual mix of comparison and logical
operators applied to variables.</P>
<P>The <CITE>for</CITE> statement iterates over the elements of &lt;value&gt;, assigning the (global) variable
&lt;var&gt; to each element and executing the statement block.</P>
<P>The <CITE>switch</CITE> statement executes the statement block whose case &lt;value&gt; matches the switch's
&lt;value&gt;.</P>
<P>The <CITE>include</CITE> statement sources another file containing Jam statements. </tbody></P>
<P>
<H3>Variables</H3>
<P><B>Jam</B> variables are lists of zero or more elements, with each element being a string value. An undefined
variable is indistinguishable from a variable with an empty list, however, a defined variable may have one more
elements which are null strings. All variables are referenced as $(<I>variable</I>) or with modifiers $(<I>variable:BS</I>).</P>

<P>Variables are either global or target-specific. In the latter case, the variable takes on the given value only
during the target's binding, header file scanning, and updating; and during the &quot;on <I>target</I> <I>statement</I>&quot;
statement.</P>
<P>
<TABLE BORDER="0" WIDTH="75%">
	<CAPTION><B>A variable is defined with:</B></CAPTION>
<tbody>       														<TR>
		<TD><CODE><I>variable</I> = <I>elements</I> ;<BR>
			<I>variable</I> += <I>elements</I> ;<BR>
			<I>variable =+ elements ; <B>ToDo: Unique addition of element</B></I><BR>
			<I>variable</I> ?= <I>elements</I> ;<BR>
			<I>variable</I> on <I>targets</I> = <I>elements</I> ;<BR>
			<I>variable</I> on <I>targets</I> += <I>elements</I> ;<BR>
			<I>variable</I> on <I>targets</I> ?= <I>elements</I> ;<BR>
			<I>set variable = elements ;</I></CODE></TD>
	</TR>
</tbody>    				</TABLE>
</P>
<P>The first three forms set <I>variable</I> globally. The last three forms set a target-specific variable. The
= operator replaces any previous elements of <I>variable</I> with <I>elements</I>; the += operation adds <I>elements</I>
to <I>variable</I>'s list of elements; the ?= operator sets <I>variable</I> only if it was previously unset. The
last form &quot;<I>variable</I> on <I>targets</I> ?= <I>elements</I>&quot; checks to see if the target-specific,
not the global, variable is set.</P>
<P>Variables referenced in updating commands will be replaced with their values; target-specific values take precedence
over global values. Variables passed as arguments ($(1) and $(2)) to actions are replaced with their bound values;
the &quot;bind&quot; modifier can be used on actions to cause other variables to be replaced with bound values.
See <A HREF="#actionmods">Action Modifiers</A> above.</P>
<P><B>Jam</B> variables are not re-exported to the environment of the shell that executes the updating actions,
but the updating actions can reference <B>jam</B> variables with $(<I>variable</I>).</P>
<H3><A NAME="varexp"></A> Variable Expansion</H3>

<DL>
	<DD>
	<P>During parsing, <B>jam</B> performs variable expansion on each token that is not a keyword or rule name. Such
	tokens with embedded variable references are replaced with zero or more tokens. Variable references are of the
	form $(<I>v</I>) or $(<I>vm</I>), where <I>v</I> is the variable name, and <I>m</I> are optional modifiers. For
	example,<BR>
	<FONT SIZE="2" FACE="Courier New, Courier">$(v:D)</FONT> is the directory path for the variable <FONT SIZE="2"
	FACE="Courier New, Courier">$(v)</FONT>. See table below.
	<DL>
		<P>
	</DL>
	<P>Variable expansion in a rule's actions is similar to variable expansion in statements, except that the action
	string is tokenized at whitespace regardless of quoting.</P>
	<P>The result of a token after variable expansion is the <I>product</I> of the components of the token, where each
	component is a literal substring or a list substituting a variable reference. For example:</P>
	<P>
	<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" WIDTH="47%">
<tbody>       																				<TR>
			<TD><CODE> <BR>
				$(X) -&gt; a b c <BR>
				t$(X) -&gt; ta tb tc <BR>
				$(X)z -&gt; az bz cz <BR>
				$(X)-$(X) -&gt; a-a a-b a-c b-a b-b b-c c-a c-b c-c</CODE></TD>
		</TR>
</tbody>    										</TABLE>
</P>
	<P>The variable name and modifiers can themselves contain a variable reference:</P>
	<P>
	<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" WIDTH="23%">
<tbody>       																				<TR>
			<TD><CODE>$(X) -&gt; a b c <BR>
				$(Y) -&gt; 1 2 <BR>
				$(Z) -&gt; X Y <BR>
				$($(Z)) -&gt; a b c 1 2</CODE></TD>
		</TR>
</tbody>    										</TABLE>
</P>
	<P>If any variable reference in a token is undefined, the result of the expansion is an empty list. If any variable
	element is a null string, the result propagates the non-null elements:</P>
	<P>
	<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" WIDTH="31%">
<tbody>       																				<TR>
			<TD><CODE>$(X) -&gt; a &quot;&quot; <BR>
				$(Y) -&gt; &quot;&quot; 1 <BR>
				$(Z) -&gt; <BR>
				*$(X)$(Y)* -&gt; *a* *a1* ** *1* <BR>
				*$(X)$(Z)* -&gt;</CODE></TD>
		</TR>
</tbody>    										</TABLE>
</P>
	<P>A variable element's string value can be parsed into grist and filename-related components. Modifiers to a variable
	are used to select elements, select components, and replace components.</P>
	<P>
	<TABLE BORDER="1" WIDTH="75%">
		<CAPTION>
			<P><B><FONT SIZE="4">Variable Modifiers</FONT></B>
		</CAPTION>
<tbody>       																				<TR>
			<TD><CODE> [<I>n</I>]</CODE></TD>
			<TD>Select element number <I>n</I> (starting at 1). If the variable contains fewer than <I>n</I> elements, the result
				is a zero-element list.</TD>
		</TR>
		<TR>
			<TD><CODE> [<I>n</I>-<I>m</I>]</CODE></TD>
			<TD>Select elements number <I>n</I> through <I>m</I>.</TD>
		</TR>
		<TR>
			<TD><CODE> [<I>n</I>-]</CODE></TD>
			<TD>Select elements number <I>n</I> through the last.</TD>
		</TR>
		<TR>
			<TD><CODE> :<I>chars</I></CODE></TD>
			<TD>Select the components listed in <I>chars</I>.</TD>
		</TR>
		<TR>
			<TD><CODE> :B</CODE></TD>
			<TD>Select filename base.</TD>
		</TR>
		<TR>
			<TD><CODE> :B=<I>base</I></CODE></TD>
			<TD>Replace the base part of file name with <I>base</I></TD>
		</TR>
		<TR>
			<TD><CODE> :D</CODE></TD>
			<TD>Select directory path.</TD>
		</TR>
		<TR>
			<TD><CODE> :D=<I>path</I></CODE></TD>
			<TD>Replace directory with <I>path.</I></TD>
		</TR>
		<TR>
			<TD><CODE> :E=<I>value</I></CODE></TD>
			<TD>Use <I>value</I> instead if the variable is unset.</TD>
		</TR>
		<TR>
			<TD><CODE> :G</CODE></TD>
			<TD>Select grist.</TD>
		</TR>
		<TR>
			<TD><CODE> :G=<I>grist</I></CODE></TD>
			<TD>Replace grist with <I>grist</I>.</TD>
		</TR>
		<TR>
			<TD><CODE> :J=<I>joinval</I></CODE></TD>
			<TD>Concatenate list elements into single element, separated by <I>joinval</I>.</TD>
		</TR>
		<TR>
			<TD><CODE> :L</CODE></TD>
			<TD>Replace uppercase characters with lowercase.</TD>
		</TR>
		<TR>
			<TD><CODE> :M</CODE></TD>
			<TD>Select archive member name.</TD>
		</TR>
		<TR>
			<TD><CODE> :M=<I>mem</I></CODE></TD>
			<TD>Replace the archive member name with <I>mem</I>.</TD>
		</TR>
		<TR>
			<TD><CODE> :P</CODE></TD>
			<TD>Select parent directory.</TD>
		</TR>
		<TR>
			<TD><CODE> :R=<I>root</I></CODE></TD>
			<TD>Prepend <I>root</I> to the whole file name, if not already rooted.</TD>
		</TR>
		<TR>
			<TD><CODE> :S</CODE></TD>
			<TD>Select (last) filename suffix.</TD>
		</TR>
		<TR>
			<TD><CODE> :S=<I>suf</I></CODE></TD>
			<TD>Replace the suffix of file name with <I>suf</I>.</TD>
		</TR>
		<TR>
			<TD><CODE> :U</CODE></TD>
			<TD>Replace lowercase characters with uppercase.</TD>
		</TR>
</tbody>    										</TABLE>
</P>
	<P>$(var:P) is the parent directory of $(var:D).</P>
	<H3>Built-in Rules</H3>
	<DD>
	<P><B>Jam</B> has twelve built-in rules, all of which are pure procedure rules without updating actions. They are
	in three groups: the first builds the dependency graph; the second modifies it; and the third are just utility
	rules.</P>
	<H4>Dependency Building</H4>
	<P>
	<TABLE BORDER="0" WIDTH="75%">
<tbody>       																				<TR>
			<TD>
				<DL>
					<P>
					<DT><CODE>Depends <I>targets1</I> : <I>targets2</I> ;</CODE></DT>
					<DD>Builds a direct dependency: makes each of <I>targets1</I> depend on each of <I>targets2</I>. Generally, <I>targets1</I>
					will be rebuilt if <I>targets2</I> are themselves rebuilt or are newer than <I>targets1</I>.
					<P>
					<DT><CODE>Includes <I>targets1</I> : <I>targets2</I> ;</CODE></DT>
					<DD>Builds a sibling dependency. Makes any target that depends on any of <I>targets1</I> also depend on each of
					<I>targets2</I>. This reflects the dependencies that arise when one source file includes another. The object built
					from the source file depends both on the original and included source file, but the two sources files don't depend
					on each other. For example:
					<P>Depends foo.o : foo.c ; <BR>
					Includes foo.c : goo.c ;</P>

					<P>&quot;foo.o&quot; depends on &quot;foo.c&quot; and &quot;goo.c&quot; in this example.
				</DL>
			</TD>
		</TR>
</tbody>    										</TABLE>
</P>
	<H4><A NAME="bindingmods"></A> Modifying Binding</H4>
	<P>The six rules Always, Leaves, NoCare, NotFile, NoUpdate, and Temporary modify the dependency graph so that <B>jam</B>
	treats the targets differently during its target binding phase. See <A HREF="#binding">Binding</A> above. Normally,
	<B>jam</B> updates a target if it is missing, if its filesystem modification time is older than any of its dependencies
	(recursively), or if any of its dependencies are being updated. This basic behavior can be changed by invoking
	utility rules:</P>
	<H5>Utility Rules</H5>
	The remaining rules are utility rules.
	<P>
	<TABLE BORDER="0" WIDTH="75%">
<tbody>       																				<TR>
			<TD>
				<DL>
					<DT><CODE><BR>
					Echo <I>args</I> ;</CODE></DT>
					<DD>Blurts out the message <I>args</I> to stdout.
					<DT><CODE>Exit <I>args</I> ;</CODE></DT>
					<DD>Blurts out the message <I>args</I> to stdout and then exits with a failure status.
					<P>
					<DT><CODE>Glob <I>directories</I> : <I>patterns</I> ;</CODE></DT>
					<DD>Scans <I>directories</I> for files matching <I>patterns</I>, returning the list of matching files (with directory
					prepended). <I>patterns</I> uses the same syntax as in the <B>switch</B> statement. Only useful within the <TT>[
					]</TT> construct, to change the result into a list.
					<P>
					<DT><CODE>Match <I>regexps</I> : <I>list</I> ;</CODE></DT>
					<DD>Matches the <B>egrep</B>(1) style regular expressions <I>regexps</I> against the strings in <I>list</I>. The
					result is the concatenation of matching <TT>()</TT> subexpressions for each string in <I>list</I>, and for each
					regular expression in <I>regexps</I>. Only useful within the <TT>[ ]</TT> construct, to change the result into
					a list.
				</DL>
			</TD>
		</TR>
</tbody>    										</TABLE>
</P>
	<H3>Built-in Variables</H3>
	<P>This section discusses variables that have special meaning to <B>jam</B>. By convention, variables names are
	in CAPS.</P>
	<H4><A NAME="search"></A> SEARCH and LOCATE Variables</H4>
	<P>These two variables control the binding of file target names to locations in the file system. Generally, $(SEARCH)
	is used to find existing sources while $(LOCATE) is used to fix the location for built targets.</P>
	<P>Rooted (absolute path) file targets are bound as is. Unrooted file target names are also normally bound as is,
	and thus relative to the current directory, but the settings of $(LOCATE) and $(SEARCH) alter this:
	<UL>
		<LI>If $(LOCATE) is set then the target is bound relative to the first directory in $(LOCATE). Only the first element
		is used for binding.
		<LI>If $(SEARCH) is set then the target is bound to the first directory in $(SEARCH) where the target file already
		exists.
		<LI>If the $(SEARCH) search fails, the target is bound relative to the current directory anyhow.
	</UL>
	<P>Both $(SEARCH) and $(LOCATE) should be set target-specific and not globally. If they were set globally, <B>jam</B>
	would use the same paths for all file binding, which is not likely to produce sane results. When writing your own
	rules, especially ones not built upon those in Jambase, you may need to set $(SEARCH) or $(LOCATE) directly. Almost
	all of the rules defined in Jambase set $(SEARCH) and $(LOCATE) to sensible values for sources they are looking
	for and targets they create, respectively.</P>
	<H4><A NAME="hdrscan"></A> HDRSCAN, HDRRULE and HDRGRIST Variables</H4>
	<P>These two variable control header file scanning. $(HDRSCAN) is an <B>egrep</B>(1) pattern, with ()'s surrounding
	the file name, used to find file inclusion statements in source files. Jambase uses $(HDRPATTERN) as the pattern
	for $(HDRSCAN). $(HDRRULE) is the name of a rule to invoke with the results of the scan: the scanned file is the
	target, the found files are the sources. $(HDRRULE) is run under the influence of the scanned file's target-specific
	variables.</P>
	<P>Both $(HDRSCAN) and $(HDRRULE) must be set for header file scanning to take place, and they should be set target-specific
	and not globally. If they were set globally, all files, including executables and libraries, would be scanned for
	header file include statements.</P>
	<P>The scanning for header file inclusions is not exact, but it is at least dynamic, so there is no need to run
	something like <B>makedepend</B>(GNU) to create a static dependency file. The scanning mechanism errs on the side
	of inclusion (i.e., it is more likely to return filenames that are not actually used by the compiler than to miss
	include files) because it can't tell if #include lines are inside #ifdefs or other conditional logic. In Jambase,
	HdrRule applies the NOCARE rule to each header file found during scanning so that if the file isn't present yet
	doesn't cause the compilation to fail, <B>jam</B> won't care.</P>
	<P>Also, scanning for regular expressions only works where the included file name is literally in the source file.
	It can't handle languages that allow including files using variable names (as the Jam language itself does).</P>
	<P>
	<H4>Platform Identifier Variables</H4>
	<P>A number of Jam built-in variables can be used to identify runtime platform:</P>
	<P>
	<TABLE BORDER="0" WIDTH="75%">
<tbody>       																				<TR>
			<TD>OS</TD>
			<TD>OS identifier string</TD>
		</TR>
		<TR>
			<TD>OSPLAT</TD>
			<TD>Underlying architecture, when applicable</TD>
		</TR>
		<TR>
			<TD>NT</TD>
			<TD>true on NT platform</TD>
		</TR>
		<TR>
			<TD>AIX</TD>
			<TD>true on AIX platform (see also OSVER)</TD>
		</TR>
		<TR>
			<TD>HPUX</TD>
			<TD>true on HPUX platform</TD>
		</TR>
		<TR>
			<TD>SOLARIS</TD>
			<TD>true on Solaris platform</TD>
		</TR>
		<TR>
			<TD>UNIX</TD>
			<TD>true on Unix platforms</TD>
		</TR>
</tbody>    										</TABLE>
</P>
	<P>
	<H4>Jam Version Variables</H4>
	<P>
	<TABLE BORDER="0" WIDTH="75%">
<tbody>       																				<TR>
			<TD>JAMDATE</TD>
			<TD>Time and date at <B>jam</B> start-up.</TD>
		</TR>
		<TR>
			<TD>JAMUNAME</TD>
			<TD>Output of <B>uname</B>(1) command (Unix only)</TD>
		</TR>
		<TR>
			<TD>JAMVERSION</TD>
			<TD><B>jam</B> version, as reported by jam -v.</TD>
		</TR>
		<TR>
			<TD>JAMUSER</TD>
			<TD>username that invoked jam.</TD>
		</TR>
</tbody>    										</TABLE>
</P>
	<H4>JAMSHELL Variable</H4>
	<P>When <B>jam</B> executes a rule's action block, it forks and execs a shell, passing the action block as an argument
	to the shell. The invocation of the shell can be controlled by $(JAMSHELL). The default on Unix is, for example:</P>
	<P><CODE>JAMSHELL = &quot;/bin/sh -c %&quot; ;</CODE></P>
	<P>The % is replaced with the text of the action block.</P>
	<P><B>Jam</B> does not directly support building in parallel across multiple hosts, since that is heavily dependent
	on the local environment. To build in parallel across multiple hosts, you need to write your own shell that provides
	access to the multiple hosts. You then reset $(JAMSHELL) to reference it.</P>
	<P>Just as <B>jam</B> expands a % to be the text of the rule's action block, it expands a ! to be the multi-process
	slot number. The slot number varies between 1 and the number of concurrent jobs permitted by the -j flag given
	on the command line. Armed with this, it is possible to write a multiple host shell. For example:</P>
	<P>
	<TABLE BORDER="0" WIDTH="75%">
<tbody>       																				<TR>
			<TD><CODE> <BR>
				#!/bin/sh <BR>
				<BR>
				# This sample JAMSHELL uses the SunOS on(1) command to execute a <BR>
				# command string with an identical environment on another host. <BR>
				<BR>
				# Set JAMSHELL = jamshell ! % <BR>
				# <BR>
				# where jamshell is the name of this shell file. <BR>
				# <BR>
				# This version handles up to -j6; after that they get executed <BR>
				# locally. <BR>
				<BR>
				case $1 in <BR>
				1|4) on winken sh -c &quot;$2&quot;;; <BR>
				2|5) on blinken sh -c &quot;$2&quot;;; <BR>
				3|6) on nod sh -c &quot;$2&quot;;; <BR>
				*) eval &quot;$2&quot;;; <BR>
				esac</CODE></TD>
		</TR>
</tbody>    										</TABLE>
</P>
	<H2>DIAGNOSTICS</H2>
	<DD>
	<P>In addition to generic error messages, <B>jam</B> may emit one of the following:</P>
	<P>
	<TABLE BORDER="0" WIDTH="75%">
<tbody>       																				<TR>
			<TD>
				<DL>
					<P>
					<DT><CODE>warning: unknown rule X</CODE></DT>
					<DD>A rule was invoked that has not been defined with an &quot;actions&quot; or &quot;rule&quot; statement.
					<P>
					<DT><CODE>using N temp target(s)</CODE></DT>
					<DD>Targets marked as being temporary (but nonetheless present) have been found.
					<P>
					<DT><CODE>updating N target(s)</CODE></DT>
					<DD>Targets are out-of-date and will be updated.
					<P>
					<DT><CODE>can't find N target(s)</CODE></DT>
					<DD>Source files can't be found and there are no actions to create them.
					<P>
					<DT><CODE>can't make N target(s)</CODE></DT>
					<DD>Due to sources not being found, other targets cannot be made.
					<P>
					<DT><CODE>warning: X depends on itself</CODE></DT>
					<DD>A target depends on itself either directly or through its sources.
					<P>
					<DT><CODE>don't know how to make X</CODE></DT>
					<DD>A target is not present and no actions have been defined to create it.
					<P>
					<DT><CODE>X skipped for lack of Y</CODE></DT>
					<DD>A source failed to build, and thus a target cannot be built.
					<P>
					<DT><CODE>warning: using independent target X</CODE></DT>
					<DD>A target that is not a dependency of any other target is being referenced with $(&lt;) or $(&gt;).
					<P>
					<DT><CODE>X removed</CODE></DT>
					<DD><B>Jam</B> removed a partially built target after being interrupted.
				</DL>
			</TD>
		</TR>
</tbody>    										</TABLE>
</P>
	<H2>BUGS, LIMITATIONS</H2>
	<DD>
	<P>The -j flag can cause <B>jam</B> to get confused when single actions update more than one target at a time.
	<B>jam</B> may proceed as if the targets were built even though they are still under construction.</P>
	<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 <B>yacc</B>(1) does.</P>
	<P>With the -j flag, errors from failed commands can get staggeringly mixed up.</P>
	<P>A poorly set $(JAMSHELL) is likely to result in silent failure.</P>
	<H2>SEE ALSO</H2>
	<UL>
		<LI><A HREF="Jambase.html">Jambase Reference</A>
		<LI><A HREF="Jamfile.html">Using Jamfiles, Jamrules and Jambase</A>
	</UL>
	<P>Jam documentation and source are available from the <A HREF="http://public.perforce.com/public/index.html">Perforce
	Public Depot</A>.<BR>
	Siebel development on <FONT FACE="Courier New, Courier">sdch70a014: /vol1/users/ddunbar/Jam</FONT></P>
	<H2>AUTHOR</H2>
	<DD>
	<P>Jam's author is Christopher Seiwald (<A HREF="mailto:[email protected]">[email protected]</A>).<BR>
	Siebel modifications by Dick Dunbar (<A HREF="mailto:[email protected]">[email protected]</A>) 2004</P>
</DL>

<P>
<HR ALIGN="CENTER">
</P>
<H1>Appendix A: Relationship to make</H1>
<P>AIX make flags:</P>
<P>make Command<BR>
<BR>
Purpose<BR>
<BR>
Maintains, updates, and regenerates groups of programs.<BR>
<BR>
Syntax<BR>
<BR>
make [ -DVariable ] [ -d Option] ] [ -e ] [ -i ] [ -k ] [ -n ] [ -p ] [ -q ] [<BR>
-r ] [ -S ] [ -s ] [ -t ] [ -f MakeFile ... ] [ Target ... ]</P>
<P>$&lt;<BR>
Represents either the full name of a prerequisite that made a target<BR>
out-of-date (inference rule), or the full name of a target (.DEFAULT rule).<BR>
<BR>
$*<BR>
Represents the file name section of a prerequisite that made a target<BR>
out-of-date (in an inference rule) without a suffix.<BR>
<BR>
$@<BR>
Represents the full target name of the current target or the archive file name<BR>
part of the library archive target.<BR>
<BR>
$%<BR>
Represents a library member in a target rule if the target is a member of the<BR>
archive library.<BR>
<BR>
You can also use these local variables appended with D or F:</P>
<P>D<BR>
Indicates that the local variable applies to the directory part of the name.<BR>
This is the path name prefix without a trailing / (slash). For current<BR>
directories, D is a . (period).<BR>
<BR>
F<BR>
Indicates that the local variable applies to the file name part of the name.<BR>
<BR>
In addition, the make command sets or knows about the following variables:<BR>
<BR>
$ A single $ (dollar sign); that is, $$ expands to a single dollar sign.<BR>
Flags<BR>
<BR>
-DVariable Sets the value of Variable to 1.<BR>
-dOption Displays detailed information ...<BR>
A<BR>
Displays all possible debug information.<BR>
<BR>
a<BR>
Displays debug information about archive searching and caching.<BR>
<BR>
d<BR>
Displays debug information about directory searching.<BR>
<BR>
g1<BR>
Displays debug information about input graph before making anything.</P>
<P>g2<BR>
Displays debug information about input graph after making everything, or<BR>
before exiting on an error.<BR>
<BR>
m<BR>
Displays debug information about making targets, including modification dates.<BR>
<BR>
s<BR>
Displays debug information about suffix searching.<BR>
<BR>
v<BR>
Displays debug information about variable assignments.<BR>
<BR>
-e Specifies that environmental variables override macro assignments within<BR>
makefiles.<BR>
<BR>
-f MakeFile Specifies a makefile to read instead of the default makefile. If<BR>
MakeFile is - (dash), standard input is read. Multiple makefiles can be<BR>
specified and are read in the order specified.<BR>
<BR>
-i Ignores nonzero exit of shell commands in the makefile. Equivalent to<BR>
specifying - (dash) before each command line in the makefile.<BR>
<BR>
-k Continues processing after errors are encountered, but only on those targets<BR>
that do not depend on the target whose creation caused the error.<BR>
<BR>
-n Displays commands, but does not run them. However, lines beginning with a +<BR>
(plus sign) are executed.<BR>
<BR>
-p Displays the complete set of macro definitions and target descriptions before<BR>
performing any commands.<BR>
-q Returns a zero status code if the target file is up-to-date; returns a one<BR>
status code if the target file is not up-to-date. However, a command line with<BR>
the + (plus sign) prefix will be executed.<BR>
<BR>
-r Does not use the default rules.<BR>
<BR>
-S Terminates the make command if an error occurs. This is the default and the<BR>
opposite of -k flag.<BR>
<BR>
-s Does not display commands on the screen as they are performed.<BR>
<BR>
-t Creates a target or updates its modification time to make it appear<BR>
up-to-date. Executes command lines beginning with a + (plus) sign.<BR>
<BR>
Target Specifies a target name of the form Target or sets the value of<BR>
variables.</P>

<P>Copyright 1993-2002 Christopher Seiwald and Perforce Software, Inc.

</BODY>

</HTML>
# Change User Description Committed
#2 4362 Dick Dunbar Documentation updates.
#1 4356 Dick Dunbar Jam 2.5 base established
//guest/perforce_software/jam/src/Jam.html
#19 2559 rmg Fix 'var on target ?= value' so that var is only set if it
did not have a target-specific value.  Previously, it would
just overwrite the var's value.

Bug fix documented in RELNOTES.

=== computer:1666: Change 39566 by seiwald@play-seiwald on 2002/12/27 14:44:01
#18 2557 rmg Shuffle mechanism for optional Jamrules includes: now no error
message is issued for a missing include file marked with NOCARE.

Previously, we used Glob to try to find the optional Jamrules
files, but on VMS that doesn't work so well: Glob returns all
uppercase file names with .'s at the end, which doesn't match
"Jamrules" at all.

The NOCARE part is a user-visible change documented in RELNOTES.

=== computer:1666: Change 39273 by seiwald@waffle-cyg-seiwald on 2002/12/19 22:44:03
#17 2529 rmg Fix "on target" variables during header scan, from Matt Armstrong.

Setting target-specific variables while under the influence of
the target's target-specific variables caused the _global_ values
to be modified.  This happened both during header file scanning
and with the "on target statement" syntax.

The manifestation of this was if a file #included itself, HdrRule
would accidentally set HDRRULE/HDRSCAN globally, and then all
files (executables, etc) would get scanned for includes.

While this borrows from Matt's fix, it is a slightly different
implementation.

User visible fix documented in RELNOTES.

=== computer:1666: Change 39095 by seiwald@play-seiwald on 2002/12/17 14:00:58
#16 2504 rmg Fix erroneous statement about :E modifier.
doc change only.
#15 2490 rmg Jam langauge work: make 'return' actually return from the rule,
rather than just setting the return value.  Introduce new
break/continue statements for managing loops.

User visible change to be documented in Jam.html.

=== computer:1666: Change 37200 by seiwald@play-seiwald on 2002/10/22 15:41:28

Gross rework of Jam.html documentation, including:

- the description of parameters for rules
- description of -g flag
- a new description of targets
- more about rules and their return values
- better separation of rules and updating actions
- putting borders around the tables

(Undocumented) change to documentation.

=== computer:1666: Change 37551 by seiwald@waffle-cyg-seiwald on 2002/11/03 23:17:12

Document jam's new and working break/continue/return statements.

=== computer:1666: Change 37574 by seiwald@play-seiwald on 2002/11/04 13:13:01
#14 2488 rmg Remove the /MR suffix from Jam.

=== computer:1666: Change 37146 by seiwald@play-seiwald on 2002/10/21 15:23:18
#13 2486 rmg Fooling around with jam's -d flag, to make it possible to specify
useful display output without turning on loads of debugging crud.

New -dd flag to display dependencies.

Provisional changes not yet documented in jam.html.

=== computer:1666: Change 36374 by seiwald@play-seiwald on 2002/09/19 15:17:20

Jam -d change: the message "...using xxx..." now only shows
up with -da, rather than in the default output.  It made it
hard to see what was happening when there were a lot of temp
files lying around.

User visible change documented in RELNOTES.

=== computer:1666: Change 36430 by seiwald@play-seiwald on 2002/09/23 11:34:12

Put jam -dx flags into 'jam -h'.

Change to undocumented behavior (jam -h's output).

=== computer:1666: Change 36551 by seiwald@play-seiwald on 2002/09/26 14:39:54

Document jam's new -d debug flags.

=== computer:1666: Change 37367 by seiwald@waffle-cyg-seiwald on 2002/10/28 16:03:46

jam -n now implies -dax, just as the old jam -n implied -d2.

Change to unreleased functionality.

=== computer:1666: Change 37550 by seiwald@waffle-cyg-seiwald on 2002/11/03 23:12:15
#12 2482 rmg Jam.html partial rewrite and the support for named
parameters to rules.

=== computer:1666: Change 34516 by seiwald@play-seiwald on 2002/06/21 23:59:12
#11 1614 Perforce staff Update Jam.html to reflect recent changes to Glob and Match
rules, and bring the date up to 2002.
#10 1536 rmg Document indirect rule invokation (changes 1497, 1531).
#9 1530 rmg Document the new builtin MATCH rule which was added in change 1498.
#8 1351 rmg This change is integration history only.
(Accept -ay'ed
integrating:

    Change 216 by peter_glasscock@peter_glasscock on 1999/07/27 03:25:01

    Integrate recent changes to public source

So, these were apparently Matt's tweaks to changes being
integrated from //public/jam, and we'll ignore them here.
#7 1346 rmg Add an option that gets Jam to exit as soon as any target
fails (as if it had received an "interrupt")

Integrates Change 233 by Peter Glasscock.

Added to Jam.html & RELNOTES - rmg
#6 1319 rmg Jam 2.3 + Perforce's internal changes.

This change is a drop of the Perforce internal Jam changes
since the 2.3 public release. The individual changes
represented herein are preserved in the
//guest/richard_geiger/intjam/ branch.

The intent of this drop is to provide a base, from which other
contributors' Jam branches may be integrated into. It is not
intended to become a packaged release in this state. We will
be integrating changes from other users prior to creating the
next packaged release.

Please refer to the src/RELNOTES file for an overview of the
changes present in this integration.

  - Richard Geiger
  Open Source Engineer at Perforce
#5 486 Perforce staff Jam 2.3.
 See RELNOTES for a list of changes from 2.2.x.

Just about every source file was touched when jam got ANSI-fied.
#4 212 Perforce staff An interpretative integration of Peter Glasscock's -o file support.
This is handled in the make1() routine, rather than in all the
exec*.c files.  -o x writes the actions to file x rather than
actually running them.  Implies -n (but not -d2).
#3 76 Laura Wingerd Integrate command-block-too-long fix, plus minor doc
updates. Jam/MR release level is now 2.2.5.
(change 72, change 73, change 74, change 75)
#2 51 Laura Wingerd Update copyright year.
#1 2 laura Add Jam/MR 2.2 source