nmake notes for 09/22/89 and later

Thanks to all the nmake beta testers.  I know 2.0 has caused a lot
of problems, but along with the pain we have a great opportunity to
clean up the rusty parts.  Here are a few of the latest features.

implicit prerequisite scans defined in makerules

	The scanners are now defined in Makerules.mk.  Check
	the .SCAN.* assertions.  Now all the wierd SQL include
	styles can be handled with a quick Localrules.mk edit.

$INSTALLROOT/lib/probe/probe

	This command controls run-time probing of language
	processor wrappers.  The C language probe info for make
	is placed in $INSTALLROOT/lib/probe/C/make/<HHHHHHHHpppppp>
	where HHHHHHHH is the hex value for a 32-bit hash on
	the processor path name and pppppp is the last 6 chars
	of the path name, / deleted, . filled on the left
	(the names are generated by the libx routine pathkey()).
	`preroot' and `universe' are included in the key
	generation.  probe is set-uid, allowing the info to be
	generated once per machine and shared among all users.
	The C/make probe info includes the default #include and
	-l file directories and the options to override the
	default preprocessor.  The C preprocessor probe info is
	in C/pp and replaces <ppdefault.h>.  A probe will be done
	only if the probe info doesn't already exist, so corrections
	made (with appropriate privelege) will no be overwritten.

$INSTALLROOT/bin/ccc

	A generic C compiler control wrapper.  nmake uses the
	default pass definitions to override the native C
	preprocessor for compilers that don't have override options.
	The new cpp is needed to properly handle #include file
	binding.  You can override makerules (and get the native
	preprocessor) by setting the nmake variable `nativepp=1'.
	`nativepp=-1' eliminates the warning message.
	$INSTALLROOT/lib/ccc contains pass definitions that emulate
	some common C compiler wrappers.  ccc is slower than
	the C-coded counterparts, but generating a new wrapper is
	much easier with ccc.

makefile type check

	The makefile parser detects some oldmake constructs and
	automatically execs $(OLDMAKE) when found in an input
	makefile.  OLDMAKE=/bin/make is the default.  You can force
	oldmake makefiles by placing a `# ...' comment in column 1
	on the first makefile line (no cpp directives!) or to nmake
	by placing a `/* ...' comment in column 1 on the first
	makefile line.

metarule transitive closure and multiple targets

	A transitive closure is finally being done on the
	`%.x : %.y' metarules.  This gets rid of the old
	.INTERMEDIATE hack and the short-lived
	`%.x : %.y : %.z' syntax.  This means that the
	intermediate files are automatically inferred
	from the metarule assertions.  Along with this
	change the LHS of metarule assertions may contain
	additional patterns to specify files jointly
	generated by the metarule action, e.g., the
	yacc metarule assertion (simplified) is:

		%.c %.h : %.y
			... stuff ...

	The first LHS pattern is the primary pattern and must
	be generated.  The other LHS patterns are secondary
	and may or may not be generated by the action.

Glenn Fowler
gsf@research.att.com
