This version of GNU make has been tested on Microsoft Windows 2000/XP/2003.
It has also been used on Windows 95/98/NT, and on OS/2.

It builds natively with MSVC 2.x, 4.x, 5.x, 6.x, and 2003 as well as
.NET 7.x and .NET 2003.

It builds with the MinGW port of GCC 3.x (tested with GCC 3.4.2).

The Windows 32-bit port of GNU make is maintained jointly by various
people.  It was originally made by Rob Tulloh.


Do this first, regardless of the build method you choose:
---------------------------------------------------------

 1. At the Windows command prompt run:

      if not exist NMakefile copy NMakefile.template NMakefile
      if not exist config.h copy config.h.W32 config.h

    Then edit config.h to your liking (especially the few shell-related
    defines near the end, or HAVE_CASE_INSENSITIVE_FS which corresponds
    to './configure --enable-case-insensitive-file-system').


Using make_msvc_net2003.vcproj
------------------------------

 2. Open make_msvc_net2003.vcproj in MSVS71 or MSVC71 or any compatible IDE,
    then build this project as usual.


Building with (MinGW-)GCC using build_w32.bat
---------------------------------------------

 2. Open a W32 command prompt for your installed (MinGW-)GCC, setup a
    correct PATH and other environment variables for it, then execute ...

	build_w32.bat gcc

    This produces gnumake.exe in the current directory.


Building with (MSVC++-)cl using build_w32.bat or NMakefile
----------------------------------------------------------

 2. Open a W32 command prompt for your installed (MSVC++-)cl, setup a
    correct PATH and other environment variables for it (usually via
    executing vcvars32.bat or vsvars32.bat from the cl-installation,
    e.g. "%VS71COMNTOOLS%vsvars32.bat"; or using a corresponding start
    menue entry from the cl-installation), then execute EITHER ...

	build_w32.bat

    (this produces WinDebug/gnumake.exe and WinRel/gnumake.exe)

    ... OR ...

	nmake /f NMakefile

    (this produces WinDebug/make.exe and WinRel/make.exe).


-------------------
-- Notes/Caveats --
-------------------

GNU make on Windows 32-bit platforms:

	This version of make is ported natively to Windows32 platforms
	(Windows NT 3.51, Windows NT 4.0, Windows 95, and Windows 98). It
	does not rely on any 3rd party software or add-on packages for
	building. The only thing needed is a version of Visual C++,
	which is the predominant compiler used on Windows32 platforms.

	Do not confuse this port of GNU make with other Windows32 projects
	which provide a GNU make binary. These are separate projects
	and are not connected to this port effort.

GNU make and sh.exe:

	This port prefers you have a working sh.exe somewhere on your
	system. If you don't have sh.exe, the port falls back to
	MSDOS mode for launching programs (via a batch file).
	The MSDOS mode style execution has not been tested that
	carefully though (The author uses GNU bash as sh.exe).

	There are very few true ports of Bourne shell for NT right now.
	There is a version of GNU bash available from Cygnus "Cygwin"
	porting effort (http://www.cygwin.com/).
	Other possibilities are the MKS version of sh.exe, or building
        your own with a package like NutCracker (DataFocus) or Portage
        (Consensys).  Also MinGW includes sh (http://mingw.org/).

GNU make and brain-dead shells (BATCH_MODE_ONLY_SHELL):

	Some versions of Bourne shell do not behave well when invoked
	as 'sh -c' from CreateProcess().  The main problem is they seem
	to have a hard time handling quoted strings correctly. This can
	be circumvented by writing commands to be executed to a batch
	file and then executing the command by calling 'sh file'.

	To work around this difficulty, this version of make supports
	a batch mode.  When BATCH_MODE_ONLY_SHELL is defined at compile
	time, make forces all command lines to be executed via script
	files instead of by command line.  In this mode you must have a
	working sh.exe in order to use parallel builds (-j).

	A native Windows32 system with no Bourne shell will also run
	in batch mode.  All command lines will be put into batch files
	and executed via $(COMSPEC) (%COMSPEC%).  Note that parallel
        builds (-j) require a working Bourne shell; they will not work
        with COM.

GNU make and Cygnus GNU Windows32 tools:

	Good news! Make now has native support for Cygwin sh. To enable,
	define the HAVE_CYGWIN_SHELL in config.h and rebuild make
	from scratch. This version of make tested with B20.1 of Cygwin.
	Do not define BATCH_MODE_ONLY_SHELL if you use HAVE_CYGWIN_SHELL.

GNU make and the MKS shell:

	There is now semi-official support for the MKS shell. To turn this
	support on, define HAVE_MKS_SHELL in the config.h.W32 before you
	build make.  Do not define BATCH_MODE_ONLY_SHELL if you turn
	on HAVE_MKS_SHELL.

GNU make handling of drive letters in pathnames (PATH, vpath, VPATH):

	There is a caveat that should be noted with respect to handling
	single character pathnames on Windows systems.	When colon is
	used in PATH variables, make tries to be smart about knowing when
	you are using colon as a separator versus colon as a drive
	letter.	 Unfortunately, something as simple as the string 'x:/'
	could be interpreted 2 ways: (x and /) or (x:/).

	Make chooses to interpret a letter plus colon (e.g. x:/) as a
	drive letter pathname.	If it is necessary to use single
	character directories in paths (VPATH, vpath, Path, PATH), the
	user must do one of two things:

	 a. Use semicolon as the separator to disambiguate colon. For
	    example use 'x;/' if you want to say 'x' and '/' are
	    separate components.

	 b. Qualify the directory name so that there is more than
	    one character in the path(s) used. For example, none
	    of these settings are ambiguous:

	      ./x:./y
	      /some/path/x:/some/path/y
	      x:/some/path/x:x:/some/path/y

	Please note that you are free to mix colon and semi-colon in the
	specification of paths.	 Make is able to figure out the intended
	result and convert the paths internally to the format needed
	when interacting with the operating system, providing the path
	is not within quotes, e.g. "x:/test/test.c".

	You are encouraged to use colon as the separator character.
	This should ease the pain of deciding how to handle various path
	problems which exist between platforms.	 If colon is used on
	both Unix and Windows systems, then no ifdef'ing will be
	necessary in the makefile source.

GNU make test suite:

	I verified all functionality with a slightly modified version
	of make-test-3.81 (modifications to get test suite to run
	on Windows NT). All tests pass in an environment that includes
	sh.exe.  Tests were performed on both Windows NT and Windows 95.

Building GNU make on Windows NT and Windows 95/98 with Microsoft Visual C:

	I did not provide a Visual C project file with this port as
	the project file would not be considered freely distributable
	(or so I think). It is easy enough to create one, though, if
	you know how to use Visual C.

	I build the program statically to avoid problems locating DLL's
	on machines that may not have MSVC runtime installed. If you
	prefer, you can change make to build with shared libraries by
	changing /MT to /MD in the NMakefile (or in build_w32.bat).

	The program has not been built for non-Intel architectures (yet).

	I have not tried to build with any other compilers than MSVC. I
	have heard that this is possible though so don't be afraid to
	notify me of your successes!

Pathnames and white space:

	Unlike Unix, Windows 95/NT systems encourage pathnames which
	contain white space (e.g. C:\Program Files\). These sorts of
	pathnames are legal under Unix too, but are never encouraged.
	There is at least one place in make (VPATH/vpath handling) where
	paths containing white space will simply not work. There may be
	others too. I chose to not try and port make in such a way so
	that these sorts of paths could be handled. I offer these
	suggestions as workarounds:

		1. Use 8.3 notation. i.e. "x:/long~1/", which is actually
		   "x:\longpathtest".  Type "dir /x" to view these filenames
		   within the cmd.exe shell.
		2. Rename the directory so it does not contain white space.

	If you are unhappy with this choice, this is free software
	and you are free to take a crack at making this work. The code
	in w32/pathstuff.c and vpath.c would be the places to start.

Pathnames and Case insensitivity:

	Unlike Unix, Windows 95/NT systems are case insensitive but case
	preserving.  For example if you tell the file system to create a
	file named "Target", it will preserve the case.  Subsequent access to
	the file with other case permutations will succeed (i.e. opening a
	file named "target" or "TARGET" will open the file "Target").

	By default, GNU make retains its case sensitivity when comparing
	target names and existing files or directories.  It can be
	configured, however, into a case preserving and case insensitive
	mode by adding a define for HAVE_CASE_INSENSITIVE_FS to
	config.h.W32.

	For example, the following makefile will create a file named
	Target in the directory subdir which will subsequently be used
	to satisfy the dependency of SUBDIR/DepTarget on SubDir/TARGET.
	Without HAVE_CASE_INSENSITIVE_FS configured, the dependency link
	will not be made:

	subdir/Target:
		touch $@

	SUBDIR/DepTarget: SubDir/TARGET
		cp $^ $@

	Reliance on this behavior also eliminates the ability of GNU make
	to use case in comparison of matching rules.  For example, it is
	not possible to set up a C++ rule using %.C that is different
	than a C rule using %.c.  GNU make will consider these to be the
	same rule and will issue a warning.

SAMBA/NTFS/VFAT:

	I have not had any success building the debug version of this
	package using SAMBA as my file server. The reason seems to be
	related to the way VC++ 4.0 changes the case name of the pdb
	filename it is passed on the command line. It seems to change
	the name always to to lower case. I contend that the VC++
	compiler should not change the casename of files that are passed
	as arguments on the command line. I don't think this was a
	problem in MSVC 2.x, but I know it is a problem in MSVC 4.x.

	The package builds fine on VFAT and NTFS filesystems.

	Most all of the development I have done to date has been using
	NTFS and long file names. I have not done any considerable work
	under VFAT. VFAT users may wish to be aware that this port of
	make does respect case sensitivity.

FAT:

	Version 3.76 added support for FAT filesystems. Make works
	around some difficulties with stat'ing of files and caching of
	filenames and directories internally.

Bug reports:

	Please submit bugs via the normal bug reporting mechanism which
	is described in the GNU make manual and the base README.

-------------------------------------------------------------------------------
Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
2006 Free Software Foundation, Inc.
This file is part of GNU Make.

GNU Make is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation; either version 2, or (at your option) any later version.

GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.  See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with
GNU Make; see the file COPYING.  If not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
