make change history

12/01/93 3.0 release
10/31/93 fix make.probe stdlib test for preroot systems
	 instrument={insight,purify,sentinel,etc} instead of purify=1 
	 fix VROOT,VOFFSET in 3d
	 add :T=QV: to select defined variables
	 fix pdp11 archive header swapping and alignment -- used by SCO!
	 add break [n], continue [n]
	 handle hp archive member name truncation at 14 rather than 15!
10/11/93 5e inspired upgrade and beta fixes
	 convert multiple metarule prereq pattern A%B to A$(%)B
	 add .DONTCARE. pattern association to intercept don't know how to ...
	 add :P=B: for physical binding
	 -lm : .DONTCARE in makerules for systems that combine it with -lc
	 fix :G=pat: to handle secondary targets
	 fix unbind() to set rule.view=0
09/30/93 bias unique() aliases towards shorter pathnames
	 add .MAKEDONE to correspond with .MAKEINIT
	 .SCAN.* state change causes rescan
	 preserve matches :B:S: if no / in pattern
	 purify=1 adds -g to CCFLAGS rather than replaces CCFLAGS with -g
	 fix += interaction bugs between command line and makefile
	 fix cancel bug that ignored top view state for lower view
09/11/93 fix scan attribute propagation bug that ignored scanrules |OX|
	 fix view+cancel+accept inconsistency where action always triggered
	 add set option=<flag>,<name>[,<type>,<set>] for external options
	 fix rebind/unbind bug that kept old bound name
	 add arclean to [de]select .ARCLEAN files
	 fix binding bug that didn't break it soon enough for r.status==UPDATE
	 fix :A=.MAKE: bug that missed (internal.make.property&P_make)==0
	 fix :P=L[*!]: bug that failed for non-3d views
08/11/93 S|action| (start) and F|action| (finish) added to scan language
	 O|options| now takes delimiter for scan language consistency
	 all scan actions but [OQ] accept [AMR]
	 |O*| sets scan match flags: X inhibits scan propagation
	 no scan propagation for D_scanned files
	 $(<r1 r2 ...) now supported
	 { .ENTRIES .MEMBER .REGULAR .SCANNED } under user control
	 :T=R<tmform-pattern>: added
	 makefile prereq state atoms initialized as courtesy to query
	 fix aliasing bug that skipped action trigger
	 fix metarule bug that skipped %:%.x !!
	 add .ACTIVE readonly attribute
07/17/93 add -o regress=dir (-R dir) for regression output
	 properly handle * in scanexec()
	 handle archive member name truncation
	 complete $(%) $(<<) etc. scan definitions
	 change I|*|P to use M+function in scanrules
	 fix `termination code' error checks and messages
	 fix cancel bug that ignored implicit prereq event time
	 -o option=-c[absx]name allows user option by flag declarations
	 .TERMINAL .SOURCE dirs skipped for dir/base file binding
	 MAKERULES name change forces reread, duh
	 :LIBRARY: properly handles rhs -l*
06/11/93 bindfile,makerule,getrule,hashlook optimizations via gprof,purify
	 fix old bug that forced attribute names to start with .
	 fix alias bug in expand.attribute() and variable.scanprereqs()
	 .MAKE .FUNCTIONAL no longer gets .FOREGROUND by default
	 :LIBRARY: CC.PIC check ignores case
06/01/93 fix interrupt traps to honor critical regions via trap.c
04/01/93 add s5r4 long member names to portarch scan
	 add +l<lib> for selective static link
	 fix probe_pic probe
	 metarule for a/b tries a prefix before plain b on rhs
	 optimize bindfile() for relative prefix searches
03/01/93 change source() to handle modified prereqs before compile
	 add optional timestamp to .BIND.% return value
01/28/93 add :T=O[-][+][=data]: to complement :T=I[-]:
	 fix attribute propagation bug when ()r in state but r not
01/22/93 fix *.m[os] .BUILT tests (fixes :MAKE: clobber bugs)
	 fix :cc: cancel bug that failed to propagate lower .o's to link
	 fix `did not complete' bug that counted .MAKE status == UPDATE
	 add T|pattern|Rmakefile-chunk to .SCAN
	 .UNBIND on metarule drops chain for metarule
	 fix attribute assignment in assertion parser (very old bug)
01/18/93 3.0 beta release
	 * portable, extensible and compact object format
	 * makefile prereq code understandable
	 * no MAKEBUFFERSIZE
	 * MAKECONVERT for compile time makefile conversion
01/15/93 switch to sfio write strings
	 most buffer limits (especially MAKEBUFFERSIZE) eliminated
	 :P=L*: returns all views of bound file
01/11/93 fix C++ PTR makerules
	 fix .FUNCTION -MAKE
	 :O: returns token count, :O!: returns token strlen
	 :H<=: lo to hi numeric sort, :H>=: hi to lo numeric sort
12/25/92 switch to sfputu/sfgetu architecture independent object format
	 old format (8/11/92 sequence 0,1,2) read but not written
	 object files now 30-60% smaller due to sfputu and omitted fields
	 object format now decoupled from the internal struct layout
	 change rule.runtime from allocated pointer to direct field
11/30/92 fine tune -I and -L generation
	 handle `vpath /lib $(LIBDIR)'
11/11/92 convert .ATTRIBUTE and .SCAN inconsistencies on statefile load
	 warn about conflicting scan strategies
	 don't drop .mo in virtual dot
	 delay .ml drop in virtual dot until first sh action / touch
10/12/92 allow multiple .INSERT/.APPEND
	 fix clobber.install and list.install for $(CC.SO)
	 fix scan looping bug for @
10/01/92 fix bug in make() that lost original name for unalias()
	 fix joint bug that failed to decrement rule.must in cancel()
09/11/92 block on targets with .MAKE after prereqs
08/11/92 add -o mamtrace=file for runtime mam trace
	 unkown option now exits non-zero
07/17/92 extend :PACKAGE: to handle X11, etc. with mam
	 :operator: with .IGNORE does not expand args
	 add editcontext() to edit operator error messages
	 :M re match now uses egrep style patterns
	 add ``begin @ % @ end'' multi-line scan match
06/11/92 fix missing include bug that failed to recheck on next run
06/01/92 add `print' statement and prompt only for isatty(stdin)
	 update probe for typed $stdinclude dirs
04/28/92 #pragma prototyped the source
04/16/92 fix stdarg.h proto(1) courtesy by adding .TERMINAL
04/01/92 2.3 release
02/29/92 shared -l% are marked .IGNORE to avoid no-op ld
	 warn on invalid variable name in assignment
	 fix joint $(<) and $(^) bug
	 fix $(!) bug that omitted explicit after build
	 fix += cmd arg bug that ignored original value
02/11/92 fix $(>) state test
	 fix isstatevar() test
	 fix frozen var bug that missed := and += on cmd line
	 fix $(=) to generate == for V_scan vars
	 add $(CCLD) for .o vs. a.out control
	 add purify=1 control for easy purification
11/11/91 try ccc -> .CCC on first arg at interpreter prompt
	 fix metarule closure sequence error
	 add :PACKAGE:
	 fix BEFORE,AFTER command.c inconsistencies
10/11/91 change over to feature command
	 fix D_member|D_membertoo logic
	 scan() now assigns .TERMINAL to .PFX.INCLUDE files (cannot generate)
	 fix not in view 0 check to also check cancel time
	 fix state.touch to work with state.exec
	 '***' error messages now error level 2 (make: prefix)
	 makerules tmp files use tmp=$COTEMP as base
	 assertion operators now always have [lr]hs expanded before entry
	 var definitions in load action can override import vars
	 add CC.PIC, CC.SHARED, CC.SHARED.LIBRARY to probe
09/11/91 parameterize makerules ancestor with ancestor_list and ancestor_source
	 handle MAKEFILES=...$(PWD)... in :MAKE:
08/11/91 add @ repeat op in scan patterns
	 add C++ ptrepository makerules support
	 make .DONE before state saved
	 fix merge() to merge only if to.status==NOTYET or from.use
	 fix makerules .ARCLEAN to not delete .TERMINAL's
	 fix -g *.mk out of date with *.mo panic
	 add X scan rule op to ignore line
	 move queue() logic into trigger()
	 fix state.exec==0 .BEFORE and .AFTER trace
	 add :P=H[=suffix]: to generated short hash file names
	 fix mam .ALWAYS expansions
	 change .OPERATOR local vars to .*.
	 add idempotent wrapper to y.tab.h generation
	 move $ include from .SCAN.F to .SCAN.sql
07/17/91 add metaclose() to fix metarule closure
	 move secondary metarule search to metarule() -- nice encapsulation
	 fix trigger() and queue() to properly handle non-action targets
	 pass defined option=xxx options in $(-) and $(+)
	 fix multiple target metarules by using joint
	 fix :P=I: usage in makerules .DO.INSTALL
	 finally implemented `A Case for Make' event time algorithm
	 SEQUENCE=2 to handle event times
	 fix freevar()-newvar() bug that did not clear value
	 fix :T=G: to handle P_terminal
	 delete .UNTOUCH, change .TOUCH to .REBIND
	 .REBIND finally supports targets generated in .SOURCE dirs
	 fix ignore,keepgoing,dontcare interactions
	 add syntax check for local var declarations (i.e., no assignment)
	 delete .MAKESCAN -- not used
	 add _feature_ to Makeinstall.mk
	 delete .PRECIOUS in liu of rule.state.event=0
06/11/91 unknown :operator: attempt `include "operator"' before failing
	 fix .ATTRIBUTE clash load bug by not doing free()
	 fix functional recursion
	 fix view bug that missed files under missing intermediate views
05/11/91 add newfile(*.mo) in compile()
	 fix :MAKE: to omit lhs on recursion
	 change D_alias getrule() to makerule() -- may be dropped from .m[os]
04/11/91 add :LIBRARY: $(LIBDIR)/lib/xxx, -lxxx .REQUIRE. support
	 add .REQUIRE. pattern association for atom multiplexing
	 :INSTALLDIR: now mkdir's to any depth
	 fix '...', "...", /*...*/ interactions with #...\n
04/01/91 add .LOCAL to separate CO_LOCAL from .ALWAYS
	 replace P_noclear with P_local
	 fix :MAKE: to use .VIEW instead of .
03/11/91 add + to .BIND.% association
	 add LDLIBRARIES to FEATURE/% in makerules
02/11/91 pass scoped COATTRIBUTES to coexec()
	 delete OPT_headerstate (-x), add OPT_expandview (-x)
	 add :K=<pfx>: operator to break long lines
	 remove P_target attr from internal.interpreter
	 add ``$(ARSCAN|AR) $(ARSCANFLAGS|"tv")'' scan for unknown archives
	 fix VPATH bug that omitted some nodes
	 fix scan bug that dumped when given a 24K /*...*/ comment!
01/31/91 minor fixes
	 add aix archive format to archive.c (thanks to Jim Gentilesco)
01/01/91 add package to makerules
	 add more dirs to .SOURCE.mk initialization for user include support
12/11/90 change $(v(a1 ... an)) to $(v a1 ... an)
	 recursive functionals: args in $(%), `return value' for return
	 add statetime(r,-1) to resolve makeafter() target
	 add .FUNCTION pseudo-attribute to makerules
	 .BIND.* and .MAMNAME. are now .FUNCTION
	 .SCAN map arg match changed from $(.SCAN.) to $(%)
	 add .ARPREVIOUS to fix $(AR) d bug in .ARCHIVE.o
	 fix newvar() bug that clobbered import values
	 fix frozen var checks again
11/11/90 2.2 release
	 in unbind() if r->uname putrule(r->name,0)
	 active target prerequisites may be appended
10/11/90 fix jobs bug that scheduled pending jobs after error with nokeepgoing
	 switch over to libx/malloc
	 .BIND.-l% with CC.PROFILE now checks libX-P.a and libP/libX.a
	 fix OLDMAKE bug that omitted x=y args
	 add cc- for making profile/debug versions
	 change .ARCLEAN to exec immediately after main action
10/01/90 add mips ar format out of date check
	 fix :MAKE: one more time, concurrency -> recurse in makerules
	 add $(v(a1 ... an)) functional var with args support
	 add pathcheck() call for optional runtime validation
08/11/90 fix .JOINT for .SCAN.* targets
	 fix .JOINT state bug that built targets twice
	 fix libx/hashnext() bug that mishandled hashput(t,n,0)
	 add :T=SF.: to force rule, :T=SA: to get atom from staterule
	 add :T=XSFA: to .SELECT. to get statrules w/o related atoms
	 fix view bug that allowed target view to be higher than min prereq
	 add I pattern attribute and property propagation to OM in scanmacro()
	 add .M4.INCLUDE to .SCAN.m4 in Scanrules
	 handle dangling rule.status==IMPLICIT in make()
	 fix += n**2 malloc hog by expanding in chunks
	 fix nostrictview mixed rel/abs dir cross product bug
	 fix view dir alias bugs
	 delay state.jobs=0 until final cleanup complete()
	 move premature unparse() in finish()
	 move .SAVEARGS from :MAKE: to .DO.MAKE in Makerules
	 add "label=" args to coopen() and coexec()
07/17/90 add * to .SCAN patterns
	 guard against multiple push() in command.c
	 drop -D-Lmake from MAKEPPFLAGS to fix makefile line syncs
	 fix frozen bug that complained about global value changes
	 fix scanexec() buffer bug that missed quote in first row,col
06/01/90 add limit=n to limit :MAKE: recursion
	 add fresolve() to rstat() for NFS-coshell workaround
05/30/90 relax cross-product rhs absolute path restrictions
05/11/90 fix $(...) mark bug
05/01/90 coshell library sync
	 action error now recorded in state
04/11/90 numeric option arguments optional
	 -S now takes optional view level arg
	 makerules liblink control var changed to link=<pattern>
	 MAKEIMPORT var preceded by ! can be overridden by global var def
04/01/90 files linked to mode 0 ... are `opaque' in lower views
	 add cancel() to undo actions by targets that don't change
	 add :E: edit op to evaluate if expressions
	 add :P=R: (again) to compute relative path from a to b
	 add bindattribute() to uniformly propagate bind time attributes
	 add maxview and fsview check to localview()
	 add (CC) : (CPP) in .MAKEINIT
	 fix prereqchange() check in make()
	 fix $(^) expansion for files down view only
	 allow relative pathnames in view names
	 cancel() only if target newer than prereqs!
	 .CLEAR implies .UNBIND
03/28/90 fix comment error message line numbers
	 add nested /* ... */ comment error message
	 fix bind bug that missed .SOURCE* alias
03/24/90 turn the bootstrap volume down another notch
03/22/90 add :LIBRARY: and linklib to makerules
	 add MAKE_OPTIONS check to makerules load
	 set $(^) for top view too
03/20/90 fix source() bug that eliminated some valid view components
	 add source() call to atom prereq references in getval()
	 fix ccprobe -tp -B probe
	 add <prefix>cpp checks to ccprobe
	 internal P_immediate actions always done
	 move .VIEW init from initdynamic to initview()
	 -L options generated in LDFLAGS for DYNAMIC -l args
03/15/90 fix level>2 view state bug in staterule()
	 fix .BIND. and bindfile() bug that missed makefile -l% == lib%.a
	 .VIEW x .SOURCE cross product now done by bindfile()
	 replace Makeinit.mk with char*init in version.c
	 .VIEW marked readonly after level>0 assertion
	 fix lockfile bug that unlinked valid foreign on exit
03/01/90 add `-' as makerules synchronization atom
	 fix frozen bug when new var in env but frozen not in env
02/28/90 fix scanprereqs() bug that missed active implicit primary prereqs
	 fix active frame bug that clobbered prev value for recursive targets
02/26/90 fix .TERMINAL metaget() bug that blew the sccs example
02/11/90 delete MAKESHELLTYPE, _make_, @, silent [-+]
	 add .READ
02/08/90 delete OPT_move (it never did work)
02/07/90 add job frame context for make/expand/job consistency
	 change :T=H: to :T=I[-]:, - doesn't expand file contents
02/01/90 recode for libcoshell interface
01/30/90 fix make() state.unwind bug that set KEEPGOING in enter()
	 set PWD in case MAKESHELL doesn't
	 change .SCAN @ to % for metarule consistency
01/26/90 delete :E,:W,:T=[BM].:R->:T=R,:T=R->:R (non-tokenizing),:[EHJKUW] free
01/22/90 add :L[<=>[pattern]] for base name generation on scanned dirs
01/19/90 update CIA makerules for intermediate C++ support
12/15/89 add test for empty statefiles
	 replace $(+.) with $(.$(*:O=1))
	 fix :P=U: bug for non-rules
12/01/89 restore old job control signal handler command/costop()
	 rework engine .JOINT
	 fix += makefile interaction with cmd arg assignment during .mo compile
	 fix local var bug that did not set local.length
	 fix archive member not in . handling
11/28/89 add :A<=.xxx.: for associate() tie-in
	 add .INSTALL.<pattern> to makerules install
	 don't mergestate() state vars
11/11/89 global insert|append for non-targets too
	 fix scanmacro() for m4 scan
	 fix makerules LDLIBRARIES, .BIND.LIB.DYNAMIC., :JOINT:
	 add archive member (A) to scan pattern language
	 rule.archive&&rule.scan -> scan() rather than walkar()
	 make .INTERPRETER for interactive interface
	 .ERROR made for fatal errors, no exit if EXISTS
	 fix statefile reference sticky property bug
10/31/89 minor .VIRTUAL fixes in make()
	 add .SCAN.F to makerules
	 change readargs() to vecargs()
10/18/89 add (CC.PROBE) prereq to (CC) related state vars in .MAKEINIT
10/11/89 for loops no longer makerule() the vars
	 external.sourcepath -> internal.source
	 ----- minor sync release -----
10/01/89 OPT_mismatch sets OPT_accept if no top level and low level mismatch
	 fix scandir() bug that broke the dir<->atom name equivalence
	 add :P=I=path: file equality test
09/22/89 fix staterule()+accept+view bug that always touched statevars
	 .BIND. -> .SOURCE. && .ALIAS. -> .BIND. for consistency
	 add :P=G[-]: to generate sorted list of dir-scanned file names
	 file top level loops ok
09/11/89 rework scan.c -- .SCAN.* now defined in Makerules
	 OPT_mismatch checked for lower view state files
	 add D_index and SEQUENCE=1 for index atom load consistency
08/30/89 add $(...) to expand to all atoms (could be a big list)
08/24/89 replace makecc with ccc
08/14/89 delete D_changed usage
08/11/89 fix statevar bug in stateview() that let undefined vars override
	 use lib/probe for runtime compiler probes
	 clean up environment dependencies
07/11/89 change makerules to key $(CC) info from full path
	 add mkinfo to probe C compiler wrappers at user runtime
07/04/89 use lower view files for !state.exec
06/28/89 hack localrule() bugs -- cleanup when BINDINDEX enabled
06/27/89 fix statetime()/rule.originalbind interaction bug
	 canonicalize path in checkcurrent() for statetime()
06/26/89 change makerules `-o ancestor' to `ancestor=3'
	 delete :K=: and :U=: edit ops and ancestor()
06/22/89 initial BINDINDEX code -- not enabled yet
	 fix staterule() consistency bug
06/11/89 fix include bugs, add include - for dontcare
	 add .JOINT, change :JOINT: to use .JOINT
	 fix load() attribute checks
	 delete staterule(SOURCE,...)
	 fix -l by .ALIAS.<pattern> and .BIND.<pattern> bindfile() hooks
	 new object VERSION for .PFX.INCLUDE scan attribute
06/02/89 OPT_keepgoing errors tracked and cause non-zero exit
	 fix getstate() bug in scan.c that botched "\<newline> quotes
06/01/89 special job control signal handling eliminated
05/11/89 minor makerules fixes
05/09/89 ``target :'' assertion sets rule.target
05/02/89 fix :MAKE: to do dirs only once
05/01/89 add trigraphs to c_scan()
04/11/89 strictview cross-product marks must have multiple attribute
04/04/89 change Makeinit VPATHVERIFY to VPATH_OPTIONS {verify[=n] [no]strict}
	 delete state.override checks for rule.hasafter & rule.hasbefore
03/30/89 preprocessor optional, only called if directive encountered
	 C comments stripped by make parser
03/28/89 avoid multiple prefix in c_scan()
03/27/89 OPT_stream -> OPT_mam
03/17/89 fine tune makerules OPT_stream support
03/14/89 drop OPT_script, change OPT_stream to output generic shell
03/07/89 allow metarule "" rhs to get something from nothing
02/28/89 use bound name in `replaced by an older version' message
02/27/89 propagate metarule rule.accept to matched target
02/22/89 fix state.localview variable references with localvar()
02/21/89 change .MAKESCAN to place file name in $(>)
	 add rule.terminal checks to control metarule closure
02/11/89 add some rule.originalbind checks
	 add rule.runtime for run time info, 4-bytes spare
02/01/89 add delete op to addprereq()
	 metarule .CLEAR now prunes the intermediate prereq graph
01/24/89 change compiled struct members for machine independence
	 .mo and .ms now compatible for CHAR_BIT=8, sizeof(char*,long)=4
	 change compile.c/setold() to use rule.status==OLDRULE
	 fix .CROSS.COMPILE to redefine CC, etc. in env rather than cmd line
	 close lockstate() window that left lock files hanging
	 fix -l[rv] to not re-dump on interrupt
	 new VERSION to handle struct changes
	 add object sequence to allow small diffs between versions
	 add OPT_strictview & -V for strict view interpretation
01/20/89 new object VERSION to handle rule.state & rule.semaphore changes
	 add tmp fix to make.c/update() to avoid clobbering lower view targets
	 base rules must contain a null #rules directive
	 base and global rules now compiled with -bcf
	 restrict .CLEAN and .CLOBBER to top view
01/18/89 replace rule.semcount with rule.semaphore==(semcount-1)
	 change .NOIMPLICIT to .TERMINAL
	 delete .NEGATE; add -<attribute>, +<attribute> assertion syntax
	 change compile.c/setold() to pun on rule.attributes+rule.attribute
	 add attributes to metarule pattern propagation
	 add .SCAN.IGNORE to not scan and to ignore scan times of prereqs
01/11/89 change .ATTRIBUTE.* to generalized metarule pattern propagation
	 clean up metarule assertion parsing
	 decouple $(MAKEPP) from $(CPP)
	 ----- testing continues -----
12/11/88 fix atomize() panic by using setold() in load()
11/30/88 fix pathop() and attribute() alias references
11/22/88 add state.buffersize and env MAKEBUFFERSIZE
11/19/88 fix atomize() stray mark panic during invalidate()
11/16/88 add .NEGATE assertion attribute and remove .NOIMPLICIT kluge
11/11/88 make directive keywords must be C_SEP separated
11/09/88 fix minor view bugs in :P=D: and Makeinit
11/01/88 :D: returns ``.'' instead of empty string
10/21/88 $(^) set only if $(<) covers another view
10/11/88 fix staterule() bug that botched state view merging
	 fix shquote() to pass `
10/05/88 fix .IMPLICIT and .NOIMPLICIT merging
09/30/88 fix metaget() to ignore status==UPDATE prereqs
	 fix .TOUCH to bind before touching
	 fix cosend() to add `trap 0 ERR' for ksh FOREGROUND actions
09/20/88 fix :G: edit op using proper nonterminal metarule reference
	 add hang test for cc list before ccinfo call in Makefile
09/11/88 remove `warped from future' message
09/09/88 add `:MKOLD: makefile' to makerules
09/01/88 add ppdefault.h #assert's to Makeinstall.mk
	 update Makerules .CIADB for new cia
08/31/88 fix bug in $(+x) automatic variable dereference
08/24/88 beta release
08/18/88 update scanner in parse, add ++, --, +=, -= to set numeric options
	 add OPT_frame for state.frameref
	 fix :JOINT: using set frame++
08/03/88 add metarule.c for metarule routines
	 add ???O for original value if non-null
	 add .TERMINAL for terminal match-anything metarules (in rule.regular)
07/25/88 replace rule.link with active target stack frame
	 add `%' metarule stem match (like other makes) -- `*' now obsolete
07/22/88 switch rest of department over to latest version
	 fix makerules :: bug that lost dir info from *.o prereqs
07/17/88 first makefile `block' scanned for type info
	 add .SCAN.NONE to inhibit scanning for some files
07/08/88 fix null pointer dereference in localrule()
07/07/88 change $(%) to $(#), reserve $(%) for metarule target `stem'
	 clean up makebefore() and makeafter() calls
	 fix bug in secondary() that saved invalid state time
	 fix view bug in bindfile() that goofed on ..
07/04/88 bind .mo files on .SOURCE.mk
07/01/88 add OPT_writestate and decouple from OPT_override
	 change OPT_ignorestate to OPT_readstate
	 fix `has been replaced by an older version' warning test
	 fix time test in bindfile() that allows archive .o files to stay 
	 delete sql_scan and .SCAN.sql -- generic f_scan() does it now
	 add quick makefile type check to #rules parse
06/22/88 add OPT_filetype to enable automatic makefile type check
	 update punt() to do a better job with external.old arguments
06/21/88 delete "*.a : *.b : *.c" explicit intermediate metarules
	 add "*.a *.b ... : *.c" auxiliary metarule targets
	 add metarule transitive closure (`chaining')
06/19/88 temper lockstate() on view by checking lock file uid
06/18/88 fix bug in stateview() that didn't pass rule.attributes
06/16/88 remove MAKEINCLUDE and MAKELIB from Makerules.mk
	 add MAKELIB, maketype.sh and .MAKETYPE to Makeinstall.mk
	 add generic include statement to f_scan()
06/15/88 remove .COINIT because of execution ambigiuity
06/14/88 convert to new libx strmatch()
	 remove automatic .ALWAYS for $(MAKE) actions
06/08/88 add ccinfo.sh to probe for c compiler wrapper info
	 add `.READ : file ...' to bind and read file ...
	 fix rule.scanned propagation in load()
	 avoid merging old atoms in merge()
	 add rootpath() to relieve hard coded path problems
	 -o nowarn is now the default, more tests for state.warn
06/01/88 convert to new hash library interface
	 add MAKEIMPORT for explicit environment override of makefile vars
	 lockstate() now checks lock files down the view
	 invalid options produce warning rather than error exit
	 update Makerules :INSTALL: to check needed directories
	 fix sequencing bug in trigger() that bombed null action targets
05/19/88 change .ARCHIVE and .OBJECT usage in Makerules
	 fix shquote() to handle v9 sh {} botch; move C_SHELL to shquote()
05/17/88 fix metarule state and state.tolerance checks in make()
05/16/88 add $(?) for generating all prereqs with no selection
05/11/88 move null trigger() before scan() in make()
	 fix alternate binding for .LCL.INCLUDE files
	 fix :MAKE: to handle .VIEW
05/09/88 pass attributes for secondary bindings in bindfile()
05/06/88 fix -o vardump core dump bug in dumpvar() call from setvar()
	 add .ARUPDATE to .DO.INSTALL
05/04/88 add :P=U: to return unbound path name
05/03/88 check for MARK in expandvar()
05/01/88 virtual state vars made when expanded
04/30/88 canonicalize .SOURCE* names before scanning
04/29/88 check for !r->statevar && r->state in staterule()
	 virtual state atom time changes only by assignment value change
04/28/88 fix bug in Makerules .LINT that botched generated .c intermediates
	 fix :G: to accept suffix list as well as full names
	 fix $(...::) infinite loop bug
	 change %D%* to $("%")D%* in Makeinit for SCCS users
04/26/88 redo Makerules :JOINT:
	 update Makerules .CIABASE, rename to .CIADB
04/22/88 remove install.prof from .SAVE. in Makerules
04/19/88 add .ALL:.NULL to Makerules for common actions with no ::
04/18/88 multi hard link files are not sync'd by statetime()
04/14/88 update internal.making in maketop()
04/11/88 ----- LC 2.0 beta release -----
04/11/88 fix bug in enter() that executed action even if prereqs failed
	 fix bug in Makerules.mk/.MAKEINIT that set CC without binding (CC)
04/07/88 change makerules .SCRIPT to test if *.mk.sh was generated
	 .MAKEINIT now part of user activities
	 add $(MAKECC) to makerules for cc's with fixed cpp
	 add vardef() for -o oldfile and -o script
04/06/88 fix dynamic() unbounded recursion bug on indirect prereq references
	 add #rules base rule directive consistency checks
	 state.rules is base name of active base rules
	 fix prereqchange() to check out of order rule.use prerequisites
04/04/88 installed rules are now lower case by convention
03/30/88 re-make() targets that were not scanned the first time around
	 fix r->ignore time propagation bug in make()
	 fix :JOINT: to check all lhs when one is updated
	 add .APPEND* for symmetry with .INSERT* global prereqs
	 add .NOIMPLICIT and rule.noimplicit to inhibit metarule application
	 add .NOIMPLICT to makerules prereqs
03/25/88 update makerules command actions .OLDFILE and .SCRIPT
	 fix c_scan() and sql_scan() for non-terminated comments on include
	 add output file pointer arg to dump routines
03/24/88 add OPT_errorid for better recursive make tracing
03/23/88 add alias consistency checks; fix internal.unbind to unalias
03/22/88 makefile must exist; `-o file -' deleted
	 1st line of 1st makefile: #rules "alternate-base-rules"
	 base rules and global files not loaded until 1st line of 1st makefile
	 delete OPT_rules; MAKERULES reset to actual rules name
	 delete OPT_bypass and add OPT_base (-b)
	 new options to compile base|global rules: -bc -f file
	 .VIEW initialization moved from makerules to Makeinit.mk
	 main() bootstrap re-ordered (again) -- args read before Makeinit.mk
	 fix link bug for OPT_move
03/18/88 fix bug in $(VAR1|VAR2...) implementation (there since the beginning!)
	 expand external.* variables (except external.shell) before use
	 fix bindfile() bug that improperly called bindalias()
03/17/88 fix CON_for + CON_scan full match scan test
	 insert . on .SOURCE.c in makerules to fix -I generation bug
	 OPT_bypass and OPT_global now expanded in $(-)
	 add state.bypass to decouple OPT_bypass from state.global
	 OPT_rules omitted from non-global makefile same as setting to default
03/16/88 add :P=S: edit op and fix .SELECT. in makerules
	 fix :T=F: bug that let some non-files slip through
03/14/88 fix bindalias() bug that caused alias loops
03/10/88 delete `or first argument with .mk suffix'
	 fix forcescan()
02/29/88 ignore SIGPIPE after coshell forked
	 clean up command.c comments
	 clean up makerules .DO.INSTALL* again
	 fix statetime() heuristic for hard link updates
	 change makerules yacc action to move y.output to $(<:B:S=.grammar)
	 add cia (C information abstractor) makerules support
	 OPT_bypass not expanded in $(-), like OPT_global and OPT_file
	 add :SAVE:, .GRIND and .GRINDEX to makerules
	 support .MAKE : <semaphore>
	 return -1 -> target FAILED, return 0 -> no time update
	 add internal.args, internal.making, delete $(?) and OPT_main
	 stomped bit field assigment/test bug in 3b20 compiler
	 add :PACKAGE: to makerules
02/26/88 clean up hardwired script
	 add .DO.INSTALL.SAVE to .DO.INSTALL
	 rule.ignore prereqs ignored in prereqchange() comparisons
	 fix job control bug that deleted active targets on SIGTSTP
	 delete internal.dump and OPT_dump
	 add OPT_interrupt, set nointerrupt for multiple internal.interrupt
	 make internal.debug to enter interactive input mode
	 internal.debug immediate rule debug prints prereqs
	 fix makerules archive delete bug
	 clean up coshell message and job table tracing
02/25/88 confine all external engine names to external.* and initrules()
02/24/88 fix a few inappropriate free() calls
	 fix stateview propagation of rule.build
02/22/88 replace .SCAN.ifs with .SCAN.sql (awaiting formal sql syntax)
	 add Makeinit.mk to localize engine initialization
02/18/88 add parent prefix directory binding c_bind() to c_scan()
02/11/88 add apply() and fapply() to replace cmdopen()
	 fapply() .MAKEPP action for makefile preprocessing
	 fapply() .MAKESCAN action for .SCAN.MAKESCAN scanning
	 change makerules .LINT to use silent +
02/10/88 fix internal.make inconsistency that cleared rule.make
	 fix alias bug that improperly applied unalias()
02/09/88 fix scan() bug that missed built files with OPT_accept
	 add newbuffer() wrapper to expandvar()
02/08/88 new VERSION: rule.synctime shared with rule.data and rule.uname
	 reorganize attributes to take advantage of merge(*,*,[-1,0,1])
	 add .USE .ATTRIBUTE to combine builtin and named attributes
	 add changed attributes test to prereqchanged()
	 .ACCEPT->attributes masks attributes that may change without update
	 .IGNORE->attributes masks attributes that are not propagated
	 .RETAIN->attributes masks attributes that are retained from .ms
02/06/88 add .ATTRIBUTE<suffix> to generalize inherited suffix attributes
	 modify merge() to do attribute propagation
02/04/88 fix scan() bug that botched non-terminated quotes in directives
	 properly set and test rule.triggered
02/03/88 add multi level concurrency -- finally did it right
02/01/88 fix makerules .VIEWINIT to set .VIEW iff in first node of VPATH
	 fix makerules .ARCHIVE.o to delete unused archive members
	 fix improper state prereqs clear for !state.scan in make()
	 OPT_force no longer touches non-action state variables
01/31/88 ----- limited alpha release -----
01/27/88 fix bug that botched interrupt of last job
	 fix state.oldfile '...' and "..." output bug
01/26/88 demote 'alias has changed' and 'is also specified as' to message -2
01/22/88 fix staterule() bug that omitted search for global view staterules
01/20/88 fix OPT_accept to properly set staterule->built
01/11/88 add state.localview for state.oldfile and state.script
	 honor "..." in $("...")
	 yet another coshell interface update, this time for SH_OLD
01/07/88 add `<var> == <value>' to replace `set state ... set nostate'
01/05/88 add sepcmp() to expand ops
	 fix inappropriate .VIEW . dup warning
01/04/88 tweak makerules :READONLY: scripts
12/24/87 fix make() prereqchange() bug on newly promoted source files
	 update yacc header rule in makerules
12/22/87 fix internal.attribute compile bug in compile()
	 change intermediate metarule to handle prereqs and action
	 change yacc and lex metarules to use intermediate in makerules
	 change .READONLY attribute to :READONLY: operator in makerules
12/11/87 add :COMMAND: operator to makerules
	 update Makefile for Genrules and makerules examples and docs
	 OPT_global no longer expanded in $(-)
	 fix staterule(SOURCE) bug that didn't track view changes
	 add .UNKNOWN to do unknown command line target name translation
	 add .DO.LEX++ lex.yy.c post edit for C++ in makerules
	 change option parsing to meet getopt(3) standard
	 `-bcfg file' is now `-bc -f file -g file' as per getopt(3)
	 change OPT_made to OPT_main, delete state.notmade
	 add internal.tmplist to avoid internal pointer munging by load()
	 delay unknown command line option check until after makefiles read
	 add .SEQUENTIAL for self and child actions in foreground
12/08/87 add unalias() before update() calls in make()
	 recode for updated hash library interface
12/01/87 fix expand(var=...) trace message
	 add OPT_mismatch to accept if state file mismatch
	 use $(SHELL) before punting to /bin/sh
	 change .GLOBAL to .INSERT
	 add Version.mk for version stamp fine tuning
	 state.reread changed to count, 2 levels allowed
11/30/87 add .REPEAT to .ARCHIVE related .AFTER rules in makerules
	 fix archive scan bug for port archives with no symbol directory
11/22/87 fix BSD job control hang bug by ignoring SIG_IGN
	 fix @.sh and _make_.sh bug that sent newline to stdout
11/20/87 add MAKESHELLTYPE for ksh vs. old sh dependencies
	 fix implicit suffix rule bug that botched a/x.y prereqs
11/18/87 update makerules to properly use Makeinstall variables
11/11/87 re-order MAKEPP -I options
	 change OPT_skew to OPT_tolerance, add timecmp()
11/10/87 fix state.rules checks and option handling in general
11/05/87 add .SCAN.MAKESCAN for external perequisite scanning via $(MAKESCAN)
	 add rule.internal to mark internal non-compile rules
	 fix spurious core dumps by adding internal.readprereqs
	 add rule.readonly to inhibit user mods
11/04/87 add `set option=[*]name' to declare external boolean [string] options
	 delete :T=<op>: operands that have been supplanted by :A=<attribute>:
11/01/87 add :?: and :Y: conditional edit op
	 state.scan=0 is the compiled default -- must be set in default rules
	 change $(-) and $(+) to use named options
	 delete .SET and change option storage in make object files
	 add state.rules and OPT_rules for alternate standard rules support
	 fix :M: bug that dumped core
	 change makerules to use `ancestor' named option
	 `set noancestor' is the makerules default
	 `set noscan' is the make default
10/29/87 fix state.forcescan checks with more than one view
10/28/87 fix warped from future message by first checking rule.bound
	 inhibit some file warning messages if state rule exists
10/27/87 delete state.unique and OPT_unique - views make this obsolete
	 add rule.alias and rule.aliaschanged to fix alias bug
10/26/87 add MARK to properly handle "'s in conditional expressions
	 delete error="...", trace="..." and warning="..." `options'
	 add error and set to parse()
10/23/87 fix constack[] overflow check in parse.c
	 add unparse() to unwind parse stack on errors
	 don't make .DONE or .INTERRUPT if state.compileonly
	 fix fd handling in main() and coinit()
10/22/87 remove OPT_implicit, state.implicit
	 state.scan (+x) inhibits implicit file prereq scanning and checking
10/21/87 treat "..." and <...> #include files the same in makefiles
	 add :P=L[=n]: bound view level edit op
	 close spurious open fd's before coshell exec
10/20/87 fix $(*) bug for implicit targets with explicit source prereqs
	 add OPT_warn (-w) to disable some source file warnings
	 add rule.alias to handle different atoms binding to same atom
10/17/87 remove `\' interpretation in expand() -> (...) must balance
	 add $(<var>`<del>...<del>) top level alternate edit op delimiter
	 change rule.fired -> rule.triggered, rule.generated -> rule.built
	 change LOCALROOT -> INSTALLROOT
10/16/87 fix :: op to enter explicit source prerequisites
	 fix make() to check explicit source prerequisites for implicit rules
10/15/87 fix bug that omitted tstate check for implicit rules in make()
	 fix staterule() bug that omitted stateview() call
10/14/87 fix OPT_oldfile bug with rule.make and rule.virtual targets
10/11/87 change shell order to $MAKESHELL, ksh, /bin/sh
10/09/87 add reason(fmt,...) for OPT_explain
	 make rule.semcount a separate field
10/06/87 fix .SOURCE directory aliasing bug using rule.uname
	 handle interrupts before any calls to maketop() or make()
	 X=a..c, $(X:B)=a, $(X:S)=..c
10/02/87 fix .ACCEPT and .TOUCH
	 add :JOINT: operator for joint (multiple) target generation
10/01/87 add .SPECIAL to avoid setting .MAIN
	 change $(var.$(CC)) to $(var.$(CC:B))
09/30/87 add STDINCLUDE.$(compiler), change $(CCFLAGS.$(CC)) to $(ALTPP.$(CC))
09/29/87 add :INSTALLDIR: to makerules
	 update Makefile for alternate rules
09/25/87 add `* : * : *' and rule.intermediate
09/24/87 fix parentage() to properly list applied operators
09/23/87 decouple state.ignore and state.keepgoing
	 fix trap on ERR bug in foreground coshell
	 coshell command and message trace bumped from level 3 to 8
	 fix rule.statevar clobber in load()
	 add rule.changed to note statevar prereq and action changes
	 add @ non-tokenizing edit prefix operator
	 pass job control signals (SIGTSTP,SIGTTIN,SIGTTOU) to shell
09/18/87 fix state.touch bug from 09/11/87 batch change
09/17/87 update lex and yacc implicit suffix rules
09/16/87 add newfile() to add newly generated non-dot files to hash
09/15/87 $(>) == $(*) for implicit suffix rule actions
09/14/87 add $(MAKE:D) to .SOURCE.mk in hardwired script
	 change state.builtin to state.global (builtin -> default)
09/11/87 rule.target set only if actions or non-attribute prerequisites
	 change rule.commands to rule.action and docommands() to doaction()
	 delete rule.updated
	 add rule.fired to properly set rule.generated
	 call complete() before implicit suffix rule test
	 use statetime() in place of rstat() in a few key routines
	 update "::" in makerules to use .MULTIPLE for .ARCHIVE prereqs
	 delete internal.prerequisites and .PREREQUISITES
	 .FUNCTIONAL and .VIRTUAL no longer .IMMEDIATE
	 .FILES. and .OUTPUT. now .FUNCTIONAL in makerules
09/08/87 fix generated builtin rules makefile dependency bug 
	 fix bug that omitted named attribute checks for rule.statevar
09/03/87 change `dependency' terminology to `prerequisite'
	 add .MULTIPLE attribute for multi prereq occurrences
	 operator syntax forced to be `:<identifier>:'
09/01/87 add :Z: op to expand in parent reference frame (cumulative)
08/31/87 use unbound name in staterule()
	 fix generated target state bug in scan()
	 walkthrough and lint cleanup
08/27/87 add :BUILD: and .GENSYM. to makerules
	 fine tune .TOUCH
08/26/87 fix state.keepgoing interaction with coshell
	 state.readstate also controls view state files
	 fix bug that allowed env var override compiling global makefiles
08/25/87 fix bug in readfp() that didn't update rule pointer after load()
	 fix <...> and "..." warnings in c_scan()
	 fix expandops() bug that inappropriately left trailing blanks
	 fix reread() to close open file descriptors
08/24/87 don't automatically clear commands for immediate rules
	 .ALWAYS for operator expands before application
08/22/87 add .NOIMPLICIT `attribute' to disable implicit rules on target
	 unwind make() to topmost dontcare target on errors
08/21/87 add :MAKE: recursive make operator
	 suppress `not updated' warning for directories
	 move `recursive var' test to expandvar()
08/20/87 fix immediate() to do dynamic() only if target selected
	 change .CROSS.COMPILE to be makerules immediate rule
	 fix bindrule() bug that choked on views with no state
08/19/87 fix lockstate() for geteuid()==0
	 add bintab to handle bound dir of files starting with ../
08/18/87 fix staterule() bug that omitted r->scan generated files
08/13/87 fix local var bug that inappropriatley set v->import
	 fix :P=R: and :P=T: for degenerate cases
	 fix .VIEWINIT interaction with -a makerules option
08/11/87 adjust for new <re.h> library interface
07/28/87 fix return to take expression arg
	 add :INSTALL: operator to makerules for nice .DOINSTALL stuff
07/24/87 optimize silent shell function to fork only on failure
07/23/87 add .RETAIN for retained variables
	 add `silent' and `silent -' for selective tracing
07/22/87 add -o headerstate and -H to ignore state vars from headers
07/17/87 loosen tight binding of :U: operator on .SOURCE.[ah]
07/14/87 add r->view, state.view, state.maxview and .VIEW for state views
07/10/87 add -[DIU]* command line options to makefile dependencies
07/09/87 fix `a :: lib.a' makerules bug
	 fix bindfile() bug that bound ../x -> x (if x already bound)
	 add r->garbage and state file GC to compile.c
07/08/87 use seterror() and remove err_* references
	 change :Z=<op>: to :P=<op>: and add :P=D:
	 change :I: to be simple path name intersection
07/07/87 makefile dependencies fixed with time equality tests
07/06/87 first attempt at return -- must reconcile with r->updated
07/02/87 change :I=*: and :X=*: arg to be list to be expanded
06/17/87 add :M=<RE>: for RE match version of :N=<sh-pattern>:
	 fix :op: bug that removed too many backslashes
06/15/87 add ifs_scan for #include "file" and {INCLUDE "file"
	 call getstate() in scan even if !state.fullscan for comments
06/05/87 fix bug in `local' that failed with more than one arg
	 suppress `is also specified as' message if r->dontcare
06/04/87 add :LINK: operator to makerules
	 add r->dynamic to merge code in dynamic()
06/03/87 order dependent options not included in $(-), i.e., -[bfg]
	 add $(TMPDIR) to makerules
06/01/87 fix msgfd allocation bug in coinit()
	 use libx/regexp routines for :/old/new/: edit op
05/26/87 fix interrupt() and finish() for recursive make signals
04/27/87 update archive access for proper fseek()-ftell() interactions
04/23/87 fix .CLEAR to not clear r->state if isstate(r->name)
04/22/87 add time pointer arg to complete() for dep time propagation
04/20/87 coinit() now uses any 0<=msgfd<=9 for coshell->make messages
	 fix semantics for .VIRTUAL state vars
	 fix '\n'->0 bug in recursive parse()
04/17/87 add `local <var> ...' local var declarations for .MAKE actions
	 add `.FUNCTIONAL : <var> ...' to make rule <var> on expansion
04/16/87 fix bug that missed explicit .BEFORE deps for implicit rules
	 add long integer arithmetic in if expressions
	 delete test.c; add `let <expression>' to parser
	 fix error staus propagation from dependencies to target
04/15/87 ignore .USE rules in dependency change check
	 :R: returns relative time in seconds
04/10/87 fix state.oldfile to append " ; " to avoid generating ";;"
	 add remtmp() to clean up temporary files during savestate()
	 fix superfluous `frozen variable changed' bug in load()
04/09/87 add r->semaphore and .SEMAPHORE for fine grain serialization
	 variable names may now contain any characters
	 `(x) = v' initializes a virtual state var -- no relation to $(x)
	 add .EXPORT to mark additional name=value pairs for $(=)
	 delete .LOAD for lack of use
	 .CLEAR and .INSERT on active targets invalid
04/08/87 change .SEARCH* to .SCAN* and search* to scan* for consistency
04/03/87 fix bug in :A: edit op that botched non-rules for the != case
	 fix bug in bindstate() that sometime returned 0 even if r->state!=0
04/02/87 add r->entries to decouple r->bind from directory search
	 add OPT_skew and state.skew to handle RFS time sk[r]ew botch
04/01/87 fix parse bug that interpreted wrong keywords in skipped if blocks
	 delete .NOTOUCH; add .IGNORE, .REPEAT and .VIRTUAL
	 delete .IFPARENT and .POST; add .BEFORE and .AFTER (ifparent implied)
	 delete .CLEANUP; add .ACCEPT (state.accept on per-rule basis)
03/26/87 check for abnormal termination in exit status diagnostic
	 OPT_builtin now turns off all previous OPT_global flags
	 :A=attr: fixed to check for builtin as well as named attributes
	 fix frozen var bug that omitted cmd line args from .mo file
	 add .UNTOUCH as inverse of .TOUCH
03/24/87 fix update() in make.c to properly update rule state
03/23/87 change .FORCE to only force target once per make
03/20/87 make .STATE an attribute
	 fix `multiple commands for...' message for dynamic updates
03/19/87 fix parser `\\n' bug for .MAKE scripts
	 fix parser bug that appended bad immediate deps on special.dependencies
03/18/87 delete obsolete -q and OPT_question
03/16/87 fix .MAKE interaction with complete(); -j0 -> serialize on update
03/11/87 update immediate() to properly handle .MAKE args and commands
	 fix `x was not updated' warning and `...lags...' warning bug
03/06/87 add :A: to return list of attributes for rule
	 skip for loop with no pattern
	 add `set +o monitor' to coshell startup
03/05/87 update error(3) interface
03/03/87 fix pp->cp->block bug in parse() push section
	 add oldshell to command() for automatic Bourne shell compatibility
03/02/87 change ROOT to LOCALROOT; change -lfmalloc to -lfaloc
02/27/87 change finish() to use switch over if ladder
	 change `stack cleanup commands' to `queue cleanup commands'
02/26/87 fix bug in compvar() that took length of normalized value
02/24/87 fix makefile dependency bug in parse
02/05/87 delete state.work and `x is up to date' message
02/04/87 change expand:shquote() to \\ quote all sh meta chars
02/02/87 add state.script to support .SCRIPT
01/30/87 add .SCRIPT to generate *.mk.sh bootstrap shell script
01/29/87 fix invalidate() again; delete state.last; add r->synctime for r->state
01/28/87 add state.last to fix call to invalidate(); add marks to invalidate()
         modify depchange() to check for dependency re-orderings
01/27/87 switch to libpp.a standalone passthrough preprocessor
01/05/87 change `:' edit op separator missing error to warning
         #include <> vs. "" warning only if !dontcare
12/19/86 add :///G: suffix to inhibit tokenizing; required for ' ' in from part
         use C_ID2 to check operator characters
12/11/86 fix :T=G:
	 fix CON_eval bug that did not pass along CON_skip in getline()
         fix readline() to translate \\\n to \\n
	 use dynamic arrays to construct makepp argv
	 complain about no makefile for -c option
12/08/86 update S support in makerules; do statetime(parent) only if r->post
12/07/86 .SOURCE.mk used to bind all makefiles (default uses $(MAKERULESPATH))
12/05/86 fix bug in $(-) portion of getval() that always returned null
12/02/86 add .SHAR builtin target; clarify option argument parsing
12/01/86 add ALTSOURCE & ALTDEPS to staterule() calls
         	()<rule>		previous state of <rule>
		(ALTSOURCE)<rule>	alternate dirs to search for <rule>
		(ALTDEPS)<rule>		internal deps if <rule> generated
	 add special.openfile & special.openfd to optimize rstat() & search()
	 fix state.force to update targets with commands but no deps
	 add .SEARCH.nroff to detect .so dependencies
11/26/86 fix error() to gracefully handle long messages
11/25/86 use getcwd() from libx; clarify parse expansion conditions
11/24/86 add (.SEARCH)<rule> for state of generated .SEARCH rules
         make() -> maketop(); make0() -> make()
11/21/86 change `.SEARCH : var' to `.STATE : var'
11/20/86 add parentage() to `don't know how to make' message in make0()
11/19/86 change .UPDATED to .IFPARENT; add ifparent:1, hasifparent:1, haspost:1
11/18/86 add rule merge to dynamic(); HOME no longer frozen by ::
         `.SET : state' marks assigned vars as statevars until `.SET : nostate'
         -R changed to -o reread
11/14/86 working version finally generated
11/07/86 change .OPTIONS to .SET
11/06/86 add options by name
11/01/86 add newbuffer() and freebuffer(); delete buf0, buf1 and buf2
         delete prefix rules and all references to prefixes
         add nested if, while, for and eval flow control blocks
         replace gram.y and scan.c with parse.c and test.c
10/31/86 ----- internal release -----
10/31/86 big batch change:
         add T=R expansion to replace ARUPDATE
         add .COMPINIT to main() initilization sequence
         add .MAKEPATHINIT to Makerules for makefile chain support
         add .MAKEDEPS to replace .INTERNAL for makefile dependencies
         add :U=(mark)dir: and :X=(mark)dir:
         fix r->implicit check in implicit rule portion of make0()
         fix cmd arg/compile omission on v->search variables in setvar()
         fix compvar() to not compile cmd arg var definitions
         add { :=+ } checks in scanner
         fix attribute consistency checks in load()
         fix `don't know how to make' check for state conflict
         fix ** for MAKEPATH; add state.operator; fix state.question
         .UNTOUCH -> .UNBIND; add .BIND; update Makerules
         add static header in compile(); fix tstate check in make0()
         relaxed r->search check in make0()
         add .COMMAND.o, .ARCHIVE.o, .OBJECT, .DEFAULT<suffix>
         .GLOBAL -> .GLOBAL.COMMAND, .GLOBAL.a -> .GLOBAL.ARCHIVE
         .MATCHRULES -> .FORRULE, .MATCHVARS -> .FORVARS
         add .DEPENDENCIES rule; add :G=<:; update .CLEAN and .CLOBBER
         reverse op order to :N:, :G:; :T=F: does not expand symlinks
         fix $_i_ and MAKEPATH sequencing in .CROSS.COMPILE
         delete "very old" time
         fix :: and :- ; delete $((<var>)) expansion; silence read warnings
         add . to MAKEPATH; update cross()
         add .UPDATED for .POST rules to be made only if target updated
         r->precmds -> r->commands
         delete ... syntax and r->poscmds; add .CLEANUP to stack til cleanup
         fix INSTALL expansion of $(HOME) that froze HOME in :: operator
         add $() to stop re-expansion at beginning of line
         add ' quotes to getlin()
         :T=P: if r->post, :T=U: if r->use
         add $(~) to expand all target dependencies; :T=U: -> :T=X:
         .NULL -> .COMMAND; r->null -> r->command
         delete r->statedeps; all file targets now have corresponding rulestate
         save precmds in state file and check for changes
         add depchange() to check for changed dependencies
         fixed r->search bound check in search()
         retain special.target for dynamic() of r->use rules
         expand -l notation in LDLIBRARIES
         add .PARAMETER state var search to .PARAMETER files in search()
         delete <file>(<var>) state vars -- use .PARAMETER state vars instead
         change VERSION to string in compile()
         .PARAMETER state variables are not expanded
         add check to search() for added|deleted implicit dependencies
         fix quote bug in getstate() that omitted some state vars
         fix state.forcesearch to mark state vars with r->force at start
         split RELEASE into BRANCH.RELEASE in compile.c
         add canon() to intersect(), ancestor() & bsd_compatability to Makerules
         use <error.h> and error() from libx
         change -L to -K; "source has changed" error only if file found
         add !isalnum() check for operators
         switched malloc.c over to #include <fastmalloc.h>
         add null pointer check in compvar(); fix delim check in cowait()
         fix bindbase() and $(>) expansion for r->member rules
         add utime() call to touch(); add :T=L: for archive (lib) members
         add -a to Makerules to disable :U=include: and :U=lib: ops
         delete unneeded "-l* : .DONTCARE" from :: operator definition
         add time==0 check to rstat()
         add BRANCH and RELEASE components to VERSION
         add ".SOURCE.h : .INSERT ." to .MAKEINIT in Makerules
         add state.user to note start of user activities (i.e. save state)
         use hash rather than linear search for unique()
         add .SEARCH; add statevar(), filevar() and varstate() to localize
         add .VPATHINIT to Makerules for VPATH support
         add :Z=R: and :Z=T[=s]: path name ops for VPATH support
         do not remove symbolic link targets on interrupt
         search attributes are inherited by dependencies; add :T=M: op
         $(=) expands ARG_READ args; use hashalloc() & nohashalloc()
         add :T=U<op>: for unbound rule typing
         localize state var format to state.c; add rulestate()
         check for polluted environment in readenv(); update isspecial()
         allow :O[><=]=<n>: in expand1(); ALLOCATE() -> allocate()
         fix !v loop in setopt(); check r->dontcare in scandeps()
         delete "[]&" from C_TERMINAL; reset '|' in attributes()
         expand <ret> in :T=<type>?<ret>: if true
         delete state.autocompile; MAKERULESDIR -> MAKERULESPATH
         .MAKEFILES -> MAKEFILES (var); vspecial() assumes : separated lists
         optimized compile() and load() for state.compilestate
         fix MSGFD dup2() bug in coinit() that closed good fd
         add .ONOBJECT to Makerules for .CROSS.COMPILE support
         add _make_ quit <exit-code>; add MAKECROSS for cross compilation
         MAKERULES & MAKERULESDIR now `:' lists; add r->status=IMPLICIT
         add MAKEEXCLUDE `:' list of excluded :U=<dir>: prefixes
         fix multiple -g builtin rule checks; read env first
         .IMMEDIATE implies .NOTOUCH -- clear deps if not .DONTCARE
         add .IMMEDIATE -> make when read or loaded; matchscan() now recursive
         add .OPTIONS : <var> for $(=)
         .MATCHSCAN -> .MATCHRULES; add .MATCHVARS, .LOAD; DMAKERULESDIR
         add -cfg to compile builtin rules; add // stop mark to :U=<dir>: op
         fix token state bug in expand.c; fix implicit suffix check in make0()
         fix sequencing in interrupt() and finish()
         fix r->link bug in make.c; add symlink check to .DOINSTALL
         add $(^) for alternate bound name of active r->current target
         add clearlink() to compile() -- too many puns on r->link!
         use bindfile() for state file; aim for position independent makefiles
         delete INCLUDEDIR & LIBDIR, add MAKEINCLUDE & MAKELIB to Makerules
         add | operator to edit matching; change VPATH -> MAKEPATH
         add :U=<dir>: ancestor operator -- now catches .h and .a on VPATH
         add $(TEST) and ** operator to Makerules; add r->force; VERSION=10
         add state file locking; add :O=[<>=]<n>: component offset edit op
         parameterize Makerules.mk using #if exists(x,$PATH); update finish()
         delete configure.h -- put configuration switches in Makefile
         fix r->status checks in make0()
         fix .CLOBBER to also remove state file
         ".UNTOUCH .TOUCH : dir" causes dir to be ignored in bindfile()
         add freelist(), freerule(), freevar(), newlist(), newrule(), newvar()
         update Makerules with .*. var names; merge code[] into ctype[]
         general cleanup; re-evaluate warning messages; add istype() macro
         delete r->touch; add r->status==TOUCH; VERSION=9
         add implicit state vars to search(); add var->search:1; VERSION=8
         update $(!) and $(&) to generate all deps; add special.freerules
         add file system and local system sync checks; add $(-!xy!z...)
         change "* : *" -> .NULL and "*.a : *" -> .ARCHIVE
         add .IDENT target using $(MKIDENT) and $(!)
         add /local and /usr/local checks to Makerules
         add *.EXCLUDE in bindfile() to exclude suffixes from prefix binding
         invert -u option; add option.c; reorganize rule.c, variable.c
         change bindbase() to lazily search *.SOURCE*
         use r->bound with binddir() for *.SOURCE* deps; add bindar()
         delete search(); change finddeps() to search(); add m4_search()
         delete :M: edit component
         fix *.l and *.y rules for remote directory compatability
         replace getdefine() with subcase of finddeps()
         fix $(+...) bug in variable.c; put language dep searches in search.c
         add .c, .f, .F and .r to searchtab[]; add readargs() to modify argv
         use bindfile() for finding makefiles
         add $(VPATH) to Makerules using .MATCHSCAN on .SOURCE*
         delete $(SRCPATH); add .MATCHSCAN to scan and match all rules
         add .SEARCH(file) to handle binding for #include "a.[!h]"
         add ".SEARCH.x : .y .z" for .y and .z files to inherit .x search
         add file dependency search strategies in searchtab[]; r->search:3
         change r->prealways,r->posalways to r->always; delete r->fullsearch
         change CCFLAGS definition to only expand required -I options
         add :I=s: prefix intersection op; :I: and :X: now gen valid dirs
         add $(!) to expand all source dependencies
         add "[target]" to dumprule(); use .ATTRIBUTE->deps, not ->link
         fix "* : *" bug in gram.y
         ".SOURCE.h : $(INCLUDEDIR)" & ".SOURCE.a : $(LIBDIR)" -> Makerules
         add "@ .UNTOUCH : *.h" to "*.c : *.y" rule
         change release(sun) references to machine(sun)
10/08/86 ----- gsf returns to labs -----
09/30/86 ----- msf distributions -- vpath-nmake branches off -----
02/01/86 ----- jes distributions -----
08/30/85 ----- third distribution -----
         last AT&T modifications by ulysses!gsf -- transfer to ulysses!make
08/29/85 add -lx expansion to libx.a in ::, remove .SOURCE.a -> -L connection
08/24/85 move strmatch() to libx.a
08/21/85 fix sequencing in compile() to preserve .mo on error
08/20/85 fix bug in make0() where odeps did not restore original r->deps
         add CCFLAGS and F77FLAGS to "* : *"; "* : *.a" -> "*.a : *"
08/11/85 in make0() generate x() if x->time > 0 (if x is an existing file)
08/06/85 delete .SEARCH verifcation of 07/26/85 for now
08/05/85 set $(MAKEFILE) to the name of the first makefile
08/02/85 fix bug involving multiple operators in large makefiles
         save original dependencies in make0(); fix r->compiled .ms bug
08/01/85 commit to ksh -- check MAKESHELL before SHELL for non-ksh users
07/31/85 nmake: nmake.1, nmake-intro.0, mkcv.1, mkold.1, mkold.sh
         change all `make' references to `nmake' for AT&T Toolchest(TM)
07/30/85 add man pages *.[1-9]* to .INSTALL; use BINDIR, ETCDIR, LIBDIR, MANDIR
07/26/85 verify that .SEARCH files will be found by the preprocessor|compiler
07/25/85 fix bug for .NULL targets with suffixes; add :F=format: operator
         for make install check .INSTALL.x for command x
         add ctags builtin action; check state var deps for *.sh targets
         for "*.x : *.y", add both .x and .y to .SUFFIXES
07/24/85 -k option makes "don't know how to make" a warning
         do not expand $(-) with -o option on
07/23/85 search x if "x : .SEARCH" and x dynamically generated; add SRCPATH
         fix null dereference error in main.c for no makefile case
07/11/85 ----- second distribution -----
07/10/85 more make object checks; allow space before initial { in commands
07/09/85 add .FOREGROUND to *.y rules to synchronize y.tab.h generation
07/08/85 use v->oldvalue in compile.c to detect frozen variables
         add invalidate() to invalidate targets with source dependencies
07/07/85 state file for 'make x' with no makefile is 'x.ms'
07/05/85 pass "*.x : *.y" dependencies to each implicit target
         append .x to .SUFFIXES for "*.a : *.x"; update .LINT
07/03/85 fix scanner to ignore "[ \t]*\n" lines in addition to "\n" lines
07/02/85 allow += to modify command line variable definitions
06/30/85 make \n a token in gettok(); delete :L: operator; $("\n") -> newline
06/27/85 fix make clean|clobber to only remove files in . unless -m is set
         fix default rules to support (CCFLAGS) as a state var dependency
         save var values in oldtab for .mo when var defined on command line
         allow .MAKEINIT rules to modify command line variable definitions
         fix bug with multiple -f or any -g files; add -R recursion check
         add user attributes, .ATTRIBUTE and $(:A=a|b) access
         add consistency checks in cowait(); generalize builtin attributes
         use rstat() [open(),fstat()] instead of stat() -- the same as cpp
06/26/85 use unbound name in "source has changed" message
06/24/85 fix $(..|"X") to allow editing on "X"
06/22/85 update :: rule to properly handle ./* and ../* dependencies
         invert meaning of -h -- search by default, -h turns off search
06/21/85 reverse .MAKEFILES to "Makefile makefile"
06/20/85 add "* : *.l" with -ll; ".SOURCE.h : /usr/include" handled
         ".ms" is the default state file if there is no makefile
06/19/85 handle `X+= Y' which was interpreted as `X+ = Y' producing a warning
         eliminate some string duplications; re-use old variable value space
         fix '\\' tokenizing in $(..); add "make print x" and .FILES.x
         iteratively evaluate $(..) tokens in col 1; $$(..) -> $(..) and stops
06/18/85 add $(:E=<msg>) and $(:W=<msg>) error|warning message hooks
06/17/85 `x :: x.sh' properly handled using .IMPLICIT
         .MAIN handled by rule name; special.main now .MAIN rule pointer
06/11/85 add :T=t=pat:, :T=t!=pat: and :T=t?ret: edit forms
06/10/85 fix wrong += frozen message; fix System V .LINT
         clean up error messages in read.c; use $(SED) for .READONLY.*
06/09/85 add automatic makefile dependency checking (no state vars -- sorry)
06/07/85 add `.' to hide internal variables in Makerules.mk; update make.1
         add .LPROF action for System V line count profiling
         .NOTOUCH rules always made; .GLOBAL.x deps dynamically expanded
         fix dumprule() to handle { } commands; move dumpcmd() to dump.c
06/06/85 fix .CLEAR to reset r->dynamic and r->use; set r->link=0 in load()
06/05/85 command line variable assignment ordered from left to right
06/04/85 fix frozen var checks in compile() -- env was not handled properly
06/01/85 ----- first distribution -----
         add state.reading and v->frozen to warn about frozen vars
         change argv[] stuff in main(), add $(=) $(?) hooks to argv[]
05/30/85 add new .LINT, override check to precious()
         add :T=T: operator for explicit targets, new .POST .NOTOUCH meaning
05/28/85 add -O (state.override) and -M (state.nomade) options for lint
05/21/85 fix placement of immediate() call in load()
05/20/85 add "*.o : *.c" to ".c.o:" conversion syntax
05/18/85 fix make0() interface to properly handle r->link
05/03/85 update hash table interface
05/02/85 add -k state.keepgoing option to continue with sibling deps on error
         fix bug where .o ignored if not in .a but older than .a
05/01/85 releases: 4.2 BSD, 5.2 System V, 8th Edition, uts
         machines: vax, UN*X PC, 3B2, 3B20, power6
04/25/85 -L -> -Wl,-L in Makerules.mk for system V; add buf check for +=
         -A implies -S; fix .y and .l .READONLY rules for concurrency
04/24/85 add $(s:G=<suf>) to expand components that can generate <suf> files
04/19/85 properly handle case where file modify time is less than previous
         remove alias compilations -- only unbound names in make objects
         retain unbound rule names for compilation and file dep states
04/16/85 move implicit prefix checks to bindfile()
04/09/85 remove state.exact, put -x with state.implicit
04/08/85 add C_VARIABLE to check makefile variable names
04/05/85 switch to <generic.h>; add r->cmdspecial & r->fullsearch (unused)
04/04/85 compile unbound rule names from akatab; fix -h, -x and -H options
04/03/85 add :N!=<pattern>: edit op
03/31/85 add state.accept -A to accept existing targets
03/30/85 move chksrc() logic to bindfile(); add implicit r->current logic
03/29/85 fix prefix rules -- they didn't work since 10/31/85 !!
         add touchar() verification; add .MAKEFILES for default makefiles
03/28/85 add .SOURCE.a to Makerules; add .[UN]TOUCH, remove _make_ [un]touch
03/26/85 change <.h> to .SOURCE.h; fix .INIT bug; add .APPEND.x
03/22/85 use .PARAMETER in make(); add CPPSCAN -T test code to state.c
03/21/85 fix -t with -m option; add .PARAMETER file attribute
03/20/85 fix sequencing in finish(); fix ar member exact time; fix ar .INSTALL
03/19/85 only expand $(...) symbols; $$(...) expands to $(...)
03/18/85 symbol names recursively expanded
         add .USE attribute check by make0(); .READONLY is generic
03/15/85 fix -s option; cmd opts take precedence
03/12/85 change ignored functions to (void)
03/11/85 update Makerules.mk
03/09/85 fix bug when touching archive members with state var dependencies
03/08/85 fix bug in make malloc() -- max was not in sync with brk
         check for `first-arg'.mk if no makefiles found -- gobble arg if found
         add .CURRENT and .SEARCH attributes; remove .ARCHIVES and .INCLUDES
03/07/85 all files automatically preprocessed by MAKEPP
03/06/85 add rules: target to make Makefile to compile and install Makerules
03/04/85 make edit() delete one trailing `/'
         add $(..:C@..) to add delimiter @ to substitute; allow any alpha option
03/01/85 add r->attribute; add -c to force compile only; add .DONTCARE
02/28/85 change bind() to return bound rule pointer; clarify $< $* $& usage
02/25/85 clean up archive.c; kill alias bug in compile.c
02/21/85 add .IMPLICIT attribute to force implicit dep checks; handle zombies
02/20/85 fix signal handling for background jobs
02/19/85 fix semantics of rules with state var deps; add compstate()
02/18/85 use state.option instead of ON(OPTION); special.rule instead of r_rule
02/14/85 add dump.c and read.c; compile rule aliases
02/13/85 optimize expand() by adding a few subroutines
         add compiled makefile.ms; atomize() to enforce one rule per name
02/12/85 fix grammar; add :V: to substitute value without expanding
         add += append assignment; add $@ and $# to operators; update Makerules
02/11/85 add :T=x<pat>: to match shell <pat> on expanded value
         .MAIN handling fixed; docompile() added to recursively set r->compiled
02/08/85 always compile into makefile.mo; move .(makefile) to makefile.ms
         add $& for list of explicit dependencies
02/07/85 Install suplied for make bootstrap installation
02/05/85 add compiler interface; builtin rules put in MAKERULES
02/04/85 split files.c into bind.c, compile.c and state.c
02/01/85 preprocess only if -p or if #preprocess first line in makefile
         add malloc() optimized for little or no free() calls
         add /*..*/ and //..\n comments to makefile
         add #..\n comments to .(makefile) -- leaves room for version info
01/30/85 add .ALL and .LINT builtin actions
01/29/85 if makefile specified then try `.TARGET' if `target' not defined
01/28/85 add any() replacing strpbrk(); gettok(), settok() replacing strtok()
         add :X=<sym>: cross product substitution
01/25/85 fix bug with strtok() and state vars -- strtok() modifies buffer!
01/24/85 add OLDCPP switch to check for new and old CPP, use -N in new cpp
01/23/85 add .OPERATOR attribute, change .ABBREV to "::", remove $(.ARG*)
01/22/85 little fixes, clean up builtin[] and -l option
01/21/85 put VPATH dependent stuff in .MAKEINIT
         add immediate() to check rules with r->immediate when modified
         add .UPDATE and .UCPIO, .UPRINT, .UTAR for update maintenance
         add .MAKE attribute -- allows docmd() for all command lists
01/18/85 $(-xy) == 1 if -x or -y option set, null otherwise
01/17/85 remove shell file expansion in dep lists because of binding ambiguity
         remove dir->entries -- not used because of shell expansion deletion
         add .TAR, .INSTALL and .DOINSTALL builtin rules
         add .NULL and "" rule for generating null suffix targets
01/16/85 use parse1(.ABBREV) for interpreting :: input
         add parse1(.MAKEINIT) to main() before make(.INIT)
         add -g option to read in global makefile definitions
01/15/85 unify variable edit forms: :N=<pattern>:T=<type>:
         add :: abbreviation and associated abbrev[] rules
         add ://..&../: notation to substitute form
         add .CLEAN, .CLOBBER, .CPIO and .PRINT builtin actions
         add $(+...) to access child dependencies in automatic variables
01/14/85 expand() edit expressions in variable substitutions
         change .y.o & .l.o rules to use .y.c and .l.c
01/11/85 add r->dontcare -- no error if rule can't be made
01/09/85 miscellaneous fixes to expand()
01/07/85 add sys error message for DEBUG errors
01/04/85 warn when #define state variable is inside a conditional
         put bound state variable names in .(makefile)
         -m option fixed
01/01/85 "fourth generation make"
12/18/84 keep -h files in .(makefile), only search when date changes
         add $(x|y|z...) to expand first non-null value
         add $(file(var)) to expand to #define value of var in file
12/14/84 add -m (MOVE) to move targets to corresponding source dir
12/11/84 add $@ [pre-commands] and $# [post-commands], $(X[rule]) for any rule
12/10/84 miscellaneous changes to option handling, `-' prepended on $-
         for automatic var x: $(xx) corresponds to parent target
         fix getlin() to always expand first part of line that has `$(x)' in it
         fix archive sequencing in bindfile()
         change .y.o and .y.c to produce $(<:DBS=.h) instead of y.tab.h
         add silent coshell function to not echo selected commands
         add alias(); add .WAIT as an alias for .FOREGROUND
         add .POST attribute; dependencies made after target is made
12/08/84 change _message_ to _make_, `_make_ make' to `_make_ read'
12/07/84 fix scan() method of handling {} command lists
         echo `x is up to date' for x on command line and !x->target
         don't include notouch, post or state dependencies in $< or $*
         add line number argument to parse()
         # is only comment char if preceded by space (or beginning of line)
12/06/84 use bit states in gram.y
         remove `(error)' from error messages, add .USE error check
         move `# <line> <file>' interpreter from yylex() to getlin()
12/05/84 make precious(.INTERNAL) always true
12/04/84 fix expand() to count parentheses
         change flags variable for command XX to XX-
         change .NOJOB to .FOREGROUND and r->nojob to r->foreground
         add FOREGROUND state to execute commands in foreground and block
11/30/84 x := y evaluates y when makefile is read
         cmd expansion delayed until job slot freed in cosend()
         check VPATH to set -u and .INSERT onto .SOURCE (build emulation)
         $(x/OLD/NEW/) substitutes NEW for OLD in each compnent of x's expansion
11/29/84 add .INSERT to insert instead of append dependencies
         add -u option (DUPLICATE) that allows duplicate files (build emulation)
11/28/84 add Machine to file name components, (warning) for unknown component
         add +option to turn option off
11/27/84 interpret "dir/file" rule names correctly
         add -h to search for #include header files
11/20/84 use static buffers buf0 & buf1, watching out for recursion
         some minor fixes and code consolidation
11/19/84 remove -e, [export], setenv(); set proper var order in main()
         description files now free format except for `...'
         add {...} command list specification -- alternative to tabs
         add quoted rule names to scan.c ("name")
11/17/84 move make(.INIT) before special rule check
         change .ORPHAN to .INTERNAL for clarity
11/16/84 add <file>(<var>) state variables; state is value of `#define <var>'
11/06/84 add coshell() and cowait() interface to co-shell
11/01/84 initial state variable ideas, state file added
10/31/84 ideas about generic hash table interface -- hash.h
10/27/84 $(<), $(>) and $(*) defined
         edit operators applied to each token in variable value
10/25/84 edit operator syntax defined; add post commands, .INIT and .DONE
10/19/84 code structure conversion -- "third generation make"
10/11/84 .CLEAR dependency defined
10/10/84 old make works on system5 and BSD; .MAIN added
10/07/84 add shell as co-process; <.x> predecessor of .SOURCE.x
10/05/84 add duplicate source message to old make
10/03/84 add .SOURCE to old make
09/19/84 first thoughts -- add mk script with cpp front end to old make
