==============================================================================================================================================================Release notes for Jam 2.5(aka Jam - make(1) redux)0. Changes between 2.5rc1 and 2.5rc2:Several uninitialized memory accesses have been corrected invar_expand() and file_archscan(), thanks to Matt Armstrong.Fix 'actions updated' broken by change 2487. (See thedescription to change 2612 for details).Fix "includes of includes not being considered", broken by 2499.(See the description to change 2614 for details).Remove NT FQuote rule, as, \" is required to pass quotes onthe command line.Porting change: allow jam to build with BorlandC 5.5Porting change: for WinXP IA64; set MSVCNT to the root of theSDK and MSVCVer to Win64; change handle type to long long (toomuch to include windows.h?); bury IA64 in the library path inJambase.Porting change: Mac classic MPW Codewarrior 7 upgrades: minorcompiling issues, new paths in Jambase for libraries andincludes, and separate out GenFile1 that sets PATH for UNIXonly, as it does't work under MPW (or anything other than withsh).Porting change: Minor Cray porting: make hashitem()'s keyvalue unsigned so we're guaranteed no integer overflows.SubDir's support for an externally set TOP variable was brokenin 2.5rc1. It now works as it did in 2.4. Further, using SubDirto include a subpart of an SubDir tree now works. Previously,you could only include the root of another SubDir tree. For example,SubDir ALL src builds ;SubInclude ALL src server support ;Essentially includes the ../server/support/Jamfile, without gettingconfused as to the current directory.0.1. Changes between 2.5rc2 and 2.5rc3:More SubDir work after rc2: if a Jamrules invoked SubDir toestablish other roots, and that Jamrules isn't in the currentdirectory, the roots it established were wrong.Fix mysterious rebuild problem: in an attempt to make 'jam -dc'output report headers updates more accurately, internal (headercollection) targets were being bound as T_BIND_PARENTS so thatthey could carry the timestamp of the actual source file. Butthat caused the fate of the internal node to be marked asT_FATE_NEEDTMP if anything they included was newer, and thateasily happens among header files (something is always newerthan something else). Now internal targets carry their parentstime, but with T_BIND_UNBOUND, like other NOTFILE targets.Remove temp .bat files created on NT. They used to all havethe same name and get reused, but with 2.5 the names were saltedwith the PID and they would litter $TEMP. Now they get removedafter being used.Undocumented support for SUBDIRRULES, user-provided rulesto invoke at the end of the SubDir rule, and SUBDIRRESET,SUBDIR variables to reset (like SUBDIRC++FLAGS, SUBDIRHDRS, etc)for each new SubDir.1. Release info:Jam 2.5January 20, 2002VERSION 2.52. CompatibilityJam 2.5 is upward compatible with Jam 2.4The Jam 2.5 language is a superset of the 2.4 language;Jamfiles, Jambase, and other rulesets used in 2.4 can be usedwith the 2.5 language support.3. Changes since 2.4.3.1. Changes to Jam LanguageThe 'return' statement now actually returns, and there are nowbreak & continue statements for for & while loops.3.2. Jambase ChangesMkDir now grists directories with 'dir', so that directorytargets can be distinguished from other targets.SubDir now allows multiple overlapping roots (top leveldirectories): the first SubDir of a new root uses the CWD ofjam to set that root; subsquent SubDirs use the current SUBDIRto set the new root. New FSubDirPath to compute a path (givenSubDir arguments) and SubRules to include another root'sJamrules. Jamrules only included if present; no error issuedif no Jamrules file.$(RMDIR) has been defined for NT and defaulted to $(RM)everwhere else. Not much tested. For Michael Champigny.GenFile actions (on UNIX) now put . in the PATH for the executionof the command, so that (at least) when jam builds itself . doesnot need to be in the global path. It is the rare case where atarget bound in the current directory can't be used directly,so we fudge it by setting PATH.3.3 'jam' Changes (See Jam.html)The whole /MR of Jam's name has been dropped. It was intendedto avoid trademark infringement of JYACC's JAM, but as far aswe can tell (a) it wasn't enough to avoid infringement and (b)the trademark has lapsed anyhow.If header dependencies cause an object to be recompiled andthe source file is a temporary, the temporary is nowreconstructed. Previously, headers weren't considered whendeciding when to reconstruct a temporary.-d has been reworked to make it easier to display more usefultracing information separate from the debugging gunk:-da - show all actions (formerly -d2)-dc - show 'causes' for rebuilding (new output)-dd - show dependencies (new output)-dm - show make graph (aka -d3)-dx - show executable text (formerly -d2)-dd is new, and more display options are anticipated.-n now implies -dax.The message "...using xxx..." now only shows up with -da.Jam.html was extensively updated, in an attempt at lucidity.3.4. Jam internal code changesRemoved spurious search() in 'on' statement handling, thanks(again) to Ingo Weinhold.Fix 'includes' support so that included files aren't treatedas direct dependencies during the command execution phase. Ifan included file failed to build, make1() would bypass theincluding file. Now make0() appends each child's 'includes'onto its own 'depends' list, eliminating 'includes'-specificcode in make0() and make1().Rewrite of the past: updated all jam's source with comments toreflect changes since about 2.3, very early 2001.4. Fixed bugsFixed the description of the :E modifier in Jam.html.Setting target-specific variables while under the influence ofthe target's target-specific variables caused the _global_ valuesto be modified. This happened both during header file scanning(HdrRule is called when target-specific variables are in effect)and with the "on target statement" syntax. Now settingtarget-specific variables works again. Thanks to Matt Armstrong.Setting "var on target ?= value" now works as expected: if thevariable is already set on the target, it is left unchanged.Previously, ?= was ignored and the variable was set anyway.Thanks to Chris Antos.Variable expansion in actions has always put an extra blankspace after the last list element, but the expansion is describedin the code as "space separated". Now the last blank is suppressedto match. From Miklos Fazekas.The temp file name used by jam for .bat files on NT now containsjam's pid, so that multiple jams can run on the same system (withthe same $TEMP). Thanks to Steve Anichini.Several uninitialized memory accesses have been corrected invar_expand() and file_archscan(), thanks to Matt Armstrong.5. PortingThe Makefile now uses $(EXENAME) (./jam0 on UNIX, .\jam0.exeon NT) instead of just "jam0", so that . doesn't need to be inyour PATH to bootstrap.MACOSX updates: use 'ar' instead of libtool, as libtool can'tupdate a library and we archive too many things to do it inone go; add piles of code to file_archscan() to handle newBSD4.4 style "#1/nnnn" archive entry names, where the realentry name follows the header and nnnn is the length of thename.The jam code underwent a const-ing, to work with compilersthat don't like "" being passed as a non-const char *.Compiling on solaris w/ sparc now sets OSPLAT to "sparc".Previously, it suppressed this, assuming (wrongly) that sparcwas the only solaris platform. Thanks to Michael Champigny<michael.champigny@intel.com>.Jambase no longer announces the compiler it is using onWindows. It doesn't announce anything else, so why?Jambase no longer refers to advapi32.lib on NT, as it isn'tneeded for linking jam itself and it seems to move fromrelease to release (of MS Visual Studio).Makefile/Jambase: BEOS updates from "Ingo Weinhold"<bonefish@cs.tu-berlin.de>.The NoCare rule can be used to suppress error messages whenan 'include' file can't be found.AIX "big" archives are now supported, thanks to suggestionsfrom Randy Roesler.MSVCDIR now works as well as MSVCNT for the Microsoft Visual Ccompiler directory. It changed names in VC 6.0. Thanks toMatt Armstrong.Allow jam to build with BorlandC 5.5For WinXP IA64; set MSVCNT to the root of the SDK and MSVCVerto Win64; change handle type to long long (too much to includewindows.h?); bury IA64 in the library path in Jambase.Mac classic MPW Codewarrior 7 upgrades: minor compilingissues, new paths in Jambase for libraries and includes, andseparate out GenFile1 that sets PATH for UNIX only, as itdoes't work under MPW (or anything other than with sh).Minor Cray porting: make hashitem()'s key value unsigned sowe're guaranteed no integer overflows.==============================================================================================================================================================Release notes for Jam 2.4(aka Jam - make(1) redux)1. Release info:Jam 2.4March, 21, 2002VERSION 2.42. CompatibilityJam 2.4 is upward compatible with Jam 2.3The Jam 2.4 language is a superset of the 2.3 language;Jamfiles, Jambase, and other rulesets used in 2.3 can be usedwith the 2.4 language support.3. Changes since 2.3.3.1. Changes to Jam LanguageThe mechanism for calling rules that return values - "[ ruleargs ...]", (and 'return' in the rule body), is now adocumented part of the language.Add "on <target> <rulename> <field1> ..." syntax, to invoke arule under the influence of a target's specific variables.Add "[ on targ rule ... ]" to call a rule returning a value,under the influence of a target's specific variables.New 'Glob' builtin that returns a list of files, given a listof directories, and a list of filename patterns.New 'while expr { block }' construct.New :E=value modifier provides default value if variable unset.New :J=joinval modifier concatenates list elements into singleelement, separated by joinval.\ can now be used to escape a space (or any single whitespacecharacter), so that you don't have to resort to quotes.New 'Match regexp : string' rule matches regexp against stringand returns list of results.Rules can now be invoked indirectly, through variable names.If the variable expands to an empty list, no rule is run.If the variable expands to multiple entries, each rule isrun with the same arguments. The result of the rule invocationis the concatenation of the results of the rules invoked.'Echo' and 'Exit' now have aliases 'echo' and 'exit', since itis really hard to tell that these are built-in rules and notpart of the language, like 'include'. Real rules continue tostart with a capital.3.2. Jambase ChangesSupport for YACCGEN, the suffix used on generated yacc output.Fix ups to have jam and p4 build with borland C 5.5,and minor win98 jam support for jam cleanSubDirHdrs now takes directory names in the same format asSubInclude : one directory element per word.More portable support for specifying includes and #defines:New ASHDRS, CCHDRS, CCDEFS, DEFINES, ObjectDefines, FQuote,FIncludes, FDefines. Ordering of cc and c++ flags grosslyrearranged.Jambase has been compacted by applying the new E: and J:expansion modifiers.New SoftLink rule, courtesy of David Lindes. It currentlyassumes you can pass a -s flag to $(LN).3.3 'jam' Changes (See Jam.html)Added '-q' (quit quick) option; jam will exit promptly (as if itreceived an interrupt), as soon as any target fails.Added experimental '-g' (build newest sources first) option:all things being equal, normally targets are simply built inthe order they appear in the Jamfiles. With this flag, targetswith the newest sources are built first. From an idea by ArntGulbrandsen. Undocumented (outside this note).3.4. Jam internal code changesjamgram.yy now defines YYMAXDEPTH to 10000, what it is onFreeBSD, for older yaccs that left it at 150 or so. This isneeded for the right-recursion now used in the grammar.Optimize rule compilation, with right-recursion instead of left.Split jam's built-in rules out to builtins.c from compile.c,so that compile.c only deals with the language.Split jam's pathsys.h from filesys.h, since they are reallytwo different pieces.evaluate_if(), which evaluated the condition tree for 'if' andreturned an int, has been replaced with compile_eval(), which doesessentially the same but returns a LIST.4. Fixed bugsMissing TEMPORARY targets with multiple parents no longer spoil oneparent's time with another. The parents' time is used for comparisonwith dependents, but no longer taken on as the target's own time.'actions updated', not 'actions together', now protects targetsfrom being deleted on failed/interrupted updates.Fixed broken $(v[1-]), which always returned an empty expansion.Thanks to Ian Godin <ian@sgrail.com>.Defining a rule within another rule, and invoking the enclosingrule more than once, would result in giving the first rule anull definition. Fixed.$(d:P) now works properly on the mac, climbing up directories.Thanks to Miklos Fazekas <boga@mac.com>.No longer (sometimes) treat \ as a directory separator onUNIX. It isn't supposed to be, but was due to bungled ifdefs.Applying just :U or :D (or :E, :J) mods no longer causes thevariable value to be treated as a filename (parsed and rebuiltusing the OS specific pathsys routines). Previously, if _any_mods were present then the value was parsed and rebuilt as ifa filename, and that could in certain cases munge the value.Only the file modifiers (:GDBSM) treat the value as afilename.Four rules makeCommon, makeGrist, makeString, makeSubDir fromjam 2.2 missing in 2.3 have been re-added, with apologies todtb@cisco.com.Return status more likely to be correct when using -d0, now thattargets are could as being built even with no debugging output.Thanks to Miklos Fazekas <boga@mac.com>.yyacc now suffixes all terminals it defines with _t, so that theydon't conflict with other symbols (like RULE with the typedefin rules.h). Thanks to Michael Allard.InstallInto now handles multiple sources properly, rather thanacting as if each installed target depended on all sources tobe installed. $(INSTALLGRIST) is now the default grist forinstalled targets, rather than the hardcoded 'installed'. Thanksto Stephen Goodson.5. Porting[MACINTOSH] Paths are now downshifted (internally) so as tohandle its case insensitivity. Thanks to Miklos Fazekas<boga@mac.com>.[NT] MS changed the macro for the IA64 Windows NT 64bitcompiler.[CYGWIN] Cygwin jam porting: dance around bison and yyacc.Use bison's -y flag to use yacc's output file namingconventions, and don't use yyacc on systems whose SUFEXE isset.[VMS] The Jambase itself was not formatting the CCHDRS andCCDEFS properly: on VMS they can't be appended to, becausemultiple /define or /include directives don't work. Insteadnow CCHDRS and CCDEFS is reformatted from HDRS and DEFINESanytime those latter two change. This requires the recentchange to jam to allow access to target-specific variableswhen setting other variables.[VMS] Remove exception call when file_dirscan() can't, forsome reason, scan a directory. Use a better set of #ifdefs todetermine if we're on a vax, rather than relying on the Ccompiler being a specific version: we're able to build withthe C++ compiler now.[VMS] Port new jam to run with just cxx compiler.(The C compiler being a extra-cost item).[NT] Add entry for DevStudio when the settings are already in thesystem environment.[NT] default $(MV) to "move /y" in Jambase.[MINGW] Mingw port by Max Blagai.==============================================================================================================================================================Release notes for Jam 2.3(aka Jam - make(1) redux)0. Bugs fixed since 2.3.1PATCHLEVEL 2 - 3/12/2001NOCARE changed back: it once again does not applies to targetswith sources and/or actions. In 2.3 it was changed to apply tosuch targets, but that broke header file builds: files that are#included get marked with NOCARE, but if they have source oractions, they still should get built.1. Release info:Jam 2.3November 16, 2000VERSION 2.3PATCHLEVEL 12. CompatibilityJam 2.3 is upward compatible with Jam 2.2.The Jam 2.3 language is a superset of the 2.2 language;Jamfiles, Jambase, and other rulesets used in 2.2 can be usedwith the 2.3 language support.3. Changes since 2.23.1. Changes to Jam LanguageRules now can have values, which can expanded into a list withthe new "[ rule args ... ]" syntax. A rule's value is the valueof its last statement, though only the following statements havevalues: if (value of the leg chosen), switch (ditto), set (valueof the resulting variable), return (its arguments). Note that'return' doesn't actually return. This support is EXPERIEMENTALand otherwise undocumented. (2.3.1)Because of the new way lists are processed, if a rule has notargets a warning message is no longer issued.NOCARE now applies to targets with sources and/or actions,rather than just those without.3.2. Jambase ChangesThe HDRPATTERN variable now allows for leading blanks beforethe #include, to keep up with ANSI. By john@nanaon-sha.co.jp(John Belmonte) (2.2.3).HDRPATTERN has been adjusted to avoid mistaking cases like:# include <time.h> /* could be <sys/time.h> */MkDir now NOUPDATE's $(DOT), so that there are no dependencieson the current directory's timestamp. By john@nanaon-sha.co.jp(John Belmonte).The old mock functions like makeDirName, which assigned theirresults to the variable named as their first argument, havebeen replaced with real functions using the new [] syntax.E.g. "makeDirName foo : bar ola" is now "foo = [ fDirName bar ]"Install now always does a cp/chmod/etc, rather than usingthe system's install(1), which invariably seems broken.3.3. Jam internal code changes$JAMUNAME is set on UNIX. (2.2.4).Jam ANSI-fied (2.3.0).jam.h now defines a bunch of symbols used by the other sourcefiles, so as minimize compiler- and platform-specific ifdefs.OSVER is no longer set by jam.h (it was only set for AIX).Jam does not depend on this variable at all, except to set$(OSFULL), which is used to determine jam's build directory.If the user needs to distinguish between various revs ofOSs, he must set OSVER in the environment.4. Fixed bugsRedefining a rule while it was executing could cause jam tocrash. Reference counts are now used to prevent that, thanksto Matt Armstrong.Logic for computing chunk size when executing PIECEMEAL ruleshas been reworked to be a little more accurate, without dangerof overflow, at the cost of being a little more compute intensive.Instead of computing an estimate chunksize in the (now gone)make1chunk(), make1cmds() now just goes full bore and tries touse all args. When that fails, it backs off by 10% of the sourceargs until the command fits. It takes a little bit more computetime compared to the old logic, but when you're executing actionsto build all of Shinola it's still pretty small in the schemeof things.The NT handle leak in execunix.c has been fixed, thanks toGurusamy Sarathy. (2.2.1).5. PortingPlatforms newly supported or updated:AmigaOS (with gcc), courtesy of Alain Penders (2.2.2).BeosCYGWIN 1.1.4, courtesy of John Belmonte <john@nanaon-sha.co.jp>.IBM AS400 via Visual Age on NT (primitive)IBM OS/390 Unix System ServicesLinux SuSE on OS390Linux Mips, ARMLynxHPUX 11, IA64Mac OS X Server, courtesy of Jeff_Sickel@sickel.com (2.2.5).Mac RhapsodyMPE IX 6.0NetBSDQNX RTP (QNX 6.0)Siemens SinixUNICOSVMS 6.2, 7.1Windows NT IA645.1. NT Porting NotesAlways create tmp .bat file for actions if JAMSHELL is set.That way, if JAMSHELL is a .bat file itself, it can handlesingle-command actions with more than 9 cmd line args.COMSPEC is no longer examined: cmd.exe is always usedinstead. Only cmd.exe can execute the Jambase rules anyhow.Jam can be built with Borland C++ 5.5.OS2 fixes: InstallBin now works. Filenames are now downshifted,so mixed case works better there, too. file_dirscan() can now scanthe root ("c:\" or "\") directory, which it couldn't handle before.var_defines now ignores OS=Windows_NT, because it conflictswith Jam's setting of OS (to NT).5.2. Mac OS 8/9 NotesThe support for Mac is curious at best. It runs under MPW.It requires CodeWarrior Pro 5, but no longer requires GUSI.Use Build.mpw to bootstrap the build.The Mac specific definitions in the Jambase are not intendedto be of general purpose, but are sufficient to have Jam builditself.==============================================================================================================================================================Release Notes for Jam 2.21. Release info:Jam 2.2October 22, 1997VERSION 2.2PATCHLEVEL 12. CompatibilityJam 2.2 is a roll-up of 'Jam - make(1) redux' release 2.1+.Most of the changes described below were available before this,in the jam.2.1.plus.tar ball.The Jam 2.2 language is a superset of the 2.1 language;Jamfiles, Jambase, and other rulesets used in 2.1 can be usedwith the 2.2 language support.See 'Jambase Changes', below, to see if your Jamfiles need anychanges to work with the 2.2 Jambase.3. Changes Since 2.1New product name: Jam. (Executable program is still named 'jam'.)Documentation rewritten; HTML versions supplied.3.1 Changes to Jam LanguageRules may now have more fields than just $(<) and $(>).Local variables are now supported.The expression 'if $(A) in $(B)' is now supported.New variable modifiers :U and :L result in uppercased or lowercasedvalues.New variable modifier :P reliably results in parent directoryof either a file or directory. (Previously, :D was used, but on VMS:D of a directory name is just the directory name.)The :S variable modifier now results in the _last_ suffix if afilename has more than one dot (.) in it.New predefined $(JAMDATE) variable is initialized at runtime forsimple date stamping.New predefined variables $(OSVER) and $(OSPLAT) are used todistinguish among operating system versions and hardware platforms,when possible.New 'bind' qualifier on action definitions allows variablesother than $(<) and $(>) to be bound with SEARCH and LOCATE paths.Action buffer size is no longer limited by MAXCMD. Instead, eachline in an action is limited by MAXLINE, defined for each OS, andthe entire action size is limited by CMDBUF.3.2 Jambase Changes (See Jamfile.html)Jambase has been reworked to incorporate new language features.A handful of new utility rules has been added: makeString,makeDirName, etc.New HDRGRIST variable in Jambase allows for headers with the samename to be distinguished.LOCATE_TARGET now has a new flavor, LOCATE_SOURCE, that is used byrules that generate source files (e.g., Yacc and Lex).Header file includes now happen in the proper order. The limit of10 include files has been eliminated.The old "Install" rule is no longer available. Use InstallBin,InstallFile, InstallLib, InstallMan, or InstallShell instead.3.3 'jam' Changes (See Jam.html)'jam' can now be built as a stand-alone program, with Jambasecompiled into the executable. An external or alternate Jambase canstill be referenced explicitly with -f.On command failure, 'jam' now emits the text of the command thatfailed. This is a compromise between the normal -d1 behavior (wherecommands were never seen) and -d2 (where commands are always seen).'jam' now exits non-zero if it doesn't have a total success. A parseerror, sources that can't be found, and targets that can't be builtall generate non-zero exit status.The debugging levels (-d flags) have been slightly redefined.The supplied Jamfile now builds 'jam' into a platform specificsubdirectory. This lets you use the same source directory tobuild 'jam' for more than one platform.The supplied Jamfile does not rebuild generated source files bydefault. (They are supplied with the distribution.) See Jamfilefor more information.4. Fixed BugsThe 'include' bug has finally been fixed, so that includestatements take effect exactly when they are executed,rather than after the current statement block. This alsocorrects the problem where an 'include' within an 'if'block would wind up including the file one token after the'if' block's closing brace. Credit goes to Thomas Woodsfor suggesting that the parse tree generation and parsetree execution be paired in their own loop, rather thanhaving the parser execute the tree directly.The setting and extracting of grist has been regularized:normally, if you set a component of a filename (using the:DBSMG= modifiers), you are supposed to include the delimitersthat set off the component: that is, you say "$(x:S=.suffix)",including the ".". But with grist it was inconsistentbetween setting and getting: setting grist required no<>'s, while getting grist included them. Getting gristcontinues to return the <>'s, but now setting grist caneither include them (the new way) or not (the old way).'actions together' now suppresses duplicate sources fromshowing up in $(>).Accessing variables whose names contained ['s (as happens withMkDir on VMS) wasn't working, because it treated the [ as anarray subscript. Now [ and ] are, like :, handled specially sothat they can appear in variable values.The 'if' statement now compares all elements in expressions;previously, it only compared the first element of each list.If a command line in an action is longer than MAXLINE (formerlyMAXCMD), 'jam' now issues an error and exits rather than dumpingcore.If a Jamfile ended without a trailing newline, jam dumped core.This has been fixed.5. PortingSee jam.h for the definitive list of supported platforms.Since 2.1, support has been added for:Macintosh MPWAlpha VMSAlpha NTNT PowerPCBeOSMVS OEUNIXWAREQNXSINIX (Nixdorf)OS/2Interactive UNIX (ISC), courtesy of Matthew Newhook5.1 NT Support FixesThe NT command executor now handles multiple line actions, by writingmulti-line actions to a batch file and executing that.Targets are universally lowercased on NT. (Matthew Newhook)Concurrent process support is fully enabled for NT.(Gurusamy Sarathy <gsar@engin.umich.edu>)Path handling: Jam now knows that the directory component of "D:\"is "D:\", just as on unix it knows that the directory component of"/" is "/". It also now successfully gets the timestamp for "D:\"or just plain "\".5.2 VMS Support FixesVMS support is much, much better now. The path name manipulationroutines (in pathvms.c) were more or less rewritten, and they nowhandle the vagaries of combining directory and file names properly.Targets are universally lowercased on VMS.Multi-line command blocks on VMS are now executed in a single system()call rather than separate ones for each line, so that actions canbe DCL scripts.==============================================================================================================================================================Release notes for Jam 2.1.1. Release info:Jam 2.1February 1, 1996VERSION 2.1PATCHLEVEL 02. PortingLinux is now supported.FREEBSD is now supported.SCO ("M_XENIX") now supported.NCR now supported.NEXT support from karthy@dannug.dk (Karsten Thygesen)DECC support from zinser@axp614.gsi.de (Martin P.J. Zinser)I have changes for OS/2, but no way to test them. Volunteers?I have VMS multiprocess support, but no way to test it. Volunteers?2.1. NT Support fixes.The NT support is considerably more real than it was in 2.0.Filent.c had its syntax error corrected, it no longer skips thefirst entry when scanning directories, and it handles stringtables in archives (for long object file names).The Jambase was changed a bit to support the various C/C++compilers on NT, although it has only been thorougly testedwith MSVC20.You still need to set MSVCNT or BCCROOT to the root of thethe compiler's directory tree, and you'll get an error if youdon't set it (rather than getting a pile of mysterious errors).2.2. Other porting fixes.SPLITPATH now set up for UNIX (:), NT (;), VMS (,)Jambase support for Solaris works better now: the location ofAR is hardwired to /usr/ccs/bin/ar and it knowns "install"doesn't take -c. Solaris -- how the mighty have fallen.To handle Linux's wacko yacc, jamgram.h is now included afterscan.h so that YYSTYPE is define.3. Jambase Changes (see Jamfile.html)SubDir now computes the root directory for the source tree, ifthe variable naming the root directory isn't set in the environment.It counts the number of directory elements leading from the rootto the current directory (as passed to SubDir) and uses that many"../"'s to identify the root. This means that to use SubDir youno longer have to have anything special set in the environment.InstallFile is now an alias for InstallLib.'first' is now dependency of all pseudo-targets (all, files,exe, lib, shell), so that jamming any of these pseudo-targetsalso builds any dependencies of 'first'.The File rule definition in the Jambase was missing an &.The File rule now calls the Clean rule, so that installed filesget cleaned.4. Jam changes (see Jam.html)Variables may now be set on the command line with -svar=value.Targets marked with NOUPDATE are now immune to the -a (anyhow)flag. Previously, the MkDir rule would try to recreate directoriesthat already exist when jam was invoked with -a.A new variable, $(JAMVERSION), joins the small list of built-invariables. It it set to the release of jam, currently "2.1".If an actions fails, jam now deletes the target(s). It won'tdelete libraries or other targets that are composites. This isnow consistent with jam's behavior on interrupts (it deletes thetargets).Jam had a nasty bug when setting multiple variables to the samevalue: if the first two variable names were the same, the variablevalue got trashed. This also affected "on target" variables ifthe first two targets were the same. For example:FOO on bar.c bar.c foo.c = a b c ;This would mangle the value of FOO for bar.c and foo.c. This hasbeen fixed.Jam would generate bogus numbers when reporting the number oftargets updated after an interrupt. It now is more careful aboutcounting.The debugging flag -d has been extended. In addition to supporting-dx (turn on debugging for all levels up to x) there is also now-d+x (turn on debugging at only level x). The default outputlevel is -d1 (-or d2 if -n is given); this can be turned off with-d0. The debug levels are listed in jam.1 and jam.h.The parsing debug output now uses indenting to indicate whenone rule invokes another.==============================================================================================================================================================Release notes for Jam 2.0.1. Release info:Jam 2.0March 10, 1994VERSION 2.0PATCHLEVEL 52. PortingWindows/NT is now (crudely) supported, courtesy of Brett Taylorand Laura Wingerd.COHERENT/386 is now supported, courtesy of Fred Smith.Solaris archive string table for long archive names is nowsupported, thanks to Mike Matrigali.3. CompatibilityJam 2.0 syntax is a superset of Jam 1.0 syntax, and thus it caninterpret a Jam 1.0 Jambase.The Jam 2.0 Jambase is a superset of the Jam 1.0 Jambase, andthus it can include a Jamfile written for Jam 1.0.4. Changes from Jam 1.0 to Jam 2.04.1. Documentation changesNew Jamfile.5 manual page, with lots of examples and easyreading. It replaces both the old "Examples" file as well asthe old Jambase.5 manual page.jam.1 edited by Stephen W. Liddle and Diane Holt.4.2. Jambase Changes (see Jamfile.5)4.2.1. New rules:There are new rules to make handling subdirectories easier:SubDir, SubInclude, SubDirCcFlags, SubDirHdrs.There are new rules to handle file-specific CCFLAGS and HDRS:ObjectCcFlags and ObjectHdrs.Misc new rules: HardLink, InstallShell, MkDir.New rule "clean" that deletes exactly what jam has built, and"uninstall" that deletes exactly what was installed.New rules for handling suffixes .s, .f, .cc, .cpp, .C.4.2.2. Old rules:The InstallBin, Lib, Man, and the new Shell rules now take thedestination directory as the target and the files to be copiedas sources. These rules formerly took the files to be copiedas targets, and used built-in destination directories of$(BINDIR), $(LIBDIR), $(MANDIR), and $(BINDIR).The InstallBin, Lib, Man, and Shell rules use the install(1)program now, instead of doing their own copying.The Cc rule now uses -o when possible, rather than moving theresult. Some platforms (Pyramid?) have a broken -o.Jambase rules taking libraries, objects, and executables nowall ignore the suffixes provided and use the one defined in theJambase for the platform.Stupid yyacc support moved out of Jambase, as jam is its onlylikely user.Jambase now purturbs library sources with a "grist" ofSOURCE_GRIST.4.2.3. Misc:The names of the default rules defined in Jambase have beenlowercased and un-abbreviated, to be more imake(1) like.The Jambase has been reorganized and sorted, with VMS and NTsupport moved in from their own files.The Jambase has been relocated on UNIX from /usr/local/lib/jamto /usr/local/lib.4.3. Jam changes (see jam.1)4.3.1. Flags:New -a (anyhow) flag: means build everything.New -j<x> flag: run jobs in parallel.Old -t now rebuilds the touched target, rather that just thetarget's parents.-n now implies -d2, so that you see what's happening. Thedebug level can be subsequently overridden.New -v to dump version.4.3.2. Rules:New ALWAYS rule behaves like -t: always builds target.New EXIT rule makes it possible to raise a fatal error.New LEAVES rule which say target depends only on the updatetimes of the leaf sources.New NOUPDATE rule says built targets only if they don't exist.NOTIME has been renamed NOTFILE, to more accurately reflect itsmeaning (it says a target is not to be bound to a file).4.3.3. Variables:New special variable JAMSHELL: argv template for command executionshell.Variables, both normal and target-specific, can have theirvalue appended with the syntax "var += value" or "var on target+= value"."?=" is now synonymous with "default =".Imported enviroment variable values are now split at blanks(:'s if the variable name ends in PATH), so that they becomeproper list values.4.3.4. Misc:Files to be sourced with "include" are now bound first, so$(SEARCH) and $(LOCATE) affect them. They still can't bebuilt, though.New modifier on "actions": "existing" causes $(>) to expandonly those files that currently exist.4.3.5. Bug fixes:When scanning tokens known to be argument lists (such as thearguments to rule invocations and variable assignment), theparser now tells the scanner to ignore alphabetic keywords, asall such lists terminate with punctuation keywords (like : or;). This way, alphabetic keywords don't need to be quoted whenthey appear as arguments.The scanner has been fixed to handle oversized tokens,unterminated quotes, unterminated action blocks, and tokensabutting EOF (i.e. a token with no white space before EOF).The progress report "...on xth target..." used to count alltargets, rather than just those with updating actions. Sincethe original pronouncement of targets to be udpated includedonly those with updating actions, the progress report has beenchanged to match.'If' conditionals now must be single arguments. Previously,they could be zero or more arguments, which didn't make muchsense, and made things like 'foo == bar' true. The comparisonoperator is '=', and '==' just looked like the second of threearguments in the unary "non-empty argument list" conditional.Header files indirectly including themselves were mistakenlyreported as being dependent on themselves. Recursing throughheader file dependencies is now done after determining the fateof the target.The variable expansion support was expanding $(X)$(UNDEF) as ifit were $(X). It now expands to an empty list, like itshould.The UNIX version of file_build() didn't handle "dir/.suffix"right. Now it does.The VMS command buffer was assumed to be as large as 1024 bytes,which isn't the case everywhere as it is related to some weirdquota. It has been lowered to 256.$(>) and $(<) wouldn't expand in action blocks if the targetswere marked with NOTIME. Now they expand properly.Malloc() return values are now checked.The variable expansion routine var_expand() is now a littlefaster, by taking a few often needed shortcuts.The VMS version of file_build() used the wrong length whenre-rooting file names that already had directory compoents.This was fixed.Various tracing adjustments were made.5. Limitations/Known BugsThe new Windows/NT support has only been marginally tested. Itis dependent on certain variables being set depending on whichcompiler you are using. You'll need to look in the fileJambase and see what variables are expected to be set.The VMS support has been tested, courtesy of the DEC guestmachine, but has not been hammered fully in release 2.0. Itwas used quite a bit in Jam 1.0.Jam clean when there is nothing to clean claims it is updatinga target.Because the include statement works by pushing a new file inthe input stream of the scanner rather than recursivelyinvoking the parser on the new file, multiple includestatements in a rule's procedure causes the files to beincluded in reverse order.If the include statement appears inside an if block, theparser's attempt to find the else will cause the text of theincluded file to appear after the first token following thestatement block. This is rarely what is intended.In a rule's actions, only $(<) and $(>) refer to the bound filenames: all other variable references get the unbound names.This is a pain for $(NEEDLIBS), because it means that librarypath can't be bound using $(SEARCH) and $(LOCATE).With the -j flag, errors from failed commands can getstaggeringly mixed up. Also, because targets tend to get builtin a quickest-first ordering, dependency information must bequite exact. Finally, beware of parallelizing commands thatdrop fixed-named files into the current directory, like yacc(1)does.A poorly set $(JAMSHELL) is likely to result in silentfailure.