dmake Version 3.6
=================

MANDATORY REPLACEMENT FOR VERSION 3.5 PATCH LEVEL 1 and PATCH LEVEL 2

Nature:   This version of dmake MUST replace all versions of dmake 3.5 patch
-------   levels 1 and 2, and all versions of dmake 3.5 patch level 1 and 2
	  must then be DELETED.  This release addresses several issues.

		1. Copyright infringement claim made by MKS, of Waterloo.
		2. Modifications to text diversion processing.
		3. Support for DOS Swapping, and MKS argument passing.
		4. Other minor nits and tweaks.

	  This distribution advances dmake to Version 3.6, patch level 1.  This
	  version is certified free of MKS copyrighted code.  See below for
	  details.
          
Availability:
-------------
	  dmake is available via anonymous ftp from watmsg.uwaterloo.edu
	  (129.97.129.9) as:

	     pub/src/dmake-3.6.tar.Z
	     pub/src/dmake-3.6.zoo 

	  and comes in either a compressed tar or zoo archive take your pick.

Acknowledgements:
-----------------
	  Thanks to all who submitted code for new features, suggestions for
	  improvements, and bug fixes.  Special thanks to those who helped
	  test this version of dmake on the many platforms that the
	  distribution now supports.  I have tried to make sure no gotchas
	  remain, if you encounter problems installing or running dmake please
	  let me know.  As always, I am always happy to receive e-mail.


DETAILS OF CHANGES:
===================

MKS Copyright Infringement:
---------------------------
   Due to a misunderstanding over past contractual obligations between
   myself and Mortice Kern Systems of Waterloo, Ontario, Canada (MKS),
   the original posting of dmake unitentionally contains some code
   derived from MKS proprietary code.

   This version rectifies that situation and MUST replace all versions
   of DMAKE and DMAKE patches that have been previously distributed.
   Please delete from any archive site versions of DMAKE source code
   labeled 3.5 patch level 1 or patch level 2 and dmake 3.5 patch 1.

   Version 3.6 of the dmake source replaces *ALL* MKS proprietary code.
   In particular, putenv.c in the bsd43 and sysvr1 directories is new.
   Three routines in percent.c;  Add_dfa, Construct_dfa, and Advance_dfa
   have been replaced.  Lastly, TEXT DIVERSION processing has been removed
   from make.c and <+...+> constructions are replaced by the $(mktmp ...)
   construct (see below for more details).  The changes relating to the
   above mentioned modifications have been reviewed by MKS and certified by
   MKS to be free of MKS proprietary code.  The note below is from MKS
   and releases dmake version 3.6 patch level 1 from any MKS copyright
   infringement claims.

	"MKS has reviewed the latest sources, as of 90.09.20,
	 for the files make.c, putenv.c, and percent.c, which
	 are part of the program dmake version 3.6, and found
	 these files to be free of MKS proprietary source code."

   No functionality is lost as a result of these changes, however
   certain constructs may have to be expressed using a new syntax.  See
   the documentation and the comments below for details.


Text Diversion Processing:
--------------------------
   As alluded to above, the <+...+> text diversion facility has been
   officially replaced by a new facility of the form $(mktmp ...) details of
   which may be found in the TEXT DIVERSION section of the documentation.
   Briefly, the construct:

        exe:; link @<+$(OBJFILES:t"+\n")+>

   is replaced by:

        exe:; link @$(mktmp $(OBJFILES:t"+\n"))

   similarly the construct:

        all :
                echo hi <+
                line1
                line2 +>

   is replaced by:

        all :
                echo hi $(mktmp\
                line1\n\
                line2)

   where the \n\ is added to the end of each line within the data portion of
   the $(mktmp ...) construction.  For a number of reasons it is my belief
   that this new construct is a better implementation of text diversions than
   the previous <+...+> as it can be used in macro expressions that appear
   anywhere in the makefile.

   Compatibility is retained for previous versions of dmake that utilize
   a simple form of the <+...+> construct.  If your <+...+> constructs do not
   span multiple lines (cf second example above), then the new version of
   dmke will recognize these and will map them to the appropriate
   $(mktmp ...) construct.  Thus, If you use <+...+> and you do not allow the
   interior data to span multiple lines and both <+ and +> appear as clear
   text in the same recipe line or macro value, then dmake will process these
   correctly and the output is 100% compatible to version 3.5 patch level 2.
   Any other use of <+...+> must be converted to the new $(mktmp ...) form.

   The new form also provides for massaging the name of the temporary file
   which replaces the text in the recipe.  See the documentation regarding
   the special macros USESHELL, TMPFILE, and DIVSHELL.  This is of most use
   in an MSDOS environment.


DOS Swapping, and MKS argument passing:
---------------------------------------
   dmake now supports swapping the executable image to secondary storage when
   it executes a child.  Swapping is enabled by setting the new attribute
   .SWAP to on, either for a target or globally, or by specifying the '%'
   modifier to a recipe line.  So for example:

	xx .SWAP :; recipe

   and

	xx :;% recipe

   are equivalent.

   The MKS DOS argument passing conventions are now supported, and dmake is
   able to communicate with programs that understand those conventions.  The
   global variable .MKSARGS is used to enable/disable this facility.  With
   these modifications, dmake now supports long command lines for running
   commands that understand the MKS argument passing convention, and it does
   not run into memory limitations when executing child processes in most
   situations.

   Both .SWAP and .MKSARGS are ignored by non-MSDOS versions of dmake.
   See the manual page for further details.


Other tweaks modifications and BUG FIXES:
-----------------------------------------
-- Slight modifications to msdos/startup.mk files.  Set DIRSEPSTR to \
   if using command.com as the shell, otherwise set internaly to /.
   Removed -o $@ from MSC startup.mk, and added $(ASFLAGS) to %$O : %$S
   rule, in all default DOS startup.mk files.

-- Added POSIX '+' character to start of recipe lines.  You can use this
   to force the recipe line to be executed by a shell, in addition to the
   test used for .SHELLMETAS.

   To make the '+' fit into the dmake mold, a new attribute has been created.
   the .USESHELL attribute forces the use of a shell for the target or
   recipe group for which it is specified.  If it is specified as a global
   attribute then all recipes executed will use a shell.  The macro variable
   .USESHELL corresponds to the special target '.USESHELL :' in the same way
   that .IGNORE corresponds to '.IGNORE :'.

-- Added *= and *:= macro assignmen operator, patches from 
   Piercarlo Grandi <pcg@compsci.aberystwyth.ac.uk>, see the documentation
   for more details.

-- Changed makefile.mk to force use of a shell (via '+') to make OBJDIR,
   doesn't break on baren DOS systems that way :-).  Many other small changes
   to msdos and unix versions of various config.mk files.

-- Added two new macros related to diversion file processing.
   See the TEXT DIVERSIONS section of the man page for an explanation of this
   functionality.

        TMPFILE - is set to the name of the temporary file whenever
                  a temporary file is opened by dmake.
        USESHELL- It's value is 'no' if the current recipe line is not forced
		  to use a shell via a '+' or .USESHELL directive.  It's
		  value is 'yes' if such a directive is given.
	DIVFILE - is defined in startup.mk and gives a macro to use to set
		  name of the diversion file, (under UNIX, DIVFILE defaults to
		  $(TMPFILE), under MSDOS it is the value of $(TMPFILE) with
		  any / replaced by the appropriate number of \ depending, on
		  if a shell is used or not).

-- \\ appearing at the end of a line does not cause a continuation to the next
   line.

-- Modified the definition of macro supplied from the command line to allow
   macros defined using += or +:= to be modified further from within the
   makefile.

-- Added MAKETARGETS macro which contains the name of the target(s), if any,
   specified on the command line.

-- Modified Pack_argv in sysintf.c to use dynamic memory allocation rather
   than limit it to a fixed number of arguments.

-- BIG BUG FIX:
   This one is cute.  It turns out that all individual recipe line
   attributes supplied via '@', '-', and now '+' and '%' characters were
   getting or'ed together and applied to ALL recipe lines of the recipe, yulk!

-- BUG FIX:
   Fixed off by one error in make.c:_print_cmnd when remapping \n after
   printing the text.

-- BUG FIX:  Bug reported by holos0!lbr@gatech.edu
   Inferred prerequisites were not getting made when a target was found to
   be out of date relative to a non-inferred prerequisite, and the inferred
   prerequisite did not exist but the file it could be made from did and was
   not out of date relative to the target.  This was a problem with the
   following setup.

        file.o : header.h

   File system contains file.o, header.h and RCS/file.c,v, If file.o is newer
   than RCS/file.c,v and older than header.h, then dmake didn't check out
   file.c prior to doing the compile.

-- BUG FIX: Applied patch from UUCP: twc@legal or ...sun!ys2!legal!twc
   to msdos/_chdir.c to fix changing of directory in OS/2 protected mode

-- BUG FIX: Applied patch from UUCP: twc@legal or ...sun!ys2!legal!twc
   to msdos/switchar.c to read environment variable SWITCHAR instead of using
   unsupported call in DOS.  OS/2 doesn't have _get_switchar call!  (It damn
   well should though!  Microsoft is really dumb in this respect!)

   Extended this patch to use SWITCHAR environment variable in all DOS
   versions.  This ensures that DOS 4.0 can selectively change SWITCHAR by
   using the environment variable.

   Dmake now first gets SWITCHAR from the environment and if that fails it
   tries the unsupported MSDOS call.  Under UNIX getswitchar returns '-'
   as before.

-- BUG FIX: Changed the line _ar.ar_size = atol(arhdr.ar_size) found in
   ar_scan() in arlib.c to not use atol() if ASCARCH is FALSE.  I forget who
   reported this one :-)
