<!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 "lib" 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 $(<) 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 "<I>image</I> <I>target</I> <I>sources</I>" 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 "#include"
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 "lib" 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 "#include" 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 "all" depend on "exe", "lib",
"obj", "files", and "shell".</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 ($(>)) catenated</TD>
</TR>
<TR>
<TD WIDTH="10%">
<P ALIGN="CENTER">updated
</TD>
<TD WIDTH="90%">refers to updated sources only $(>)</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 $(>)</TD>
</TR>
<TR>
<TD WIDTH="10%">
<P ALIGN="CENTER">existing
</TD>
<TD WIDTH="90%">refers to currently existing sources only $(>)</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 "indirection" 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 "#include" directives in source files and
returns the name of the included file.<BR>
<FONT SIZE="2" FACE="Courier New, Courier">HDRSCAN = "^[ \t]*#[ \t]*include[ \t]*[<\\"]([^\\">]*)[\\">].*$"
;</FONT>
</BLOCKQUOTE>
<P>HDRRULE
<BLOCKQUOTE>
<P>Name of the rule to invoke with the results of header file scanning. Default is "HdrRule".</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 "installed".
</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 = "/bin/sh -c %" </FONT>on unix.</P>
</BLOCKQUOTE>
<P>JAMUSER
<BLOCKQUOTE>
<P>Username that invoked jam.</P>
</BLOCKQUOTE>
<P>JAMFILE
<BLOCKQUOTE>
<P>Default is "Jamfile"; the name of the user-written rules file found in each source directory.
</BLOCKQUOTE>
<P>JAMRULES
<BLOCKQUOTE>
<P>Default is "Jamrules"; 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 & 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). "<FONT
SIZE="2" FACE="Courier New, Courier">-u _"</FONT> on windows; "<FONT SIZE="2" FACE="Courier New, Courier">-u</FONT>"
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 ($(>)) catenated</TD>
</TR>
<TR>
<TD WIDTH="10%">
<P ALIGN="CENTER">updated
</TD>
<TD WIDTH="90%">refers to updated sources only $(>)</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 $(>)</TD>
</TR>
<TR>
<TD WIDTH="10%">
<P ALIGN="CENTER">existing
</TD>
<TD WIDTH="90%">refers to currently existing sources only $(>)</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%"> </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">$(<)
</TD>
<TD WIDTH="81%">targets of rule (to left of : )</TD>
</TR>
<TR>
<TD WIDTH="19%">
<P ALIGN="CENTER">$(>)
</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 -> .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 -> .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 -> .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 -> .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 -> .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 | ||