Bump to 4.4
[platform/upstream/make.git] / README.W32
index 60025d0..7802b73 100644 (file)
@@ -1,34 +1,46 @@
-This version of GNU make has been tested on Microsoft Windows 2000/XP/2003.
+This version of GNU Make has been tested on:
+  Microsoft Windows 2000/XP/2003/Vista/7/8/10
 It has also been used on Windows 95/98/NT, and on OS/2.
 
-It builds with the MinGW port of GCC (tested with GCC 3.4.2).
+It builds with the MinGW port of GCC (tested with GCC 3.4.2, 4.8.1,
+and 4.9.3).
 
-It also builds with MSVC 2.x, 4.x, 5.x, 6.x, and 2003 as well as
-with .NET 7.x and .NET 2003.
+It also builds with MSVC 2.x, 4.x, 5.x, 6.x, 2005, 2008, 2010, 2012,
+2013, and 2015 as well as with .NET 7.x and .NET 2003.
 
-The Windows 32-bit port of GNU make is maintained jointly by various
-people.  It was originally made by Rob Tulloh.
+Building with Guile is supported (tested with Guile 2.0.x).  To build
+with Guile, you will need, in addition to Guile itself, its dependency
+libraries and the pkg-config program.  The latter is used to figure out
+which compilation and link switches and libraries need to be mentioned
+on the compiler command lines to correctly link with Guile.  A Windows
+port of pkg-config can be found on ezwinports site:
 
+  https://sourceforge.net/projects/ezwinports/
 
-Do this first, regardless of the build method you choose:
----------------------------------------------------------
-
- 1. At the Windows command prompt run:
+The libraries on which Guile depends can vary depending on your
+version and build of Guile.  At the very least, the Boehm's GC library
+will be needed, and typically also GNU MP, libffi, libunistring, and
+libtool's libltdl.  Whoever built the port of Guile you have should
+also provide you with these dependencies or a URL where to download
+them.  A precompiled 32-bit Windows build of Guile is available from
+the ezwinports site mentioned above.
 
-      if not exist NMakefile copy NMakefile.template NMakefile
-      if not exist config.h copy config.h.W32 config.h
+The Windows port of GNU Make is maintained jointly by various people.
+It was originally made by Rob Tulloh.
+It is currently maintained by Eli Zaretskii.
 
-    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').
 
+Do this first, regardless of the build method you choose:
+---------------------------------------------------------
 
-Using make_msvc_net2003.vcproj
-------------------------------
+ 1. If you have special requirements, edit config.h.W32 to your liking
+    (especially the shell-related defines, or HAVE_CASE_INSENSITIVE_FS which
+    corresponds to './configure --enable-case-insensitive-file-system').  We
+    don't recommend to define HAVE_CASE_INSENSITIVE_FS, but you may wish to
+    consider that if you have a lot of files whose names are in upper case,
+    while Makefile rules are written for lower-case versions.
 
- 2. Open make_msvc_net2003.vcproj in MSVS71 or MSVC71 or any compatible IDE,
-    then build this project as usual.  There's also a solution file for
-    Studio 2003.
+    If you don't have special requirements no changes are needed.
 
 
 Building with (MinGW-)GCC using build_w32.bat
@@ -37,243 +49,305 @@ 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
+        .\build_w32.bat gcc
+
+    This produces gnumake.exe in the GccRel directory.
+
+    If you want a version of GNU Make built with debugging enabled,
+    add the --debug option.  Output goes into the GccDebug directory.
+
+    The batch file will probe for Guile installation, and will build
+    gnumake.exe with Guile if it finds it.  If you have Guile
+    installed, but want to build Make without Guile support, type
+
+        .\build_w32.bat --without-guile gcc
+
+
+Building with (MSVC++-)cl using build_w32.bat
+---------------------------------------------
+
+ 2. Open a command shell, then execute ...
+
+        .\build_w32.bat
+
+    This produces a 64bit Release build of gnumake.exe in .\WinRel, using
+    the compiler found on the %Path%.  If no compiler is found, the batch
+    file will probe your system and choose the newest MSVC version it can
+    find.
+
+    If you want a 32bit version of GNU Make, add the --x86 option.
+
+    If you want a Debug build of GNU Make, add the --debug option.  Output
+    will go into the .\WinDebug directory.
+
+    The batch file will probe for Guile installation, and will build
+    gnumake.exe with Guile if it finds it.  If Guile is installed,
+    but you prefer to build GNU Make without Guile support, add the
+    --without-guile option.
+
 
-    This produces gnumake.exe in the current directory.
+Building with (MinGW-)GCC using GNU Make
+----------------------------------------
 
+ 2. If you already have a version of GNU Make available you can use it
+    to build this version.  Open a W32 command prompt for your installed
+    (MinGW-)GCC, setup a correct PATH and other environment variables
+    for it, then execute ...
 
-Building with (MSVC++-)cl using build_w32.bat or NMakefile
-----------------------------------------------------------
+        make -f Basic.mk TOOLCHAIN=gcc
 
- 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 ...
+    This produces GccRel\gnumake.exe.
+    If you want a version of GNU Make built with debugging enabled,
+    add the TARGET_TYPE=debug option:
 
-       build_w32.bat
+        make -f Basic.mk TOOLCHAIN=gcc TARGET_TYPE=debug
 
-    (this produces WinDebug/gnumake.exe and WinRel/gnumake.exe)
+    The makefile doesn't support Guile integration.  Use build_w32.bat
+    if you want to build with Guile support.
 
-    ... OR ...
 
-       nmake /f NMakefile
+Building with (MSVC++-)cl using GNU Make
+----------------------------------------
+
+ 2. If you already have a version of GNU Make available you can use it
+    to build this version.  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, or using a corresponding start menu entry from the
+    cl-installation), then execute ...
+
+        make -f Basic.mk
+
+    This produces an optimized WinRel/gnumake.exe.
+    If you want a version of GNU Make built with debugging enabled,
+    add the TARGET_TYPE=debug option:
+
+        make -f Basic.mk TARGET_TYPE=debug
+
+    The makefile doesn't support Guile integration.  Use build_w32.bat
+    if you want to build with Guile support.
+
+
+Running the test suite
+----------------------
+
+ 3. You will need an installation of Perl.  Be sure to use a relatively
+    modern version: older versions will sometimes throw spurious errors.
+
+    To run the suite after building using GNU Make, use:
+
+        make -f Basic.mk check
+
+    Alternatively if you'd like to run tests by hand, use:
+
+        cd tests
+        .\run_make_tests.bat -make <path-to-make>
+
+    I've found <path-to-make> seems to want forward-slashes in the path.
+    For example if building with .\build_w32.bat non-debug, use:
+
+        cd tests
+        .\run_make_tests.bat -make ../WinRel/gnumake.exe
+
+    I've tested this with the MSYS2 shell and POSIX tools installation
+    that you get by installing Git for Windows.
 
-    (this produces WinDebug/make.exe and WinRel/make.exe).
 
 
 -------------------
 -- Notes/Caveats --
 -------------------
 
-GNU make on Windows 32-bit platforms:
+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 2000, Windows XP,
-       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 Windows compiler.  Two compilers supported
-       officially are the MinGW port of GNU GCC, and the various
-       versions of the Microsoft C compiler.
+        This version of make is ported natively to Windows32 platforms
+        (Windows NT 3.51, Windows NT 4.0, Windows 2000, Windows XP,
+        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 Windows compiler.  Two compilers supported
+        officially are the MinGW port of GNU GCC, and the various
+        versions of the Microsoft C compiler.
 
-       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.
+        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:
+GNU Make and sh.exe:
 
-       This port prefers if 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).
+        This port prefers if 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
+        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 (https://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/).
+        (Consensys).  Also MinGW includes sh.
 
-GNU make and brain-dead shells (BATCH_MODE_ONLY_SHELL):
+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'.
+        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).
+        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%).  However, parallel
-       builds ARE supported with Windows shells (cmd.exe and
-       command.com).  See the next section about some peculiarities
-       of parallel builds on Windows.
+        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%).  However, parallel
+        builds ARE supported with Windows shells (cmd.exe and
+        command.com).  See the next section about some peculiarities
+        of parallel builds on Windows.
 
 Support for parallel builds
 
-       Parallel builds (-jN) are supported in this port, with 2
-       limitations:
-
-         - The number of concurrent processes has a hard limit of 64,
-            due to the way this port implements waiting for its
-            subprocesses;
-
-         - The job server method (available when Make runs on Posix
-            platforms) is not supported, which means you must pass an
-            explicit -jN switch to sub-Make's in a recursive Makefile.
-            If a sub-Make does not receive an explicit -jN switch, it
-            will default to -j1, i.e. no parallelism in sub-Make's.
-
-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.
+        Parallel builds (-jN) are supported in this port.  The number of
+        concurrent processes has a hard limit of 4095.
 
-GNU make and the MKS shell:
+GNU Make and Cygnus GNU Windows32 tools:
 
-       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.
+        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 handling of drive letters in pathnames (PATH, vpath, VPATH):
+GNU Make and the MKS shell:
 
-       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:/).
+        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.
 
-       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:
+GNU Make handling of drive letters in pathnames (PATH, vpath, VPATH):
 
-        a. Use semicolon as the separator to disambiguate colon. For
-           example use 'x;/' if you want to say 'x' and '/' are
-           separate components.
+        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:/).
 
-        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:
+        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:
 
-             ./x:./y
-             /some/path/x:/some/path/y
-             x:/some/path/x:x:/some/path/y
+         a. Use semicolon as the separator to disambiguate colon. For
+            example use 'x;/' if you want to say 'x' and '/' are
+            separate components.
 
-       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".
+         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:
 
-       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.
+              ./x:./y
+              /some/path/x:/some/path/y
+              x:/some/path/x:x:/some/path/y
 
-GNU make test suite:
+        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".
 
-       I verified all functionality with a slightly modified version
-       of make-test-3.82 (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.
+        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.
 
 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 valid on 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:
+        Unlike Unix, Windows 95/NT systems encourage pathnames which
+        contain white space (e.g. C:\Program Files\). These sorts of
+        pathnames are valid on 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.
+                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.
+        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").
+        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.
+        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:
+        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/Target:
+                touch $@
 
-       SUBDIR/DepTarget: SubDir/TARGET
-               cp $^ $@
+        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.
+        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.
+        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.
+        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.
+        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.
+        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.
+        Please submit bugs via the normal bug reporting mechanism which
+        is described in the GNU Make manual and the base README.
 \f
 -------------------------------------------------------------------------------
-Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
-2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+Copyright (C) 1996-2022 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
@@ -286,4 +360,4 @@ 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
-this program.  If not, see <http://www.gnu.org/licenses/>.
+this program.  If not, see <https://www.gnu.org/licenses/>.