This directory contains the @PACKAGE_VERSION@ release of @PACKAGE_NAME@.

See the file NEWS for the user-visible changes from previous releases.
In addition, there have been bugs fixed.

>> If you are trying to build GNU Make from a Git clone rather than a
>> downloaded source distribution, see the README.git file for instructions.

Please check the system-specific notes below for any caveats related to your
operating system.

This README assumes you are building on a POSIX-based operating system.
For ports to other operating systems please see the system-specific README
files, as described in the "Ports" section below.

For source distribution building and installation instructions, see the file
INSTALL.

If you need to build GNU Make and have no other 'make' program to use, you can
use the shell script 'build.sh' instead.  To do this, first run 'configure' as
described in INSTALL.  Then, instead of typing 'make' to build the program,
type 'sh build.sh'.  This will compile the program in the current directory.
Then you will have a 'make' program that you can use for './make install', or
whatever else.

Some systems' 'make' programs cannot process the Makefile for GNU Make.
If you get errors from your system's 'make' when building GNU Make, try using
'build.sh' instead.


GNU Make is free software.  See the file COPYING for copying conditions.
GNU Make is copyright by the Free Software Foundation.  Copyright notices
condense sequential years into a range; e.g. "1987-1994" means all years
from 1987 to 1994 inclusive.


Downloading
-----------

GNU Make can be obtained in many different ways.  See a description here:

  https://www.gnu.org/software/software.html


Documentation
-------------

GNU Make is fully documented in the GNU Make manual, which is contained in
this distribution as the file make.texi.  You can also find on-line and
preformatted (PostScript and DVI) versions at the FSF's web site.  There is
information there about ordering hardcopy documentation.

  https://www.gnu.org/
  https://www.gnu.org/doc/doc.html
  https://www.gnu.org/manual/manual.html


Development
-----------

GNU Make development is hosted by Savannah, the FSF's online development
management tool.  Savannah is here:

  https://savannah.gnu.org

And the GNU Make development page is here:

  https://savannah.gnu.org/projects/make/

You can find most information concerning the development of GNU Make at
this site.


Regression Tests
----------------

GNU Make contains a suite of regression tests.  To run them use "make check"
after building GNU Make.  If they fail a tar package will be created
containing useful information, which can be emailed (as an attachment) to
the <bug-make@gnu.org> mailing list.

Please note that since these tests rely on known-good-output comparisons,
they can show spurious failures on some systems (particularly non-POSIX systems
such as Windows).


Bug Reporting
-------------

If you need help using GNU Make, try asking on <help-make@gnu.org>.

If you found a bug, you can send a bug reports to <bug-make@gnu.org>.
Please see the section of the GNU Make manual entitled 'Problems and Bugs'
for information on submitting useful and complete bug reports.

You do not need to subscribe to these lists first.

You can also use the online bug tracking system in the Savannah GNU Make
project to submit new problem reports or search for existing ones:

  https://savannah.gnu.org/bugs/?group=make

We prefer to use the bug tracking system ONLY for bugs or enhancements,
not for help requests: please use the mailing lists to get help.


Submitting Patches
------------------

If you'd like to propose a change to GNU Make, you can provide a patch with
your changes.  If you are making your changes in a Git workspace you can run
"git format-patch" to create a patch file.  If not, you can use the diff(1)
utility to create a patch file; please use "diff -u".

Once you have a patch you can submit it in any of these ways:

  * Create a bug on Savannah and add the patch as an attachment:
      https://savannah.gnu.org/bugs/?group=make&func=additem

  * Send the patch via email to <bug-make@gnu.org>: be sure to add it as an
    attachment to avoid interference by email processors.

All non-trivial changes require FSF copyright paperwork to be completed
before they can be accepted.  Contact <bug-make@gnu.org> for help.


Git Access
----------

The GNU Make source repository is available via Git from the GNU Savannah Git
server; look here for details:

  https://savannah.gnu.org/git/?group=make

Please note: you won't be able to build GNU Make from Git without installing
appropriate maintainer's tools, such as GNU m4, automake, autoconf, Perl, GNU
make, and GCC.

See the README.git file for instructions on how to build GNU Make once these
tools are available.  We make no guarantees about the contents or quality of
the latest code in the Git repository: it is not unheard of for code that is
known to be broken to be checked in.  Use at your own risk.


System-specific Notes
---------------------

One area that is often a problem in configuration and porting is the code
to check the system's current load average.  To make it easier to test and
debug this code, you can do 'make check-loadavg' to see if it works
properly on your system.  (You must run 'configure' beforehand, but you
need not build 'make' itself to run this test.)

Another potential source of porting problems is the support for large
files (LFS) in configure for those operating systems that provide it.
Please report any bugs that you find in this area.  If you run into
difficulties, then as a workaround you should be able to disable LFS by
adding the '--disable-largefile' option to the 'configure' script.

On systems that support micro- and nano-second timestamp values and
where stat(2) provides this information, GNU Make will use it when
comparing timestamps to get the most accurate possible result.  However,
note that many current implementations of tools that *set* timestamps do
not preserve micro- or nano-second granularity.  This means that "cp -p"
and other similar tools (tar, etc.) may not exactly duplicate timestamps
with micro- and nano-second granularity on some systems.  If your build
system contains rules that depend on proper behavior of tools like "cp
-p", you should consider using the .LOW_RESOLUTION_TIME pseudo-target to
force make to treat them properly.  See the manual for details.


Ports
-----

  - See README.customs for details on integrating GNU Make with the
    Customs distributed build environment from the Pmake distribution.

  - See README.VMS for details about GNU Make on OpenVMS.

  - See README.zOS for details about GNU Make on z/OS.

  - See README.W32 for details about GNU Make on Windows NT, 95, or 98.

  - See README.DOS for compilation instructions on MS-DOS and MS-Windows
    using DJGPP tools.

    A precompiled binary of the MSDOS port of GNU Make is available as part
    of DJGPP; see the WWW page https://www.delorie.com/djgpp/ for more
    information.

    The Cygwin project maintains its own port of GNU Make.  That port may have
    patches which are not present in this version.  If you are using Cygwin
    you should use their version of GNU Make, and if you have questions about
    it you should start by asking on those mailing lists and forums.

Please note there are two _separate_ ports of GNU Make for Microsoft
systems: a native Windows port built with (for example) MSVC or MinGW,
and a DOS-based port built with DJGPP.  Please be sure you are looking
at the right README!


-------------------------------------------------------------------------------
Copyright (C) 1988-2024 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 3 of the License, 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
this program.  If not, see <https://www.gnu.org/licenses/>.
