-GNU make NEWS -*-indented-text-*-
+GNU Make NEWS -*-indented-text-*-
History of user-visible changes.
- 22 May 2016
+ 31 October 2022
See the end of this file for copyrights and conditions.
-All changes mentioned here are more fully described in the GNU make
-manual, which is contained in this distribution as the file doc/make.texi.
-See the README file and the GNU make manual for instructions for
+All user-visible changes are more fully described in the GNU Make manual,
+which is contained in this distribution as the file doc/make.texi.
+See the README file and the GNU Make manual for instructions for
reporting bugs.
\f
+Version 4.4 (31 Oct 2022)
+
+A complete list of bugs fixed in this version is available here:
+
+https://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=109&set=custom
+
+* WARNING: Deprecation!
+ The following systems are deprecated in this release:
+ - OS/2 (EMX)
+ - AmigaOS
+ - Xenix
+ - Cray
+ In the NEXT release of GNU Make, support for these systems will be removed.
+ If you want to see them continue to be supported, contact <bug-make@gnu.org>.
+
+* WARNING: Future backward-incompatibility!
+ In the NEXT release of GNU Make, pattern rules will implement the same
+ behavior change for multiple targets as explicit grouped targets, below: if
+ any target of the rule is needed by the build, the recipe will be invoked if
+ any target of the rule is missing or out of date. During testing some
+ makefiles were found to contain pattern rules that do not build all targets;
+ this can cause issues so we are delaying this change for one release cycle
+ to allow these makefiles to be updated. GNU Make shows a warning if it
+ detects this situation: "pattern recipe did not update peer target".
+
+* WARNING: Backward-incompatibility!
+ GNU Make now uses temporary files in more situations than previous releases.
+ If your build system sets TMPDIR (or TMP or TEMP on Windows) and deletes the
+ contents during the build, or uses restrictive permissions, this may cause
+ problems. You can choose an alternative temporary directory only for use by
+ GNU Make by setting the new MAKE_TMPDIR environment variable before invoking
+ make. Note that this value CANNOT be set inside the makefile, since make
+ needs to find its temporary directory before the makefiles are parsed.
+
+* WARNING: Backward-incompatibility!
+ Previously each target in a explicit grouped target rule was considered
+ individually: if the targets needed by the build were not out of date the
+ recipe was not run even if other targets in the group were out of date. Now
+ if any of the grouped targets are needed by the build, then if any of the
+ grouped targets are out of date the recipe is run and all targets in the
+ group are considered updated.
+
+* WARNING: Backward-incompatibility!
+ Previously if --no-print-directory was seen anywhere in the environment or
+ command line it would take precedence over any --print-directory. Now, the
+ last setting of directory printing options seen will be used, so a command
+ line such as "--no-print-directory -w" _will_ show directory entry/exits.
+
+* WARNING: Backward-incompatibility!
+ Previously the order in which makefiles were remade was not explicitly
+ stated, but it was (roughly) the inverse of the order in which they were
+ processed by make. In this release, the order in which makefiles are
+ rebuilt is the same order in which make processed them, and this is defined
+ to be true in the GNU Make manual.
+
+* WARNING: Backward-incompatibility!
+ Previously only simple (one-letter) options were added to the MAKEFLAGS
+ variable that was visible while parsing makefiles. Now, all options are
+ available in MAKEFLAGS. If you want to check MAKEFLAGS for a one-letter
+ option, expanding "$(firstword -$(MAKEFLAGS))" is a reliable way to return
+ the set of one-letter options which can be examined via findstring, etc.
+
+* WARNING: Backward-incompatibility!
+ Previously makefile variables marked as export were not exported to commands
+ started by the $(shell ...) function. Now, all exported variables are
+ exported to $(shell ...). If this leads to recursion during expansion, then
+ for backward-compatibility the value from the original environment is used.
+ To detect this change search for 'shell-export' in the .FEATURES variable.
+
+* WARNING: New build requirement
+ GNU Make utilizes facilities from GNU Gnulib: Gnulib requires certain C99
+ features in the C compiler and so these features are required by GNU Make:
+ https://www.gnu.org/software/gnulib/manual/html_node/C99-features-assumed.html
+ The configure script should verify the compiler has these features.
+
+* New feature: The .WAIT special target
+ If the .WAIT target appears between two prerequisites of a target, then
+ GNU Make will wait for all of the targets to the left of .WAIT in the list
+ to complete before starting any of the targets to the right of .WAIT.
+ This feature is available in some other versions of make, and it will be
+ required by an upcoming version of the POSIX standard for make.
+ Different patches were made by Alexey Neyman <alex.neyman@auriga.ru> (2005)
+ and Steffen Nurpmeso <steffen@sdaoden.eu> (2020) that were useful but the
+ result is a different implementation (closer to Alexey's idea).
+
+* New feature: .NOTPARALLEL accepts prerequisites
+ If the .NOTPARALLEL special target has prerequisites then all prerequisites
+ of those targets will be run serially (as if .WAIT was specified between
+ each prerequisite).
+
+* New feature: The .NOTINTERMEDIATE special target
+ .NOTINTERMEDIATE disables intermediate behavior for specific files, for all
+ files built using a pattern, or for the entire makefile.
+ Implementation provided by Dmitry Goncharov <dgoncharov@users.sf.net>
+
+* New feature: The $(let ...) function
+ This function allows user-defined functions to define a set of local
+ variables: values can be assigned to these variables from within the
+ user-defined function and they will not impact global variable assignments.
+ Implementation provided by Jouke Witteveen <j.witteveen@gmail.com>
+
+* New feature: The $(intcmp ...) function
+ This function allows conditional evaluation controlled by a numerical
+ comparison.
+ Implementation provided by Jouke Witteveen <j.witteveen@gmail.com>
+
+* New feature: Improved support for -l / --load-average
+ On systems that provide /proc/loadavg (Linux), GNU Make will use it to
+ determine the number of runnable jobs and use this as the current load,
+ avoiding the need for heuristics.
+ Implementation provided by Sven C. Dack <sdack@gmx.com>
+
+* New feature: The --shuffle command line option
+ This option reorders goals and prerequisites to simulate non-determinism
+ that may be seen using parallel build. Shuffle mode allows a form of "fuzz
+ testing" of parallel builds to verify that all prerequisites are correctly
+ described in the makefile.
+ Implementation provided by Sergei Trofimovich <siarheit@google.com>
+
+* New feature: The --jobserver-style command line option and named pipes
+ A new jobserver method is used on systems where mkfifo(3) is supported.
+ This solves a number of obscure issues related to using the jobserver
+ and recursive invocations of GNU Make. This change means that sub-makes
+ will connect to the jobserver even if they are not marked as recursive.
+ It also means that other tools that want to participate in the jobserver
+ will need to be enhanced as described in the GNU Make manual.
+ You can force GNU Make to use the simple pipe-based jobserver (perhaps if
+ you are integrating with other tools or older versions of GNU Make) by
+ adding the '--jobserver-style=pipe' option to the command line of the
+ top-level invocation of GNU Make, or via MAKEFLAGS or GNUMAKEFLAGS.
+ To detect this change search for 'jobserver-fifo' in the .FEATURES variable.
+
+* Some POSIX systems (*BSD) do not allow locks to be taken on pipes, which
+ caused the output sync feature to not work properly there. Also multiple
+ invocations of make redirecting to the same output file (e.g., /dev/null)
+ would cause hangs. Instead of locking stdout (which does have some useful
+ performance characteristics, but is not portable) create a temporary file
+ and lock that. Windows continues to use a mutex as before.
+
+* GNU Make has sometimes chosen unexpected, and sub-optimal, chains of
+ implicit rules due to the definition of "ought to exist" in the implicit
+ rule search algorithm, which considered any prerequisite mentioned in the
+ makefile as "ought to exist". This algorithm has been modified to prefer
+ prerequisites mentioned explicitly in the target being built and only if
+ that results in no matching rule, will GNU Make consider prerequisites
+ mentioned in other targets as "ought to exist".
+ Implementation provided by Dmitry Goncharov <dgoncharov@users.sf.net>
+
+* GNU Make was performing secondary expansion of all targets, even targets
+ which didn't need to be considered during the build. In this release
+ only targets which are considered will be secondarily expanded.
+ Implementation provided by Dmitry Goncharov <dgoncharov@users.sf.net>
+
+* If the MAKEFLAGS variable is modified in a makefile, it will be re-parsed
+ immediately rather than after all makefiles have been read. Note that
+ although all options are parsed immediately, some special effects won't
+ appear until after all makefiles are read.
+
+* The -I option accepts an argument "-" (e.g., "-I-") which means "reset the
+ list of search directories to empty". Among other things this can be used
+ to prevent GNU Make from searching in its default list of directories.
+
+* New debug option "print" will show the recipe to be run, even when silent
+ mode is set, and new debug option "why" will show why a target is rebuilt
+ (which prerequisites caused the target to be considered out of date).
+ Implementation provided by David Boyce <David.S.Boyce@gmail.com>
+
+* The existing --trace option is made equivalent to --debug=print,why
+
+* Target-specific variables can now be marked "unexport".
+
+* Exporting / unexporting target-specific variables is handled correctly, so
+ that the attribute of the most specific variable setting is used.
+
+* Special targets like .POSIX are detected upon definition, ensuring that any
+ change in behavior takes effect immediately, before the next line is parsed.
+
+* When the pipe-based jobserver is enabled and GNU Make decides it is invoking
+ a non-make sub-process and closes the jobserver pipes, it will now add a new
+ option to the MAKEFLAGS environment variable that disables the jobserver.
+ This prevents sub-processes that invoke make from accidentally using other
+ open file descriptors as jobserver pipes. For more information see
+ https://savannah.gnu.org/bugs/?57242 and https://savannah.gnu.org/bugs/?62397
+
+* A long-standing issue with the directory cache has been resolved: changes
+ made as a side-effect of some other target's recipe are now noticed as
+ expected.
+
+* GNU Make can now be built for MS-Windows using the Tiny C tcc compiler.
+ Port provided by Christian Jullien <eligis@orange.fr>
+
+\f
+Version 4.3 (19 Jan 2020)
+
+A complete list of bugs fixed in this version is available here:
+
+https://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=108&set=custom
+
+* WARNING: Backward-incompatibility!
+ Number signs (#) appearing inside a macro reference or function invocation
+ no longer introduce comments and should not be escaped with backslashes:
+ thus a call such as:
+ foo := $(shell echo '#')
+ is legal. Previously the number sign needed to be escaped, for example:
+ foo := $(shell echo '\#')
+ Now this latter will resolve to "\#". If you want to write makefiles
+ portable to both versions, assign the number sign to a variable:
+ H := \#
+ foo := $(shell echo '$H')
+ This was claimed to be fixed in 3.81, but wasn't, for some reason.
+ To detect this change search for 'nocomment' in the .FEATURES variable.
+
+* WARNING: Backward-incompatibility!
+ Previously appending using '+=' to an empty variable would result in a value
+ starting with a space. Now the initial space is only added if the variable
+ already contains some value. Similarly, appending an empty string does not
+ add a trailing space.
+
+* WARNING: Backward-incompatibility!
+ Previously using the .SILENT pseudo-target in a makefile would force all
+ sub-makes to be invoked with the '-s' option, effectively making all
+ sub-makes silent as well. In this release .SILENT only affects the current
+ invocation of make. A side-effect of this is that .SILENT will no longer
+ enable the --no-print-directory option, which using -s will do.
+
+* NOTE: Deprecated behavior.
+ Contrary to the documentation, suffix rules with prerequisites are being
+ treated BOTH as simple targets AND as pattern rules. Further, the
+ prerequisites are ignored by the pattern rules. POSIX specifies that in
+ order to be a suffix rule there can be no prerequisites defined. In this
+ release if POSIX mode is enabled then rules with prerequisites cannot be
+ suffix rules. If POSIX mode is not enabled then the previous behavior is
+ preserved (a pattern rule with no extra prerequisites is created) AND a
+ warning about this behavior is generated:
+ warning: ignoring prerequisites on suffix rule definition
+ The POSIX behavior will be adopted as the only behavior in a future release
+ of GNU make so please resolve any warnings.
+
+* New feature: Grouped explicit targets
+ Pattern rules have always had the ability to generate multiple targets with
+ a single invocation of the recipe. It's now possible to declare that an
+ explicit rule generates multiple targets with a single invocation. To use
+ this, replace the ":" token with "&:" in the rule. To detect this feature
+ search for 'grouped-target' in the .FEATURES special variable.
+ Implementation contributed by Kaz Kylheku <kaz@kylheku.com>
+
+* New feature: .EXTRA_PREREQS variable
+ Words in this variable are considered prerequisites of targets but they are
+ not added to any of the automatic variable values when expanding the
+ recipe. This variable can either be global (applies to all targets) or
+ a target-specific variable. To detect this feature search for 'extra-prereqs'
+ in the .FEATURES special variable.
+ Implementation contributed by Christof Warlich <cwarlich@gmx.de>
+
+* Makefiles can now specify the '-j' option in their MAKEFLAGS variable and
+ this will cause make to enable that parallelism mode.
+
+* GNU make will now use posix_spawn() on systems where it is available.
+ If you prefer to use fork/exec even on systems where posix_spawn() is
+ present, you can use the --disable-posix-spawn option to configure.
+ Implementation contributed by Aron Barath <baratharon@caesar.elte.hu>
+
+* Error messages printed when invoking non-existent commands have been cleaned
+ up and made consistent.
+
+* The previous limit of 63 jobs under -jN on MS-Windows is now
+ increased to 4095. That limit includes the subprocess started by
+ the $(shell) function.
+
+* A new option --no-silent has been added, that cancels the effect of the
+ -s/--silent/--quiet flag.
+
+* A new option -E has been added as a short alias for --eval.
+
+* All wildcard expansion within GNU make, including $(wildcard ...), will sort
+ the results. See https://savannah.gnu.org/bugs/index.php?52076
+
+* Interoperate with newer GNU libc and musl C runtime libraries.
+
+* Performance improvements provided by Paolo Bonzini <pbonzini@redhat.com>
+
+GNU make Developer News
+
+* Import the GNU standard bootstrap script to replace the hand-rolled
+ "make update" method for building code from a GNU make Git repository.
+
+* Rework the source distribution to move source files into the src/*
+ subdirectory. This aligns with modern best practices in GNU.
+
+* Replace local portability code with Gnulib content. Unfortunately due to a
+ problem with Gnulib support for getloadavg, this forces a requirement on
+ Automake 1.16 or above in order to build from Git. See README.git.
+
+\f
+Version 4.2.1 (10 Jun 2016)
+
+A complete list of bugs fixed in this version is available here:
+
+https://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=107&set=custom
+
+This release is a bug-fix release.
+
+\f
Version 4.2 (22 May 2016)
A complete list of bugs fixed in this version is available here:
-http://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=106&set=custom
+https://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=106&set=custom
* New variable: $(.SHELLSTATUS) is set to the exit status of the last != or
$(shell ...) function invoked in this instance of make. This will be "0" if
A complete list of bugs fixed in this version is available here:
-http://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=105&set=custom
+https://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=105&set=custom
* New variables: $(MAKE_TERMOUT) and $(MAKE_TERMERR) are set to non-empty
values if stdout or stderr, respectively, are believed to be writing to a
A complete list of bugs fixed in this version is available here:
-http://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=101&set=custom
+https://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=101&set=custom
* WARNING: Backward-incompatibility!
If .POSIX is specified, then make adheres to the POSIX backslash/newline
* New feature: "::=" simple assignment operator as defined by POSIX in 2012.
This operator has identical functionality to ":=" in GNU make, but will be
portable to any implementation of make conforming to a sufficiently new
- version of POSIX (see http://austingroupbugs.net/view.php?id=330). It is
+ version of POSIX (see https://austingroupbugs.net/view.php?id=330). It is
not necessary to define the .POSIX target to access this operator.
* New feature: Loadable objects
A complete list of bugs fixed in this version is available here:
-http://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=104&set=custom
+https://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=104&set=custom
* Compiling GNU make now requires a conforming ISO C 1989 compiler and
standard runtime library.
might have caused the target to rebuild. Starting with the _next_
release of GNU make, '$?' will contain all prerequisites that caused
the target to be considered out of date.
- See http://savannah.gnu.org/bugs/?16051
+ See https://savannah.gnu.org/bugs/?16051
* WARNING: Backward-incompatibility!
GNU make now implements a generic "second expansion" feature on the
A complete list of bugs fixed in this version is available here:
- http://savannah.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=103
+ https://savannah.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=103
\f
Version 3.80 (03 Oct 2002)
A complete list of bugs fixed in this version is available here:
- http://savannah.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=102
+ https://savannah.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=102
\f
Version 3.79.1 (23 Jun 2000)
This port was done by Klaus Kämpf <kkaempf@rmi.de>
* There is first-level support available from proGIS Software, Germany.
- Visit their web-site at http://www.progis.de to get information
+ Visit their web-site at https://www.progis.de to get information
about other vms software and forthcoming updates to gnu make.
* /bin/sh style I/O redirection is supported. You can now write lines like
(Changes from versions 1 through 3.05 were never recorded. Sorry.)
\f
-------------------------------------------------------------------------------
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
+Copyright (C) 1988-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
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/>.