<!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 |