Jambase.html #2

  • //
  • guest/
  • dick_dunbar/
  • jam/
  • src/
  • Jambase.html
  • View
  • Commits
  • Open Download .zip Download (55 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>Jambase Reference</TITLE>
</HEAD>

<BODY>

<P ALIGN="CENTER"><A HREF="http://ddunbar/Analytics/Jam/Jam.html"> Jam</A>
<H1 ALIGN="CENTER"><A NAME="TOP"></A> Jambase Reference</H1>
<P>Jambase is a base set of Jam rules which provide roughly make(1)-like functionality for <A HREF="Jam.html"><B>jam</B></A>,
the Jam executable program. This document, which started out as the Jambase(5) man page, is a reference guide to
the <A HREF="#RULES">rules</A>, <A HREF="#PSEUDOTARGETS">pseudotargets</A>, and <A HREF="#VARS">variables</A> defined
in Jambase for use in Jamfiles.</P>
<P>For further information see:</P>

<UL>
	<LI><A HREF="Jamfile.html">Using Jamfiles, Jamrules and Jambase</A>
	<LI><A HREF="Jam.html">The Jam Executable Program</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>
For detailed information about any of the rules summarized below, see the <A HREF="Jambase">Jambase</A> file itself.</P>
<P>
<HR ALIGN="CENTER">

<H2><A NAME="RULES"></A> Jambase Rules</H2>
<P><B>ToDo: </B>makeString, makeDirName, Archive, ShrLibrary, Libs, etc.</P>
<P><B>Always </B><I>target target ... </I>; <B>builtin</B>

<BLOCKQUOTE>
	<P>Always build these targets. Jambase example:<BR>
	<FONT SIZE="2" FACE="Courier New, Courier">Always clean uninstall ;</FONT></P>
</BLOCKQUOTE>

<P><B>Archive</B> <I>library</I> : <I>sources</I> ;

<BLOCKQUOTE>
	<P>Compiles <I>sources</I> and archives the targets into the archive <I>library.</I> The intermediate <I>objects</I>
	are deleted. Calls Objects and ArchiveFromObjects.</P>
	<P>If Library is invoked with no suffix on <I>library</I>, the $(SUFLIB) suffix is used.<BR>
	If Library is invoked with a suffix on <I>library<B>, </B></I>it is corrected to the platform $(SUFLIB).<BR>
	<B>ToDo: </B>Is the &quot;lib&quot; prefix added? Ignored? What name is used in the link flag (-l) ?</P>
</BLOCKQUOTE>

<P><B>As</B> <I>obj.o</I> : <I>source.s</I> ;</P>

<BLOCKQUOTE>
	<P>Assemble the file <I>source.s.</I> Called by the Object rule.
</BLOCKQUOTE>

<P><B>Bulk</B> <I>directory</I> : <I>sources</I> ;

<BLOCKQUOTE>
	<P>Copies <I>sources</I> into <I>directory.</I>
</BLOCKQUOTE>

<P><B>Cc</B> <I>object</I> : <I>source</I> ;

<BLOCKQUOTE>
	<P>Compile the file <I>source</I> into <I>object,</I> using the C compiler $(CC), its flags $(CCFLAGS) and $(OPTIM),
	and the header file directories $(HDRS). Called by the Object rule.
</BLOCKQUOTE>

<P><B>CcFlags </B><I>flags </I>; <B>Not implemented.</B></P>
<P><B>C++</B> <I>obj.o</I> : <I>source.cpp</I> ;

<BLOCKQUOTE>
	<P>Compile the C++ source file <I>source.cpp.</I> Called by the Object rule.
</BLOCKQUOTE>

<P><B>C++Flags </B><I>flags</I> ; <B>Not implemented.</B></P>
<P><B>Chmod</B> <I>target</I> ;

<BLOCKQUOTE>
	<P><I>(Unix only.)</I> Change file permissions on <I>target</I> to target-specific $(MODE) value set by Link, File,
	Install*, and Shell rules.
</BLOCKQUOTE>

<P><B>Clean</B> <I>clean</I> : <I>targets</I> ;

<BLOCKQUOTE>
	<P>Removes existing <I>targets</I> when <I>clean</I> is built. clean is not a dependency of all, and must be built
	explicitly for targets to be removed.
</BLOCKQUOTE>

<P><B>Defines </B><I>names </I>;

<BLOCKQUOTE>
	<P>Add <I>names</I> to the list of preprocessor defines to variable DEFINES.</P>
</BLOCKQUOTE>

<P><B>Depends</B> <I>targets1</I> : <I>targets2 </I>; <B>builtin</B>

<BLOCKQUOTE>
	<P>Builds a direct dependency. Each of <I>targets1</I> depend on each of <I>targets2</I>.<BR>
	<I>targets1</I> will be rebuilt if <I>targets2</I> are rebuilt or are newer than <I>targets1</I>.<BR>
	Jambase examples:<BR>
	<FONT SIZE="2" FACE="Arial, Helvetica">Depends all : shell files lib exe obj ;<BR>
	Depends all shell files lib exe obj : first ;</FONT></P>
</BLOCKQUOTE>

<P><B>Echo </B><I>args </I>; <B>builtin</B>

<BLOCKQUOTE>
	<P>Blurts out message <I>args</I> to stdout.</P>
</BLOCKQUOTE>

<P><B>Exit </B><I>args </I>; <B>builtin</B>

<BLOCKQUOTE>
	<P>Blurts out message args, and exits with a failure status.</P>
</BLOCKQUOTE>

<P><B>FDefines</B> <I>defines</I> ;

<BLOCKQUOTE>
	<P>Expands a list of definitions into a list of compiler (or preprocessor) switches (such as -D<I>symbol</I>=<I>val</I>
	on Unix) to pass the definitions.
</BLOCKQUOTE>

<P><B>File</B> <I>target</I> : <I>source</I> ;

<BLOCKQUOTE>
	<P>Copies <I>source</I> into <I>target.</I>
</BLOCKQUOTE>

<P><B>FAppendSuffix</B> <I>f1 f2 ... </I>: $(SUF) ;

<BLOCKQUOTE>
	<P>Return $(&lt;) with suffixes.<B> </B>Example:<B><BR>
	</B><FONT SIZE="2" FACE="Courier New, Courier">FAppendSuffix yacc lex foo.bat : $(SUFEXE) ;<BR>
	returns (yacc.exe,lex.exe,foo.bat) on Windows. <BR>
	returns (yacc, lex, foo.bat) on Unix</FONT></P>
</BLOCKQUOTE>

<P><B>FDefines</B> <I>...</I> ;

<BLOCKQUOTE>
	<P>Unknown</P>
</BLOCKQUOTE>

<P><B>FDirName</B> <I>d1 d2 ...</I> ;

<BLOCKQUOTE>
	<P>Return path from root to dir.<B> </B><FONT SIZE="2" FACE="Courier New, Courier">d1/d2</FONT> on unix; <FONT
	SIZE="2" FACE="Courier New, Courier">d1\d2</FONT> on windows.</P>
</BLOCKQUOTE>

<P><B>FGrist</B> <I>d1 d2 ...</I> ;

<BLOCKQUOTE>
	<P>Return <FONT SIZE="2" FACE="Courier New, Courier">d1!d2!</FONT></P>
</BLOCKQUOTE>

<P><B>FGristFiles</B> <I>value</I> ;

<BLOCKQUOTE>
	<P>Return <FONT SIZE="2" FACE="Courier New, Courier">$(value:G=$(SOURCE_GRIST))</FONT></P>
</BLOCKQUOTE>

<P><B>FGristSourceFiles</B> <I>value</I> ;

<BLOCKQUOTE>
	<P>Return source file name with grist in it. Leave headers alone.<BR>
	<FONT SIZE="2" FACE="Courier New, Courier">$(value:G=$(SOURCE_GRIST))</FONT></P>
</BLOCKQUOTE>

<P><B>FDirName</B> <I>dirs</I> ;

<BLOCKQUOTE>
	<P>Describe ???</P>
</BLOCKQUOTE>

<P><B>FIncludes</B> <I>dirs</I> ;

<BLOCKQUOTE>
	<P>Expands a list of directories into a list of compiler (or preprocessor) switches (such as -I<I>dir</I> on Unix)
	to add the directories to the header inclusion search path.
</BLOCKQUOTE>

<P><B>FQuote</B> <I>files</I> ;

<BLOCKQUOTE>
	<P>Returns each of <I>files</I> suitably quoted so as to hide shell metacharacters (such as whitespace and filename
	matching wildcards) from the shell.
</BLOCKQUOTE>

<P><B>FRelPath </B><I>d1 </I>:<I> d2</I> ;

<BLOCKQUOTE>
	<P>Return relative path from <FONT SIZE="2" FACE="Courier New, Courier">d1</FONT> to <FONT SIZE="2" FACE="Courier New, Courier">d2</FONT>.</P>
</BLOCKQUOTE>

<P><B>FReverse </B><I>a1 a2 a3</I> ;

<BLOCKQUOTE>
	<P>Return <FONT SIZE="2" FACE="Courier New, Courier">a3 a2 a1</FONT>.</P>
</BLOCKQUOTE>

<P><B>FStripCommon</B> <I>v1</I> :<I> v2</I> ;

<BLOCKQUOTE>
	<P>Strip common inital parts of v1 v2.</P>
</BLOCKQUOTE>

<P><B>FSubDir </B><I>d1 d2</I> ... ; <B>deprecated ?</B>

<BLOCKQUOTE>
	<P>Return path to named directory.</P>
</BLOCKQUOTE>

<P><B>FSubDirPath </B><I>d1 d2</I> ... ;

<BLOCKQUOTE>
	<P>If jam is invoked in a subdirectory of TOP, then ../ is prepended to every level.</P>
	<P>
</BLOCKQUOTE>

<P><B>GenFile</B> <I>target</I> : <I>image</I> <I>sources</I> ;</P>

<BLOCKQUOTE>
	<P>Runs the command &quot;<I>image</I> <I>target</I> <I>sources</I>&quot; to create <I>target</I> from <I>sources</I>
	and <I>image</I>. (where <I>image</I> is an executable built by the Main rule.)</P>
</BLOCKQUOTE>

<P><B>GenFile1</B> <I>target</I> : <I>image</I> <I>sources</I> ;</P>

<BLOCKQUOTE>
	<P>Runs<B> </B>without setting up Clean or Depends rules.</P>
</BLOCKQUOTE>

<P><B>Glob </B><I>directories </I><B>:</B><I> patterns </I><B>;</B> <B>builtin</B>

<BLOCKQUOTE>
	<P>Scans <I>directories</I> for files matching regex <I>patterns</I>, returning the list of matching files with
	directory prepended. Useful with the<FONT FACE="Courier New, Courier"> [...] </FONT>construct to change the Glob
	result into a list.
</BLOCKQUOTE>

<P><B>HardLink</B> <I>target</I> : <I>source</I> ;

<BLOCKQUOTE>
	<P>Makes <I>target</I> a hard link to <I>source,</I> if it isn't one already. (Unix only.)
</BLOCKQUOTE>

<P><B>HdrRule</B> <I>source</I> : <I>headers</I> ;

<BLOCKQUOTE>
	<P>Arranges the proper dependencies when the file <I>source</I> includes the files <I>headers</I> through the &quot;#include&quot;
	C preprocessor directive.</P>
	<P>This rule is not intended to be called explicitly. It is called automatically during header scanning on sources
	handled by the Object rule (e.g., sources in Main or Library rules).</P>
</BLOCKQUOTE>

<P><B>Includes </B><I>targets1 </I>: <I>targets2 </I>; <B>builtin</B>

<BLOCKQUOTE>
	<P>Builds a siebling dependency. Any target that depends on <I>targets1</I> will also depend on <I>targets2</I>.<B><BR>
	</B>Such dependencies arise when one source file includes another.</P>
</BLOCKQUOTE>

<P><B>InstallBin</B> <I>dir</I> : <I>sources</I> ;

<BLOCKQUOTE>
	<P>Copy <I>sources</I> into <I>dir</I> with mode $(EXEMODE).
</BLOCKQUOTE>

<P><B>InstallFile </B><I>dir</I> : <I>sources</I> ;</P>

<BLOCKQUOTE>
	<P>Copy <I>sources</I> into <I>dir</I> with mode $(FILEMODE).</P>
</BLOCKQUOTE>

<P><B>InstallInto </B><I>dir</I> : <I>sources</I> ;</P>

<BLOCKQUOTE>
	<P>Copy <I>sources</I> into <I>dir</I> with Chmod, Chown, Chgrp. Utility rule.</P>
</BLOCKQUOTE>

<P><B>InstallLib</B> <I>dir</I> : <I>sources</I> ;

<BLOCKQUOTE>
	<P>Copy <I>sources</I> into <I>dir</I> with mode $(FILEMODE).</P>
</BLOCKQUOTE>

<P><B>InstallMan</B> <I>dir</I> : <I>sources</I> ;

<BLOCKQUOTE>
	<P>Copy <I>sources</I> into the appropriate subdirectory of <I>dir</I> with mode $(FILEMODE). The subdirectory
	is man<I>s,</I> where <I>s</I> is the suffix of each of sources.
</BLOCKQUOTE>

<P><B>InstallShell</B> <I>dir</I> : <I>sources</I> ;

<BLOCKQUOTE>
	<P>Copy <I>sources</I> into <I>dir</I> with mode $(SHELLMODE).</P>
</BLOCKQUOTE>

<P><B>InstallShr</B> <I>dir</I> : <I>sources</I> ;

<BLOCKQUOTE>
	<P>Copy <I>sources</I> into <I>dir</I> with mode $(SHRMODE).
</BLOCKQUOTE>

<P><B>Leaves</B> <I>...</I> ; <B>builtin</B>

<BLOCKQUOTE>
	<P>Leaves the innermost loop.</P>
</BLOCKQUOTE>

<P><B>Lex</B> <I>source.c</I> : <I>source.l</I> ;

<BLOCKQUOTE>
	<P>Process the lex(1) source file <I>source.l</I> and rename the lex.yy.c to <I>source.c.</I> Called by the Object
	rule.
</BLOCKQUOTE>

<P><B>Library</B> <I>library</I> : <I>sources</I> ;

<BLOCKQUOTE>
	<P>Compiles <I>sources</I> and builds a shared <I>library.</I> The intermediate <I>objects</I> are deleted. Calls
	Objects and LibraryFromObjects.</P>
	<P>If Library is invoked with no suffix on <I>library</I>, the $(SUFLIB) suffix is used.<BR>
	If Library is invoked with a suffix on <I>library<B>, </B></I>it is corrected to the platform $(SUFLIB).<BR>
	<B>ToDo: </B>Is the &quot;lib&quot; prefix added? Ignored? What name is used in the link flag (-l) ?</P>
</BLOCKQUOTE>

<P><B>LibraryFromObjects</B> <I>library</I> : <I>objects</I> ;

<BLOCKQUOTE>
	<P>Archives <I>objects</I> into <I>library.</I> The <I>objects</I> are then deleted.</P>
	<P>If <I>library</I> has no suffix, the $(SUFLIB) suffix is used.</P>
</BLOCKQUOTE>

<P><B>Libs</B> <I>image</I> : <I>libraries</I> ;

<BLOCKQUOTE>
	<P>Make <I>image</I> depend on <I>libraries</I> and include them during the linking.<BR>
	<I>image</I> may be referenced without a suffix in this rule invocation; Libs supplies the suffix or adjusts the
	suffix supplied for the current platform. (Rule was LinkLibraries).</P>
</BLOCKQUOTE>

<P><B>LibFlags </B><I>flag1 flag2 </I>;

<BLOCKQUOTE>
	<P>Modifies LINKFLAGS in a compiler independent way.</P>
</BLOCKQUOTE>

<P><B>Link</B> <I>image</I> : <I>objects</I> ;

<BLOCKQUOTE>
	<P>Links <I>image</I> from <I>objects</I> and sets permissions on <I>image</I> to $(EXEMODE). <I>Image</I> must
	be actual filename; suffix is not supplied. Called by Main.
</BLOCKQUOTE>

<P><B>LinkFlags </B><I>flags</I> ;</P>
<P><B>Main</B> <I>image</I> : <I>sources</I> ;

<BLOCKQUOTE>
	<P>Compiles <I>sources</I> and links them into <I>image.</I> Calls Objects and MainFromObjects.</P>
	<P><I>image</I> may be referenced without a suffix in this rule invocation; Main supplies the suffix or adjust
	the suffix supplied for the current platform.</P>
</BLOCKQUOTE>

<P><B>MainFromObjects</B> <I>image</I> : <I>objects</I> ;

<BLOCKQUOTE>
	<P>Links <I>objects</I> into <I>image.</I> Dependency of exe. MainFromObjects supplies the suffix on <I>image</I>
	filename.
</BLOCKQUOTE>

<P><B>MakeLocate</B> <I>target</I> : <I>dir</I> ;

<BLOCKQUOTE>
	<P>Creates <I>dir</I> and causes <I>target</I> to be built into <I>dir</I>.
</BLOCKQUOTE>

<P><B>Match </B><I>regexps </I><B>:</B><I> list </I><B>;</B> <B>builtin</B>

<BLOCKQUOTE>
	<P>Matches the <B>egrep</B> style regular expression<I> regexps</I> against the strings in<I> list</I>.<I> </I>Result
	is the concatenation of matching subexpressions for each string in <I>list</I>. Useful with <FONT FACE="Courier New, Courier">[
	]</FONT> to change result into a list.</P>
</BLOCKQUOTE>

<P><B>MkDir</B> <I>dir</I> ;

<BLOCKQUOTE>
	<P>Creates <I>dir</I> and its parent directories.</P>
</BLOCKQUOTE>

<P><B>NoCare </B><I>target ...</I> ; <B>builtin</B>

<BLOCKQUOTE>
	<P>Don't panic if the target cannot be built.</P>
</BLOCKQUOTE>

<P><B>NotFile </B><I>target ...</I> ; <B>builtin</B>

<BLOCKQUOTE>
	<P>Ignore the timestamp of the target; it is not a file.</P>
</BLOCKQUOTE>

<P><B>NoUpdate</B> <I>target ...</I> ; <B>builtin</B>

<BLOCKQUOTE>
	<P>Create the target if needed, but never update it.
</BLOCKQUOTE>

<P><B>Object</B> <I>object</I> : <I>source</I> ;

<BLOCKQUOTE>
	<P>Compiles a <I>single</I> source file source into <I>object.</I> The Main and Library rules use this rule to
	compile source files.</P>
	<P>Causes <I>source</I> to be scanned for &quot;#include&quot; directives and calls HdrRule to make all included
	files dependencies of <I>object</I>.</P>
	<P>Calls one of the following rules to do the actual compiling, depending on the suffix of source:</P>
	<PRE>		     *.c:   Cc 
		     *.cc:  C++ 
		     *.cpp: C++
		     *.cxx: C++
<STRIKE>		     *.C:   C++ </STRIKE>
		     *.l:   Lex 
		     *.y:   Yacc
		     *.*:   UserObject
</PRE>
</BLOCKQUOTE>

<P><B>ObjectC++Flags</B> <I>source</I> : <I>flags</I> ; <BR>
<B>ObjectCcFlags</B> <I>source</I> : <I>flags</I> ;

<BLOCKQUOTE>
	<P>Add <I>flags</I> to the source-specific value of $(CCFLAGS) or $(C++FLAGS) when compiling <I>source.</I> Any
	file suffix on <I>source</I> is ignored.
</BLOCKQUOTE>

<P><B>ObjectDefines</B> <I>object</I> : <I>defines</I> ;

<BLOCKQUOTE>
	<P>Adds preprocessor symbol definitions to the (gristed) target-specific $(CCDEFS) for the <I>object</I>.
</BLOCKQUOTE>

<P><B>ObjectHdrs</B> <I>source</I> : <I>dirs</I> ;

<BLOCKQUOTE>
	<P>Add <I>dirs</I> to the source-specific value of $(HDRS) when scanning and compiling <I>source.</I> Any file
	suffix on <I>source</I> is ignored.
</BLOCKQUOTE>

<P><B>Objects</B> <I>sources</I> ;

<BLOCKQUOTE>
	<P>For each source file in <I>sources,</I> calls Object to compile the source file into a similarly named object
	file.
</BLOCKQUOTE>

<P><B>Resource </B><I>targets : sources ;</I></P>

<BLOCKQUOTE>
	<P>Invokes the resource compiler to build target.</P>
</BLOCKQUOTE>

<P><B>RmTemps</B> <I>targets</I> : <I>sources</I> ;

<BLOCKQUOTE>
	<P>Marks <I>sources</I> as temporary with the Temporary rule, and deletes <I>sources</I> once <I>targets</I> are
	built. Must be the last rule invoked on <I>targets.</I> Used internally by LibraryFromObjects rule.
</BLOCKQUOTE>

<P><B>Setuid</B> <I>images</I> ;

<BLOCKQUOTE>
	<P>Sets the setuid bit on each of <I>images</I> after linking. (Unix only.)
</BLOCKQUOTE>

<P><B>Shell</B> <I>image</I> : <I>source</I> ;

<BLOCKQUOTE>
	<P>Copies <I>source</I> into the executable sh(1) script <I>image.</I> Ensures that the first line of the script
	is $(SHELLHEADER) (default #!/bin/sh).</P>
</BLOCKQUOTE>

<P><B>SoftLink</B> <I>target</I> : <I>source</I> ;

<BLOCKQUOTE>
	<P>Makes <I>target</I> a symbolic link to <I>source,</I> if it isn't one already. (Unix only.)
</BLOCKQUOTE>

<P><B>SubDir</B> <I>TOP d1 ... dn</I> ;

<BLOCKQUOTE>
	<P>Sets up housekeeping for the source files located in <I><CODE>$(TOP)/d1/.../dn</CODE></I>:
	<UL>
		<LI><I>TOP</I> is the name of a variable; <I>d1</I> thru <I>dn</I> are elements of a directory path.
		<LI>Reads in rules file associated with <I>TOP</I>, if it hasn't already been read.
		<LI>Initializes variables for search paths, output directories, compiler flags, and grist, using <I>d1 ... dn</I>
		tokens.
		<LI>If TOP is not defined, relative path directories are used
	</UL>
	<P>
</BLOCKQUOTE>

<P><B>SubDirC++Flags</B> <I>flags</I> ; <BR>
<B>SubDirCcFlags</B> <I>flags</I> ;

<BLOCKQUOTE>
	<P>Adds <I>flags</I> to the compiler flags for source files in SubDir's directory.
</BLOCKQUOTE>

<P><B>SubDirDefines</B> <I>f1 f2 ...</I> ;

<BLOCKQUOTE>
	<P>Directory dependent compiler macro definitions.</P>
</BLOCKQUOTE>

<P><B>SubDirHdrs</B> <I>d1 ... dn</I> ;

<BLOCKQUOTE>
	<P>Adds the path <I>d1/.../dn/</I> to the header search paths for source files in SubDir's directory. <I>d1</I>
	through <I>dn</I> are elements of a directory path.
</BLOCKQUOTE>

<P><B>SubInclude</B> <I>VAR d1 ... dn</I> ;

<BLOCKQUOTE>
	<P>Reads the Jamfile in <I><CODE>$(VAR)/d1/.../dn/</CODE></I>.
</BLOCKQUOTE>

<P><B>SubRules</B> <I>TOP d1 ... dn</I> :<I> Other-TOP</I> ;

<BLOCKQUOTE>
	<P>Reads another tree's Jamrules.</P>
</BLOCKQUOTE>

<P><B>Temporary </B><I>target ... </I>; <B>builtin</B>

<BLOCKQUOTE>
	<P>Target need not be present if sources haven't changed.</P>
</BLOCKQUOTE>

<P><B>Unique</B> <I>images</I> : <I>flags</I> ; <B>(to be implemented)</B>

<BLOCKQUOTE>
	<P>Adds<I> flags </I>to <I>images</I>, if it does not already exist.<BR>
	Useful for setting compiler flags, without getting duplicates.</P>
</BLOCKQUOTE>

<P><B>Undefines</B> <I>images</I> : <I>symbols</I> ;

<BLOCKQUOTE>
	<P>Adds flags to mark <I>symbols</I> as undefined on link command for <I>images</I>. <I>Images</I> may be referenced
	unsuffixed; the Undefines rule supplies the suffix.
</BLOCKQUOTE>

<P><B>UserObject</B> <I>object</I> : <I>source</I> ;

<BLOCKQUOTE>
	<P>This rule is called by Object for source files with unknown suffixes, and should be defined in Jamrules with
	a user-provided rule to handle the source file types not handled by the Object rule. The Jambase UserObject rule
	merely issues a complaint when it encounters <I>source</I> with file suffixes it does not recognize.
</BLOCKQUOTE>

<P><B>Yacc</B> <I>source.c</I> : <I>source.y</I> ;

<BLOCKQUOTE>
	<P>Process the yacc(1) file <I>source.y</I> and renamed the resulting y.tab.c and y.tab.h to <I>source.c.</I> Produces
	a y.tab.h and renames it to <I>source.h.</I> Called by the <B>Object</B> rule.
</BLOCKQUOTE>

<P>
<HR ALIGN="CENTER">
<A NAME="PSEUDOTARGETS"></A>
<H3>Jambase Pseudotargets</H3>
<P>There are two kinds of Jam targets: file targets and pseudotargets. File targets are objects that can be found
in the filesystem. Pseudotargets are symbolic, defined by <I>NotFile</I> rule and usually represent other targets.
Most Jambase rules that define file targets also define pseudotargets which are dependent on types of file targets.
 A pseudotarget is created by the <B>NotFile</B> rule.<BR>
The Jambase pseudotargets are:</P>

<P>
<TABLE BORDER="1" WIDTH="68%">
	<TR>
		<TD WIDTH="11%">
			<P ALIGN="CENTER"><B>all</B>
		</TD>
		<TD WIDTH="89%">Default target</TD>
	</TR>
	<TR>
		<TD WIDTH="11%">
			<P ALIGN="CENTER"><B>clean</B>
		</TD>
		<TD WIDTH="89%">Remove built targets (except files copied by Install rules)</TD>
	</TR>
	<TR>
		<TD WIDTH="11%">
			<P ALIGN="CENTER"><B>dirs</B>
		</TD>
		<TD WIDTH="89%">Directories where target files are written</TD>
	</TR>
	<TR>
		<TD WIDTH="11%">
			<P ALIGN="CENTER"><B>files</B>
		</TD>
		<TD WIDTH="89%">Files copied by File and Bulk rules</TD>
	</TR>
	<TR>
		<TD WIDTH="11%">
			<P ALIGN="CENTER"><B>first</B>
		</TD>
		<TD WIDTH="89%">first dependent of<B> 'all',</B> for initialization</TD>
	</TR>
	<TR>
		<TD WIDTH="11%">
			<P ALIGN="CENTER"><B>exe</B>
		</TD>
		<TD WIDTH="89%">Executables linked by Main or MainFromObjects rules</TD>
	</TR>
	<TR>
		<TD WIDTH="11%">
			<P ALIGN="CENTER"><B>install</B>
		</TD>
		<TD WIDTH="89%">Files copied by Install rules</TD>
	</TR>
	<TR>
		<TD WIDTH="11%">
			<P ALIGN="CENTER"><B>lib</B>
		</TD>
		<TD WIDTH="89%">Libraries copied by the Library or LibraryFromObjects rules</TD>
	</TR>
	<TR>
		<TD WIDTH="11%">
			<P ALIGN="CENTER"><B>obj</B>
		</TD>
		<TD WIDTH="89%">Compiled objects used to create Main or Library targets</TD>
	</TR>
	<TR>
		<TD WIDTH="11%">
			<P ALIGN="CENTER"><B>shell</B>
		</TD>
		<TD WIDTH="89%">Files copied by Shell rule</TD>
	</TR>
	<TR>
		<TD WIDTH="11%">
			<P ALIGN="CENTER"><B>uninstall</B>
		</TD>
		<TD WIDTH="89%">Remove targets copied by Install rules</TD>
	</TR>
</TABLE>
</P>

<P>In addition, Jambase makes the <B>jam</B> default target &quot;all&quot; depend on &quot;exe&quot;, &quot;lib&quot;,
&quot;obj&quot;, &quot;files&quot;, and &quot;shell&quot;.</P>

<P><B>Modifiers on actions:<BR>
</B>
<TABLE BORDER="1" WIDTH="100%">
	<TR>
		<TD WIDTH="10%">
			<P ALIGN="CENTER">together
		</TD>
		<TD WIDTH="90%">multiple instances of same rule on target get executed once with their sources ($(&gt;)) catenated</TD>
	</TR>
	<TR>
		<TD WIDTH="10%">
			<P ALIGN="CENTER">updated
		</TD>
		<TD WIDTH="90%">refers to updated sources only $(&gt;)</TD>
	</TR>
	<TR>
		<TD WIDTH="10%">
			<P ALIGN="CENTER">ignore
		</TD>
		<TD WIDTH="90%">ignore return status of command</TD>
	</TR>
	<TR>
		<TD WIDTH="10%">
			<P ALIGN="CENTER">quietly
		</TD>
		<TD WIDTH="90%">don't trace execution unless verbose</TD>
	</TR>
	<TR>
		<TD WIDTH="10%">
			<P ALIGN="CENTER">piecemeal
		</TD>
		<TD WIDTH="90%">iterate command each time with small subset of $(&gt;)</TD>
	</TR>
	<TR>
		<TD WIDTH="10%">
			<P ALIGN="CENTER">existing
		</TD>
		<TD WIDTH="90%">refers to currently existing sources only $(&gt;)</TD>
	</TR>
	<TR>
		<TD WIDTH="10%">
			<P ALIGN="CENTER">bind vars
		</TD>
		<TD WIDTH="90%">subject to binding before expanding in actions</TD>
	</TR>
</TABLE>
<BR>

<HR ALIGN="CENTER">
</P>
<H3>Jam Variable Modifiers</H3>

<DL>
	<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>:BS=<I>base.suffix</I></CODE></TD>
			<TD>Base and suffix of the variable (without directory).</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</CODE></TD>
			<TD>If VAR is unset, $(VAR:E) is a list containing a single null string.</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>
</DL>

<P>
<HR ALIGN="CENTER">
<A NAME="VARS"></A>
<H3>Jambase Variables</H3>
<P>Most of the following variables have default values for each platform; refer to the Jambase file to see what
those defaults are.</P>
<P><B>ToDo: </B>What about JAMDATE, JAMUNAME, JAMVERSION, JAMSHELL, JAMUSER</P>
<P>ALL_LOCATE_TARGET</P>

<BLOCKQUOTE>
	<P>Alternative location of built targets. By default, Jambase rules locate built targets in the source tree. By
	setting $(ALL_LOCATE_TARGET) in Jamrules, you can cause <B>jam</B> to write built targets to a location outside
	the source tree.
</BLOCKQUOTE>

<P>AR

<BLOCKQUOTE>
	<P>The archive command used to update Library and LibraryFromObjects targets.
</BLOCKQUOTE>

<P>AS

<BLOCKQUOTE>
	<P>The assembler for As rule targets.
</BLOCKQUOTE>

<P>ASFLAGS

<BLOCKQUOTE>
	<P>Flags handed to the assembler for As.
</BLOCKQUOTE>

<P>AWK

<BLOCKQUOTE>
	<P>The name of awk interpreter, used when copying a shell script for the Shell rule.
</BLOCKQUOTE>

<P>BINDIR

<BLOCKQUOTE>
	<P>Local bin directory. <FONT SIZE="2" FACE="Courier New, Courier">/usr/local/bin</FONT></P>
</BLOCKQUOTE>

<P>CC

<BLOCKQUOTE>
	<P>C compiler used for Cc rule targets.
</BLOCKQUOTE>

<P>CCFLAGS

<BLOCKQUOTE>
	<P>Compile flags for Cc rule targets. The Cc rule sets target-specific $(CCFLAGS) values on its targets.
</BLOCKQUOTE>

<P>C++

<BLOCKQUOTE>
	<P>C++ compiler used for C++ rule targets.
</BLOCKQUOTE>

<P>C++FLAGS

<BLOCKQUOTE>
	<P>Compile flags for C++ rule targets. The C++ rule sets target-specific $(C++FLAGS) values on its targets.
</BLOCKQUOTE>

<P>CHMOD

<BLOCKQUOTE>
	<P>Program (usually chmod(1)) used to set file permissions for Chmod rule.
</BLOCKQUOTE>

<P>CP

<BLOCKQUOTE>
	<P>The file copy program, used by File and Install* rules.
</BLOCKQUOTE>

<P>CRELIB <B>(deprecated)</B>

<BLOCKQUOTE>
	<P>If set, causes the Library rule to invoke the CreLib rule on the target library before attempting to archive
	any members, so that the library can be created if needed.
</BLOCKQUOTE>

<P>DEFINES

<BLOCKQUOTE>
	<P>Preprocessor symbol definitions for Cc and C++ rule targets. The Cc and C++ rules set target-specific $(CCDEFS)
	values on their targets, based on $(DEFINES). (The &quot;indirection&quot; here is required to support compilers
	with baroque command line syntax for setting symbols).
</BLOCKQUOTE>

<P>DOT

<BLOCKQUOTE>
	<P>The operating system-specific name for the current directory.
</BLOCKQUOTE>

<P>DOTDOT

<BLOCKQUOTE>
	<P>The operating system-specific name for the parent directory.
</BLOCKQUOTE>

<P>EXEMODE

<BLOCKQUOTE>
	<P>Permissions for executables linked with Link, Main, and MainFromObjects, on platforms with a Chmod action.
</BLOCKQUOTE>

<P>FILEMODE

<BLOCKQUOTE>
	<P>Permissions for files copied by File or Bulk, on platforms with a Chmod action.
</BLOCKQUOTE>

<P>GROUP

<BLOCKQUOTE>
	<P><I>(Unix only.)</I> The group owner for Install* rule targets.
</BLOCKQUOTE>

<P>HDRGRIST

<BLOCKQUOTE>
	<P>If set, used by the HdrRule to distinguish header files with the same name in different directories.
</BLOCKQUOTE>

<P>HDRPATTERN

<BLOCKQUOTE>
	<P>A regular expression pattern that matches C preprocessor &quot;#include&quot; directives in source files and
	returns the name of the included file.<BR>
	<FONT SIZE="2" FACE="Courier New, Courier">HDRSCAN = &quot;^[ \t]*#[ \t]*include[ \t]*[&lt;\\&quot;]([^\\&quot;&gt;]*)[\\&quot;&gt;].*$&quot;
	;</FONT>
</BLOCKQUOTE>

<P>HDRRULE

<BLOCKQUOTE>
	<P>Name of the rule to invoke with the results of header file scanning. Default is &quot;HdrRule&quot;.</P>
	<P>This is a jam-special variable. If both HDRRULE and HDRSCAN are set on a target, that target will be scanned
	for lines matching $(HDRSCAN), and $(HDDRULE) will be invoked on included files found in the matching $(HDRSCAN)
	lines.</P>
</BLOCKQUOTE>

<P>HDRS

<BLOCKQUOTE>
	<P>Directories to be searched for header files. This is used by the Object rule to:
	<UL>
		<LI>set up search paths for finding files returned by header scans
		<LI>add -I flags on compile commands
	</UL>
	<P>(See STDHDRS.)
</BLOCKQUOTE>

<P>HDRSCAN

<BLOCKQUOTE>
	<P>Regular expression pattern to use for header file scanning. The Object rule sets this to $(HDRPATTERN). This
	is a jam-special variable; see HDRRULE.
</BLOCKQUOTE>

<P>HDRSEARCH

<BLOCKQUOTE>
	<P>Used by the HdrRule to fix the list of directories where header files can be found for a given source file.
</BLOCKQUOTE>

<P>INSTALLGRIST

<BLOCKQUOTE>
	<P>Used by the Install* rules to grist paths to installed files; defaults to &quot;installed&quot;.
</BLOCKQUOTE>

<P>JAMDATE

<BLOCKQUOTE>
	<P>Time and Date at jam startup.</P>
</BLOCKQUOTE>

<P>JAMUNAME

<BLOCKQUOTE>
	<P>Output of uname(1) command (Unix only, but why? It's in Win).</P>
</BLOCKQUOTE>

<P>JAMVERSION

<BLOCKQUOTE>
	<P>Jam version, reported by <FONT SIZE="2" FACE="Courier New, Courier">jam -v</FONT>.</P>
</BLOCKQUOTE>

<P>JAMSHELL

<BLOCKQUOTE>
	<P>Shell invocation control when Jam invokes an action block.<BR>
	<FONT SIZE="2" FACE="Courier New, Courier">JAMSHELL = &quot;/bin/sh -c %&quot; </FONT>on unix.</P>
</BLOCKQUOTE>

<P>JAMUSER

<BLOCKQUOTE>
	<P>Username that invoked jam.</P>
</BLOCKQUOTE>

<P>JAMFILE

<BLOCKQUOTE>
	<P>Default is &quot;Jamfile&quot;; the name of the user-written rules file found in each source directory.
</BLOCKQUOTE>

<P>JAMRULES

<BLOCKQUOTE>
	<P>Default is &quot;Jamrules&quot;; the name of a rule definition file to be read in at the first SubDir rule invocation.
</BLOCKQUOTE>

<P>KEEPOBJS

<BLOCKQUOTE>
	<P>If set, tells the LibraryFromObjects rule not to delete object files once they are archived.
</BLOCKQUOTE>

<P>LEX

<BLOCKQUOTE>
	<P>The lex(1) command and flags.
</BLOCKQUOTE>

<P>LIBDIR

<BLOCKQUOTE>
	<P>Local library directory for installs. Default: <FONT SIZE="2" FACE="Courier New, Courier">/usr/local/lib</FONT>
	or <FONT SIZE="2" FACE="Courier New, Courier">$(MSVCDIR)\\lib</FONT>
</BLOCKQUOTE>

<P>LINK

<BLOCKQUOTE>
	<P>The linker. Defaults to $(CC).
</BLOCKQUOTE>

<P>LINKFLAGS

<BLOCKQUOTE>
	<P>Flags handed to the linker. Defaults to $(CCFLAGS).
</BLOCKQUOTE>

<P>LINKLIBS

<BLOCKQUOTE>
	<P>List of external libraries to link with. The target image does not depend on these libraries.<BR>
	Windows: <FONT SIZE="2" FACE="Courier New, Courier"><BR>
	$(LIBDIR)\\libc.lib <BR>
	$(LIBDIR)\\oldnames.lib <BR>
	$(LIBDIR)\\kernel32.lib ;</FONT></P>
	<P>Unix: ... none yet. libc, libpthreads, libdl ...
</BLOCKQUOTE>

<P>LN

<BLOCKQUOTE>
	<P>The hard link command for HardLink rule.
</BLOCKQUOTE>

<P>LOCATE

<BLOCKQUOTE>
	<P>Where to plop something not found with SEARCH.
</BLOCKQUOTE>

<P>LOCATE_SOURCE

<BLOCKQUOTE>
	<P>Used to set the location of <I>generated source files.</I> The Yacc, Lex, and GenFile rules set LOCATE on their
	targets to $(LOCATE_SOURCE). $(LOCATE_SOURCE) is initialized by the SubDir rule to the source directory itself.
	(see ALL_LOCATE_TARGET.)
</BLOCKQUOTE>

<P>LOCATE_TARGET

<BLOCKQUOTE>
	<P>Used to set the location of built binary targets. The Object rule, and hence the Main and Library rules, set
	LOCATE on their targets to $(LOCATE_TARGET). $(LOCATE_TARGET) is initialized by the SubDir rule to the source directory
	itself. (See ALL_LOCATE_TARGET.)
</BLOCKQUOTE>

<P>MANDIR

<BLOCKQUOTE>
	<P>Default directory for man pages. Default: <FONT SIZE="2" FACE="Courier New, Courier">/usr/local/man</FONT> .</P>
</BLOCKQUOTE>

<P>MKDIR

<BLOCKQUOTE>
	<P>The 'create directory' command used for the MkDir rule.
</BLOCKQUOTE>

<P>MODE

<BLOCKQUOTE>
	<P>The target-specific file mode (permissions) for targets of the Shell, Setuid, Link, and Install* rules. Used
	by the Chmod action; hence relevant to NT only.
</BLOCKQUOTE>

<P>MSVCDIR

<BLOCKQUOTE>
	<P>Selects Microsoft Visual C NT 6.0 and later compile &amp; link actions on NT. 
</BLOCKQUOTE>

<P>MV

<BLOCKQUOTE>
	<P>The file rename command and options.
</BLOCKQUOTE>

<P>NEEDLIBS

<BLOCKQUOTE>
	<P>The list of libraries used when linking an executable. Used by the Link rule.
</BLOCKQUOTE>

<P>NOARSCAN

<BLOCKQUOTE>
	<P>If set, indicates that library members' timestamps can't be found, and prevents the individual objects from
	being deleted, so that their timestamps can be used instead.
</BLOCKQUOTE>

<P>NOARUPDATE

<BLOCKQUOTE>
	<P>If set, indicates that libraries can't be updated, but only created whole.
</BLOCKQUOTE>

<P>NT</P>
<P>OPTIM

<BLOCKQUOTE>
	<P>The C compiler flag for optimization, used by Cc and C++ rules.
</BLOCKQUOTE>

<P>OS

<BLOCKQUOTE>
	<P>$(OS) contains the platform ($(NT), $(AIX), $(HPUX), $(SOLARIS), etc). Useful in switch statements.<BR>
	switch $(OS) {<BR>
	case NT : stmt1 ; stmt2 ;<BR>
	case AIX : stmt1 ; stmt2 ;<BR>
	}</P>
</BLOCKQUOTE>

<P>OSPLAT

<BLOCKQUOTE>
	<P>Type of hardware platform ( VAX, PPC, AXP, X86, SPARC, MIPS, ARM, IA64, 390)</P>
</BLOCKQUOTE>

<P>OSFULL

<BLOCKQUOTE>
	<P>The concatenation of $(OS)$(OSVER)$(OSPLAT), used when jam builds itself to determine the target binary directory.
	$(OS) and $(OSPLAT) are determined by jam at its compile time (in jam.h). $(OSVER) can optionally be set by the
	user.
</BLOCKQUOTE>

<P>OWNER

<BLOCKQUOTE>
	<P>The owner of installed files. Used by Install* rules.
</BLOCKQUOTE>

<P>RANLIB

<BLOCKQUOTE>
	<P>The name of the ranlib command. If set, causes the Ranlib action to be applied after the Archive action to targets
	of the Library rule.
</BLOCKQUOTE>

<P>RC

<BLOCKQUOTE>
	<P>Resource Compiler command.</P>
</BLOCKQUOTE>

<P>RCP

<BLOCKQUOTE>
	<P>Remote copy command.</P>
</BLOCKQUOTE>

<P>RM

<BLOCKQUOTE>
	<P>The command and options to remove a file.
</BLOCKQUOTE>

<P>RMDIR

<BLOCKQUOTE>
	<P>The command and options to remove a directory.</P>
</BLOCKQUOTE>

<P>RSH

<BLOCKQUOTE>
	<P>Remote Shell Command.</P>
</BLOCKQUOTE>

<P>SEARCH

<BLOCKQUOTE>
	<P>Where to find something; used during binding and actions.</P>
</BLOCKQUOTE>

<P>SEARCH_SOURCE

<BLOCKQUOTE>
	<P>The directory to find sources listed with Main, Library, Object, Bulk, File, Shell, InstallBin, InstallLib,
	and InstallMan rules. This works by setting the jam-special variable SEARCH to the value of $(SEARCH_SOURCE) for
	each of the rules' sources. The SubDir rule initializes SEARCH_SOURCE for each directory.
</BLOCKQUOTE>

<P>SED

<BLOCKQUOTE>
	<P>Shell editor command..</P>
</BLOCKQUOTE>

<P>SHELLHEADER

<BLOCKQUOTE>
	<P>A string inserted to the first line of every file created by the Shell rule.
</BLOCKQUOTE>

<P>SHELLMODE

<BLOCKQUOTE>
	<P>Permissions for files installed by Shell rule.
</BLOCKQUOTE>

<P>SLASH

<BLOCKQUOTE>
	<P>Directory separator character. <FONT SIZE="2" FACE="Courier New, Courier">(/)</FONT> on unix; <FONT SIZE="2"
	FACE="Courier New, Courier">(\)</FONT> on windows..</P>
</BLOCKQUOTE>

<P>SOURCE_GRIST

<BLOCKQUOTE>
	<P>Set by the SubDir to a value derived from the directory name, and used by Objects and related rules as 'grist'
	to perturb file names.
</BLOCKQUOTE>

<P>STDHDRS

<BLOCKQUOTE>
	<P>Directories where headers can be found without resorting to using the flag to the C compiler. The $(STDHDRS)
	directories are used to find headers during scanning, but are not passed to the compiler commands as -I paths.<BR>
	<FONT SIZE="2" FACE="Courier New, Courier">$(MSVCDIR)\\include</FONT> on windows.
</BLOCKQUOTE>

<P>SUBDIR

<BLOCKQUOTE>
	<P>The path from the current directory to the directory last named by the SubDir rule.
</BLOCKQUOTE>

<P>SUBDIRRESET

<BLOCKQUOTE>
	<P>Flags to manage on changing directories. Jambase example:<BR>
	<FONT SIZE="2" FACE="Courier New, Courier">SUBDIRRESET ?= ASFLAGS HDRS C++FLAGS CCFLAGS ;</FONT></P>
</BLOCKQUOTE>

<P>SUBDIRRULES

<BLOCKQUOTE>
	<P>Unknown.
</BLOCKQUOTE>

<P>SUFDLL

<BLOCKQUOTE>
	<P>The suffix for <B>shared</B> libraries. Used by Library and Archive rules.<BR>
	<FONT SIZE="2" FACE="Courier New, Courier">.so</FONT> on unix; <FONT SIZE="2" FACE="Courier New, Courier">.dll</FONT>
	on windows.</P>
</BLOCKQUOTE>

<P>SUFEXE

<BLOCKQUOTE>
	<P>The suffix for executable files, if none provided. Used by the Main rule.<BR>
	<FONT SIZE="2" FACE="Courier New, Courier">.exe</FONT> on windows; null on unix.</P>
</BLOCKQUOTE>

<P>SUFILK <B>(unneeded. No unix counterpart)</B>

<BLOCKQUOTE>
	<P>The suffix for xxx files. <FONT SIZE="2" FACE="Courier New, Courier">.ilk </FONT>on windows.</P>
</BLOCKQUOTE>

<P>SUFLIB

<BLOCKQUOTE>
	<P>The suffix for <B>archive</B> libraries. Used by Library and Archive rules.<BR>
	<FONT SIZE="2" FACE="Courier New, Courier">.a</FONT> on unix. <FONT SIZE="2" FACE="Courier New, Courier">.lib</FONT>
	on windows.
</BLOCKQUOTE>

<P>SUFOBJ

<BLOCKQUOTE>
	<P>The suffix for object files. Used by the Objects and related rules.<BR>
	<FONT SIZE="2" FACE="Courier New, Courier">.obj </FONT>on windows; <FONT SIZE="2" FACE="Courier New, Courier">.o</FONT>
	on unix.
</BLOCKQUOTE>

<P>SUFPDB <B>(unneeded. No unix counterpart)</B>

<BLOCKQUOTE>
	<P>The suffix for xxx files. <FONT SIZE="2" FACE="Courier New, Courier">.pdb </FONT>on windows.</P>
</BLOCKQUOTE>

<P>TOP

<BLOCKQUOTE>
	<P>The path from the current directory to the directory that has the Jamrules file. Used by the SubDir rule.</P>
</BLOCKQUOTE>

<P>UNDEFFLAG

<BLOCKQUOTE>
	<P>The flag prefixed to each symbol for the Undefines rule (i.e., the compiler flag for undefined symbols). &quot;<FONT
	SIZE="2" FACE="Courier New, Courier">-u _&quot;</FONT> on windows; &quot;<FONT SIZE="2" FACE="Courier New, Courier">-u</FONT>&quot;
	on unix.
</BLOCKQUOTE>

<P>UNIX

<BLOCKQUOTE>
	<P>$(UNIX) is true, if on a Unix platform.</P>
</BLOCKQUOTE>

<P>YACC

<BLOCKQUOTE>
	<P>The yacc(1) command.
</BLOCKQUOTE>

<P>YACCFILES

<BLOCKQUOTE>
	<P>The base filename generated by yacc(1).
</BLOCKQUOTE>

<P>YACCFLAGS

<BLOCKQUOTE>
	<P>The yacc(1) command flags.
</BLOCKQUOTE>

<P>YACCGEN

<BLOCKQUOTE>
	<P>The suffix used on generated yacc(1) output.
</BLOCKQUOTE>

<P>
<HR ALIGN="CENTER">
<B>Jam Language</B></P>
<P><B>Statements<BR>
</B>
<TABLE BORDER="1" WIDTH="98%">
	<TR>
		<TD WIDTH="23%">
			<P ALIGN="CENTER">rule Rule
		</TD>
		<TD WIDTH="77%">statements to process a rule</TD>
	</TR>
	<TR>
		<TD WIDTH="23%">
			<P ALIGN="CENTER">actions Rule
		</TD>
		<TD WIDTH="77%">system commands for target update</TD>
	</TR>
</TABLE>
<B>Modifiers on actions:<BR>
</B>
<TABLE BORDER="1" WIDTH="100%">
	<TR>
		<TD WIDTH="10%">
			<P ALIGN="CENTER">together
		</TD>
		<TD WIDTH="90%">multiple instances of same rule on target get executed once with their sources ($(&gt;)) catenated</TD>
	</TR>
	<TR>
		<TD WIDTH="10%">
			<P ALIGN="CENTER">updated
		</TD>
		<TD WIDTH="90%">refers to updated sources only $(&gt;)</TD>
	</TR>
	<TR>
		<TD WIDTH="10%">
			<P ALIGN="CENTER">ignore
		</TD>
		<TD WIDTH="90%">ignore return status of command</TD>
	</TR>
	<TR>
		<TD WIDTH="10%">
			<P ALIGN="CENTER">quietly
		</TD>
		<TD WIDTH="90%">don't trace execution unless verbose</TD>
	</TR>
	<TR>
		<TD WIDTH="10%">
			<P ALIGN="CENTER">piecemeal
		</TD>
		<TD WIDTH="90%">iterate command each time with small subset of $(&gt;)</TD>
	</TR>
	<TR>
		<TD WIDTH="10%">
			<P ALIGN="CENTER">existing
		</TD>
		<TD WIDTH="90%">refers to currently existing sources only $(&gt;)</TD>
	</TR>
	<TR>
		<TD WIDTH="10%">
			<P ALIGN="CENTER">bind vars
		</TD>
		<TD WIDTH="90%">subject to binding before expanding in actions</TD>
	</TR>
</TABLE>
<B>Special Rules:<BR>
</B>
<TABLE BORDER="1" WIDTH="100%">
	<TR>
		<TD WIDTH="11%">
			<P ALIGN="CENTER">Always
		</TD>
		<TD WIDTH="89%">always build a target</TD>
	</TR>
	<TR>
		<TD WIDTH="11%">
			<P ALIGN="CENTER">Depends
		</TD>
		<TD WIDTH="89%">builds dependency graph. Appends each source on the dependency list of each target. Binds both targets and sources
			as TARGETs.</TD>
	</TR>
	<TR>
		<TD WIDTH="11%">
			<P ALIGN="CENTER">Echo
		</TD>
		<TD WIDTH="89%">blurt out targets on stdout</TD>
	</TR>
	<TR>
		<TD WIDTH="11%">
			<P ALIGN="CENTER">Exit
		</TD>
		<TD WIDTH="89%">blurt out tarets and exit</TD>
	</TR>
	<TR>
		<TD WIDTH="11%">
			<P ALIGN="CENTER">Includes
		</TD>
		<TD WIDTH="89%">marks source as headers for target (codependency)</TD>
	</TR>
	<TR>
		<TD WIDTH="11%">
			<P ALIGN="CENTER">Leaves
		</TD>
		<TD WIDTH="89%">&nbsp;</TD>
	</TR>
	<TR>
		<TD WIDTH="11%">
			<P ALIGN="CENTER">NoCare
		</TD>
		<TD WIDTH="89%">don't panic if target can't be built</TD>
	</TR>
	<TR>
		<TD WIDTH="11%">
			<P ALIGN="CENTER">NoUpdate
		</TD>
		<TD WIDTH="89%">create target if needed; never update it</TD>
	</TR>
	<TR>
		<TD WIDTH="11%">
			<P ALIGN="CENTER">NotFile
		</TD>
		<TD WIDTH="89%">ignore timestamp of target (it's not a file)</TD>
	</TR>
	<TR>
		<TD WIDTH="11%">
			<P ALIGN="CENTER">Temporary
		</TD>
		<TD WIDTH="89%">target need not be present if sources haven't changed</TD>
	</TR>
</TABLE>
<B>Special Variables set by Jam:<BR>
</B>
<TABLE BORDER="1" WIDTH="100%">
	<TR>
		<TD WIDTH="19%">
			<P ALIGN="CENTER">$(&lt;)
		</TD>
		<TD WIDTH="81%">targets of rule (to left of : )</TD>
	</TR>
	<TR>
		<TD WIDTH="19%">
			<P ALIGN="CENTER">$(&gt;)
		</TD>
		<TD WIDTH="81%">sources of rule (to the right of : )</TD>
	</TR>
	<TR>
		<TD WIDTH="19%">
			<P ALIGN="CENTER">$(xxx)
		</TD>
		<TD WIDTH="81%">true on xxx (UNIX, NT, AIX, HPUX, SOLARIS)</TD>
	</TR>
	<TR>
		<TD WIDTH="19%">
			<P ALIGN="CENTER">$(OS)
		</TD>
		<TD WIDTH="81%">name of Operating System</TD>
	</TR>
	<TR>
		<TD WIDTH="19%">
			<P ALIGN="CENTER">$(JAMVERSION)
		</TD>
		<TD WIDTH="81%">version number 2.5a</TD>
	</TR>
</TABLE>
<B>Special Variables used by Jam:<BR>
</B>
<TABLE BORDER="1" WIDTH="100%">
	<TR>
		<TD WIDTH="15%">
			<P ALIGN="CENTER">SEARCH
		</TD>
		<TD WIDTH="85%">where to find something (used during binding and actions)</TD>
	</TR>
	<TR>
		<TD WIDTH="15%">
			<P ALIGN="CENTER">LOCATE
		</TD>
		<TD WIDTH="85%">where to plop something not found with SEARCH</TD>
	</TR>
	<TR>
		<TD WIDTH="15%">
			<P ALIGN="CENTER">HDRRULE
		</TD>
		<TD WIDTH="85%">rule to handle include files</TD>
	</TR>
	<TR>
		<TD WIDTH="15%">
			<P ALIGN="CENTER">HDRSCAN
		</TD>
		<TD WIDTH="85%">egrep regex to extract include files</TD>
	</TR>
</TABLE>
</P>
<H2><B>Jam rules</B></H2>
<P><B>Special targets:</B></P>
<P>
<TABLE BORDER="1" WIDTH="100%">
	<TR>
		<TD WIDTH="8%">
			<P ALIGN="CENTER"><B>all</B>
		</TD>
		<TD WIDTH="92%">parent of <B>first, shell, files, lib, exe<BR>
			</B>(default if jam command line targets are not supplied)</TD>
	</TR>
	<TR>
		<TD WIDTH="8%">
			<P ALIGN="CENTER"><B>first</B>
		</TD>
		<TD WIDTH="92%">first dependent of<B> 'all',</B> for potential initialization</TD>
	</TR>
	<TR>
		<TD WIDTH="8%">
			<P ALIGN="CENTER"><B>shell</B>
		</TD>
		<TD WIDTH="92%">all <B>Shell </B>targets</TD>
	</TR>
	<TR>
		<TD WIDTH="8%">
			<P ALIGN="CENTER"><B>files</B>
		</TD>
		<TD WIDTH="92%">all <B>File</B> targets</TD>
	</TR>
	<TR>
		<TD WIDTH="8%">
			<P ALIGN="CENTER"><B>lib</B>
		</TD>
		<TD WIDTH="92%">all <B>Library</B> targets</TD>
	</TR>
	<TR>
		<TD WIDTH="8%">
			<P ALIGN="CENTER"><B>exe</B>
		</TD>
		<TD WIDTH="92%">all <B>Main</B> targets</TD>
	</TR>
	<TR>
		<TD WIDTH="8%">
			<P ALIGN="CENTER"><B>dirs</B>
		</TD>
		<TD WIDTH="92%">all <B>MkDir</B> targets</TD>
	</TR>
	<TR>
		<TD WIDTH="8%">
			<P ALIGN="CENTER"><B>clean</B>
		</TD>
		<TD WIDTH="92%">remove all <B>Shell, File, Library, Main</B> targets</TD>
	</TR>
	<TR>
		<TD WIDTH="8%">
			<P ALIGN="CENTER"><B>uninstall</B>
		</TD>
		<TD WIDTH="92%">remove all <B>Install </B>targets</TD>
	</TR>
</TABLE>
</P>
<P><B>Jam Built-In Rules:</B></P>
<PRE><B></B></PRE>
<P>
<TABLE BORDER="1" WIDTH="96%">
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">As</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">As obj.o : source.s ;</FONT></TD>
		<TD WIDTH="39%"><FONT FACE="Courier New, Courier">.s -&gt; .o</FONT></TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">Bulk</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">Bulk dir : files ;</FONT></TD>
		<TD WIDTH="39%">populate directory with many files</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">Cc</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">Cc obj.o : source.c ;</FONT></TD>
		<TD WIDTH="39%"><FONT FACE="Courier New, Courier">.c -&gt; .o</FONT></TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">C++</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">C++ obj.o : source.cc ;</FONT></TD>
		<TD WIDTH="39%"><FONT FACE="Courier New, Courier">.cpp -&gt; .o</FONT></TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">Clean</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">Clean clean : sources ;</FONT></TD>
		<TD WIDTH="39%">remove source targets with 'jam clean'</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">File</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">File dest : source ;</FONT></TD>
		<TD WIDTH="39%">copy file</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">GenFile</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">GenFile source.c : program args ;</FONT></TD>
		<TD WIDTH="39%">make custom file</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER">Glob
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">Glob directories : patterns ;</FONT></TD>
		<TD WIDTH="39%">Scans <I>directories</I> for files matching regex <I>patterns</I>, returning the list of matching files.</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">HardLink</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">HardLink target : source ;</FONT></TD>
		<TD WIDTH="39%">make link from source to target</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">HdrRule</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">HdrRule source : headers ;</FONT></TD>
		<TD WIDTH="39%">handle #includes</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">InstallInto</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">InstallInto dir : sources ;</FONT></TD>
		<TD WIDTH="39%">install any files</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">InstallBin</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">InstallBin dir : sources ;</FONT></TD>
		<TD WIDTH="39%">install binaries</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">InstallLib</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">InstallLib dir : sources ;</FONT></TD>
		<TD WIDTH="39%">install library files</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">InstallFile</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">InstallFile dir : sources ;</FONT></TD>
		<TD WIDTH="39%">install files</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">InstallMan</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">InstallMan dir : sources ;</FONT></TD>
		<TD WIDTH="39%">install man pages</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">InstallShell</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">InstallShell dir : sources ;</FONT></TD>
		<TD WIDTH="39%">install shell scripts</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">Lex</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">Lex source.c : source.l ;</FONT></TD>
		<TD WIDTH="39%"><FONT FACE="Courier New, Courier">.l -&gt; .o</FONT></TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">Library</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">Library lib : source ;</FONT></TD>
		<TD WIDTH="39%">archive library from source</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">LibraryFromObjects</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">LibraryFromObjects lib : objects ;</FONT></TD>
		<TD WIDTH="39%">archive library from objects</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">Libs</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">Libs images : libraries ;</FONT></TD>
		<TD WIDTH="39%">dependency on libraries</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">Main</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">Main image : source ;</FONT></TD>
		<TD WIDTH="39%">link executable from source</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">MainFromObjects</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">MainFromObjects image : objects ;</FONT></TD>
		<TD WIDTH="39%">link executable from objects</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">Match</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">Match</FONT><I><FONT SIZE="2" FACE="Courier New, Courier"> regexps </FONT></I><B><FONT
			SIZE="2" FACE="Courier New, Courier">:</FONT></B><I><FONT SIZE="2" FACE="Courier New, Courier"> list </FONT></I><B><FONT
			SIZE="2" FACE="Courier New, Courier">;</FONT></B></TD>
		<TD WIDTH="39%">Match regular expression<I> regexps</I> against strings in<I> list</I>.</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">MkDir</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">MkDir dir ;</FONT></TD>
		<TD WIDTH="39%">make directory</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">Object</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">Object object : source ;</FONT></TD>
		<TD WIDTH="39%">compile object from source</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">ObjectCcFlags</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">ObjectCcFlags source : flags ;</FONT></TD>
		<TD WIDTH="39%">c compiler flags for source</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">ObjectC++Flags</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">ObjectC++Flags source : flags ;</FONT></TD>
		<TD WIDTH="39%">c++ compiler flags for source</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">ObjectHdrs</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">ObjectHdrs source : dirs ;</FONT></TD>
		<TD WIDTH="39%">include directories for source</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">Objects</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">Objects sources ;</FONT></TD>
		<TD WIDTH="39%">compile sources</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">RmTemps</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">RmTemps target : sources ;</FONT></TD>
		<TD WIDTH="39%">remove temp sources after target made</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">Setuid</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">Setuid images ;</FONT></TD>
		<TD WIDTH="39%">mark executables suid</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">SoftLink</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">SoftLink target : source ;</FONT></TD>
		<TD WIDTH="39%">make symlink</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">SubDir</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">SubDir TOP d1 d2 ... ;</FONT></TD>
		<TD WIDTH="39%">start subdirectory Jamfile</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">SubDirCcFlags</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">SubDirCcFlags flags ;</FONT></TD>
		<TD WIDTH="39%">c compiler flags until next SubDir</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">SubDirC++Flags</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">SubDirC++Flags flags ;</FONT></TD>
		<TD WIDTH="39%">c++ compiler flags until next SubDir</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">SubDirHdrs</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">SubDirHdrs d1 d2 ... ;</FONT></TD>
		<TD WIDTH="39%">include directory until next SubDir</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">SubInclude</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">SubInclude TOP d1 d2 ... ;</FONT></TD>
		<TD WIDTH="39%">Include subdirectory Jamfile</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">Shell</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">Shell exe : source ;</FONT></TD>
		<TD WIDTH="39%">make a shell executable</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">Undefines</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">Undefines images : symbols ;</FONT></TD>
		<TD WIDTH="39%">save undef's for linking</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">UserObject</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">UserObject object : source ;</FONT></TD>
		<TD WIDTH="39%">handle unknown suffixes for object</TD>
	</TR>
	<TR>
		<TD WIDTH="18%">
			<P ALIGN="CENTER"><B><FONT FACE="Courier New, Courier">Yacc</FONT></B>
		</TD>
		<TD WIDTH="43%"><FONT SIZE="2" FACE="Courier New, Courier">Yacc source.c : source.y ;</FONT></TD>
		<TD WIDTH="39%"><FONT FACE="Courier New, Courier">.y -&gt; .c</FONT></TD>
	</TR>
</TABLE>
</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/Jambase.html
#10 2564 rmg Use MSVCDIR instead of MSVCNT if MSVCNT isn't set.
 Microsoft
changed the name to MSVCDIR in VC 6.0.

Porting change documented in RELNOTES.

=== computer:1666: Change 39600 by seiwald@play-seiwald on 2002/12/27 18:06:42
#9 2511 rmg Make the description of SubDir match the Jambase code.
#8 2488 rmg Remove the /MR suffix from Jam.

=== computer:1666: Change 37146 by seiwald@play-seiwald on 2002/10/21 15:23:18
#7 1579 rmg Document the new SoftLink rule.
#6 1578 rmg Document the addition of INSTALLGRIST.
Related changes: 1577, 1572
#5 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
#4 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.
#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