GNU make NEWS                                               -*-indented-text-*-
  History of user-visible changes.
  16 Sep 2013

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
reporting bugs.

Version 3.99.91

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

* WARNING: Backward-incompatibility!
  If .POSIX is specified, then make adheres to the POSIX backslash/newline
  handling requirements, which introduces the following changes to the
  standard backslash/newline handling in non-recipe lines:
  * Any trailing space before the backslash is preserved
  * Each backslash/newline (plus subsequent whitespace) is converted to a
    single space

* New command line option: --output-sync (-O) enables grouping of output by
  target or by recursive make.  This is useful during parallel builds to avoid
  mixing output from different jobs together giving hard-to-understand
  results.  Original implementation by David Boyce <dsb@boyski.com>.
  Reworked and enhanced by Frank Heckenbach <f.heckenbach@fh-soft.de>.
  Windows support by Eli Zaretskii <eliz@gnu.org>.

* New command line option: --trace enables tracing of targets.  When enabled
  the recipe to be invoked is printed even if it would otherwise be suppressed
  by .SILENT or a "@" prefix character.  Also before each recipe is run the
  makefile name and linenumber where it was defined are shown as well as the
  prerequisites that caused the target to be considered out of date.

* New command line option argument: --debug now accepts a "n" (none) flag
  which disables all debugging settings that are currently enabled.

* New feature: The "job server" capability is now supported on Windows.
  Implementation contributed by Troy Runkel <Troy.Runkel@mathworks.com>

* New feature: The .ONESHELL capability is now supported on Windows.  Support
  added by Eli Zaretskii <eliz@gnu.org>.

* New feature: "!=" shell assignment operator as an alternative to the
  $(shell ...) function.  Implemented for compatibility with BSD makefiles.
  WARNING: Backward-incompatibility!
  Variables ending in "!" previously defined as "variable!= value" will now be
  interpreted as shell assignment.  Change your assignment to add whitespace
  between the "!" and "=": "variable! = value"

* 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
  not necessary to define the .POSIX target to access this operator.

* New feature: GNU Guile integration
  This version of GNU make can be compiled with GNU Guile integration.
  GNU Guile serves as an embedded extension language for make.
  See the "Guile Function" section in the GNU Make manual for details.

* New feature: Loadable objects
  This version of GNU make contains a "technology preview": the ability to
  load dynamic objects into the make runtime.  These objects can be created by
  the user and can add extended functionality, usable by makefiles.

* New function: $(file ...) writes to a file.

* New variable: $(GNUMAKEFLAGS) will be parsed for make flags, just like
  MAKEFLAGS is.  It can be set in the environment or the makefile, containing
  GNU make-specific flags to allow your makefile to be portable to other
  versions of make.  GNU make never sets or modifies GNUMAKEFLAGS.

* New variable: `MAKE_HOST' gives the name of the host architecture
  make was compiled for.  This is the same value you see after 'Built for'
  when running 'make --version'.

* Behavior of MAKEFLAGS and MFLAGS is more rigorously defined.  All simple
  flags are grouped together in the first word of MAKEFLAGS.  No options that
  accept arguments appear there.  If no simple flags are present MAKEFLAGS
  begins with a space.  MFLAGS never begins with "- ".

* Setting the -r and -R options in MAKEFLAGS inside a makefile now works as
  expected, removing all built-in rules and variables, respectively.

* If a recipe fails, the makefile name and linenumber of the recipe are shown.

* A .RECIPEPREFIX setting is remembered per-recipe and variables expanded
  in that recipe also use that recipe prefix setting.

* In -p output, .RECIPEPREFIX settings are shown and all target-specific
  variables are output as if in a makefile, instead of as comments.

* On MS-Windows, recipes that use ".." quoting will no longer force
  invocation of commands via temporary batch files and stock Windows
  shells, they will be short-circuited and invoked directly.  (In
  other words, " is no longer a special character for stock Windows
  shells.)  This avoids hitting shell limits for command length when
  quotes are used, but nothing else in the command requires the shell.
  This change could potentially mean some minor incompatibilities in
  behavior when the recipe uses quoted string on shell command lines.


Version 3.82 (28 Jul 2010)

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

* Compiling GNU make now requires a conforming ISO C 1989 compiler and
  standard runtime library.

* WARNING: Backward-incompatibility!
  The POSIX standard for make was changed in the 2008 version in a
  fundamentally incompatible way: make is required to invoke the shell as if
  the '-e' flag were provided.  Because this would break many makefiles that
  have been written to conform to the original text of the standard, the
  default behavior of GNU make remains to invoke the shell with simply '-c'.
  However, any makefile specifying the .POSIX special target will follow the
  new POSIX standard and pass '-e' to the shell.  See also .SHELLFLAGS
  below.

* WARNING: Backward-incompatibility!
  The '$?' variable now contains all prerequisites that caused the target to
  be considered out of date, even if they do not exist (previously only
  existing targets were provided in $?).

* WARNING: Backward-incompatibility!
  Wildcards were not documented as returning sorted values, but the results
  have been sorted up until this release..  If your makefiles require sorted
  results from wildcard expansions, use the $(sort ...)  function to request
  it explicitly.

* WARNING: Backward-incompatibility!
  In previous versions of make it was acceptable to list one or more explicit
  targets followed by one or more pattern targets in the same rule and it
  worked "as expected".  However, this was not documented as acceptable and if
  you listed any explicit targets AFTER the pattern targets, the entire rule
  would be mis-parsed.  This release removes this ability completely: make
  will generate an error message if you mix explicit and pattern targets in
  the same rule.

* WARNING: Backward-incompatibility!
  As a result of parser enhancements, three backward-compatibility issues
  exist: first, a prerequisite containing an "=" cannot be escaped with a
  backslash any longer.  You must create a variable containing an "=" and
  use that variable in the prerequisite.  Second, variable names can no
  longer contain whitespace, unless you put the whitespace in a variable and
  use the variable.  Third, in previous versions of make it was sometimes
  not flagged as an error for explicit and pattern targets to appear in the
  same rule.  Now this is always reported as an error.

* WARNING: Backward-incompatibility!
  The pattern-specific variables and pattern rules are now applied in the
  shortest stem first order instead of the definition order (variables
  and rules with the same stem length are still applied in the definition
  order). This produces the usually-desired behavior where more specific
  patterns are preferred. To detect this feature search for 'shortest-stem'
  in the .FEATURES special variable.

* WARNING: Backward-incompatibility!
  The library search behavior has changed to be compatible with the standard
  linker behavior. Prior to this version for prerequisites specified using
  the -lfoo syntax make first searched for libfoo.so in the current
  directory, vpath directories, and system directories. If that didn't yield
  a match, make then searched for libfoo.a in these directories. Starting
  with this version make searches first for libfoo.so and then for libfoo.a
  in each of these directories in order.

* New command line option: --eval=STRING causes STRING to be evaluated as
  makefile syntax (akin to using the $(eval ...) function).  The evaluation
  is performed after all default rules and variables are defined, but before
  any makefiles are read.

* New special variable: .RECIPEPREFIX allows you to reset the recipe
  introduction character from the default (TAB) to something else.  The
  first character of this variable value is the new recipe introduction
  character.  If the variable is set to the empty string, TAB is used again.
  It can be set and reset at will; recipes will use the value active when
  they were first parsed.  To detect this feature check the value of
  $(.RECIPEPREFIX).

* New special variable: .SHELLFLAGS allows you to change the options passed
  to the shell when it invokes recipes.  By default the value will be "-c"
  (or "-ec" if .POSIX is set).

* New special target: .ONESHELL instructs make to invoke a single instance
  of the shell and provide it with the entire recipe, regardless of how many
  lines it contains.  As a special feature to allow more straightforward
  conversion of makefiles to use .ONESHELL, any recipe line control
  characters ('@', '+', or '-') will be removed from the second and
  subsequent recipe lines.  This happens _only_ if the SHELL value is deemed
  to be a standard POSIX-style shell.  If not, then no interior line control
  characters are removed (as they may be part of the scripting language used
  with the alternate SHELL).

* New variable modifier 'private': prefixing a variable assignment with the
  modifier 'private' suppresses inheritance of that variable by
  prerequisites.  This is most useful for target- and pattern-specific
  variables.

* New make directive: 'undefine' allows you to undefine a variable so that
  it appears as if it was never set. Both $(flavor) and $(origin) functions
  will return 'undefined' for such a variable. To detect this feature search
  for 'undefine' in the .FEATURES special variable.

* The parser for variable assignments has been enhanced to allow multiple
  modifiers ('export', 'override', 'private') on the same line as variables,
  including define/endef variables, and in any order.  Also, it is possible
  to create variables and targets named as these modifiers.

* The 'define' make directive now allows a variable assignment operator
  after the variable name, to allow for simple, conditional, or appending
  multi-line variable assignment.


Version 3.81 (01 Apr 2006)

* GNU make is ported to OS/2.

* GNU make is ported to MinGW.  The MinGW build is only supported by
  the build_w32.bat batch file; see the file README.W32 for more
  details.

* WARNING: Future backward-incompatibility!
  Up to and including this release, the '$?' variable does not contain
  any prerequisite that does not exist, even though that prerequisite
  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 this Savannah bug:
  http://savannah.gnu.org/bugs/index.php?func=detailitem&item_id=16051

* WARNING: Backward-incompatibility!
  GNU make now implements a generic "second expansion" feature on the
  prerequisites of both explicit and implicit (pattern) rules.  In order
  to enable this feature, the special target '.SECONDEXPANSION' must be
  defined before the first target which takes advantage of it.  If this
  feature is enabled then after all rules have been parsed the
  prerequisites are expanded again, this time with all the automatic
  variables in scope.  This means that in addition to using standard
  SysV $$@ in prerequisites lists, you can also use complex functions
  such as $$(notdir $$@) etc.  This behavior applies to implicit rules,
  as well, where the second expansion occurs when the rule is matched.
  However, this means that when '.SECONDEXPANSION' is enabled you must
  double-quote any "$" in your filenames; instead of "foo: boo$$bar" you
  now must write "foo: foo$$$$bar".  Note that the SysV $$@ etc. feature,
  which used to be available by default, is now ONLY available when the
  .SECONDEXPANSION target is defined.  If your makefiles take advantage
  of this SysV feature you will need to update them.

* WARNING: Backward-incompatibility!
  In order to comply with POSIX, the way in which GNU make processes
  backslash-newline sequences in recipes has changed.  If your makefiles
  use backslash-newline sequences inside of single-quoted strings in
  recipes you will be impacted by this change.  See the GNU make manual
  subsection "Splitting Recipe Lines" (node "Splitting Lines"), in
  section "Recipe Syntax", chapter "Writing Recipe in Rules", for
  details.

* WARNING: Backward-incompatibility!
  Some previous versions of GNU make had a bug where "#" in a function
  invocation such as $(shell ...) was treated as a make comment.  A
  workaround was to escape these with backslashes.  This bug has been
  fixed: if your makefile uses "\#" in a function invocation the
  backslash is now preserved, so you'll need to remove it.

* New command line option: -L (--check-symlink-times).  On systems that
  support symbolic links, if this option is given then GNU make will
  use the most recent modification time of any symbolic links that are
  used to resolve target files.  The default behavior remains as it
  always has: use the modification time of the actual target file only.

* The "else" conditional line can now be followed by any other valid
  conditional on the same line: this does not increase the depth of the
  conditional nesting, so only one "endif" is required to close the
  conditional.

* All pattern-specific variables that match a given target are now used
  (previously only the first match was used).

* Target-specific variables can be marked as exportable using the
  "export" keyword.

* In a recursive $(call ...) context, any extra arguments from the outer
  call are now masked in the context of the inner call.

* Implemented a solution for the "thundering herd" problem with "-j -l".
  This version of GNU make uses an algorithm suggested by Thomas Riedl
  <thomas.riedl@siemens.com> to track the number of jobs started in the
  last second and artificially adjust GNU make's view of the system's
  load average accordingly.

* New special variables available in this release:
   - .INCLUDE_DIRS: Expands to a list of directories that make searches
     for included makefiles.
   - .FEATURES: Contains a list of special features available in this
     version of GNU make.
   - .DEFAULT_GOAL: Set the name of the default goal make will
     use if no goals are provided on the command line.
   - MAKE_RESTARTS: If set, then this is the number of times this
     instance of make has been restarted (see "How Makefiles Are Remade"
     in the manual).
   - New automatic variable: $| (added in 3.80, actually): contains all
     the order-only prerequisites defined for the target.

* New functions available in this release:
   - $(lastword ...) returns the last word in the list.  This gives
     identical results as $(word $(words ...) ...), but is much faster.
   - $(abspath ...) returns the absolute path (all "." and ".."
     directories resolved, and any duplicate "/" characters removed) for
     each path provided.
   - $(realpath ...) returns the canonical pathname for each path
     provided.  The canonical pathname is the absolute pathname, with
     all symbolic links resolved as well.
   - $(info ...) prints its arguments to stdout.  No makefile name or
     line number info, etc. is printed.
   - $(flavor ...) returns the flavor of a variable.
   - $(or ...) provides a short-circuiting OR conditional: each argument
     is expanded.  The first true (non-empty) argument is returned; no
     further arguments are expanded.  Expands to empty if there are no
     true arguments.
   - $(and ...) provides a short-circuiting AND conditional: each
     argument is expanded.  The first false (empty) argument is
     returned; no further arguments are expanded.  Expands to the last
     argument if all arguments are true.

* Changes made for POSIX compatibility:
   - Only touch targets (under -t) if they have a recipe.
   - Setting the SHELL make variable does NOT change the value of the
     SHELL environment variable given to programs invoked by make.  As
     an enhancement to POSIX, if you export the make variable SHELL then
     it will be set in the environment, just as before.

* On MS Windows systems, explicitly setting SHELL to a pathname ending
  in "cmd" or "cmd.exe" (case-insensitive) will force GNU make to use
  the DOS command interpreter in batch mode even if a UNIX-like shell
  could be found on the system.

* On VMS there is now support for case-sensitive filesystems such as ODS5.
  See the readme.vms file for information.

* Parallel builds (-jN) no longer require a working Bourne shell on
  Windows platforms.  They work even with the stock Windows shells, such
  as cmd.exe and command.com.

* Updated to autoconf 2.59, automake 1.9.5, and gettext 0.14.1.  Users
  should not be impacted.

* New translations for Swedish, Chinese (simplified), Ukrainian,
  Belarusian, Finnish, Kinyarwandan, and Irish.  Many updated
  translations.

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


Version 3.80 (03 Oct 2002)

* A new feature exists: order-only prerequisites.  These prerequisites
  affect the order in which targets are built, but they do not impact
  the rebuild/no-rebuild decision of their dependents.  That is to say,
  they allow you to require target B be built before target A, without
  requiring that target A will always be rebuilt if target B is updated.
  Patch for this feature provided by Greg McGary <greg@mcgary.org>.

* For compatibility with SysV make, GNU make now supports the peculiar
  syntax $$@, $$(@D), and $$(@F) in the prerequisites list of a rule.
  This syntax is only valid within explicit and static pattern rules: it
  cannot be used in implicit (suffix or pattern) rules.  Edouard G. Parmelan
  <egp@free.fr> provided a patch implementing this feature; however, I
  decided to implement it in a different way.

* The argument to the "ifdef" conditional is now expanded before it's
  tested, so it can be a constructed variable name.

  Similarly, the arguments to "export" (when not used in a variable
  definition context) and "unexport" are also now expanded.

* A new function is defined: $(value ...).  The argument to this
  function is the _name_ of a variable.  The result of the function is
  the value of the variable, without having been expanded.

* A new function is defined: $(eval ...).  The arguments to this
  function should expand to makefile commands, which will then be
  evaluated as if they had appeared in the makefile.  In combination
  with define/endef multiline variable definitions this is an extremely
  powerful capability.  The $(value ...) function is also sometimes
  useful here.

* A new built-in variable is defined, $(MAKEFILE_LIST).  It contains a
  list of each makefile GNU make has read, or started to read, in the
  order in which they were encountered.  So, the last filename in the
  list when a makefile is just being read (before any includes) is the
  name of the current makefile.

* A new built-in variable is defined: $(.VARIABLES).  When it is
  expanded it returns a complete list of variable names defined by all
  makefiles at that moment.

* A new command line option is defined, -B or --always-make.  If
  specified GNU make will consider all targets out-of-date even if they
  would otherwise not be.

* The arguments to $(call ...) functions were being stored in $1, $2,
  etc. as recursive variables, even though they are fully expanded
  before assignment.  This means that escaped dollar signs ($$ etc.)
  were not behaving properly.  Now the arguments are stored as simple
  variables.  This may mean that if you added extra escaping to your
  $(call ...) function arguments you will need to undo it now.

* The variable invoked by $(call ...) can now be recursive: unlike other
  variables it can reference itself and this will not produce an error
  when it is used as the first argument to $(call ...) (but only then).

* New pseudo-target .LOW_RESOLUTION_TIME, superseding the configure
  option --disable-nsec-timestamps.  You might need this if your build
  process depends on tools like "cp -p" preserving time stamps, since
  "cp -p" (right now) doesn't preserve the subsecond portion of a time
  stamp.

* Updated translations for French, Galician, German, Japanese, Korean,
  and Russian.  New translations for Croatian, Danish, Hebrew, and
  Turkish.

* Updated internationalization support to Gettext 0.11.5.
  GNU make now uses Gettext's "external" feature, and does not include
  any internationalization code itself.  Configure will search your
  system for an existing implementation of GNU Gettext (only GNU Gettext
  is acceptable) and use it if it exists.  If not, NLS will be disabled.
  See ABOUT-NLS for more information.

* Updated to autoconf 2.54 and automake 1.7.  Users should not be impacted.

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


Version 3.79.1 (23 Jun 2000)

* .SECONDARY with no prerequisites now prevents any target from being
  removed because make thinks it's an intermediate file, not just those
  listed in the makefile.

* New configure option --disable-nsec-timestamps, but this was
  superseded in later versions by the .LOW_RESOLUTION_TIME pseudo-target.

Version 3.79 (04 Apr 2000)

* GNU make optionally supports internationalization and locales via the
  GNU gettext (or local gettext if suitable) package.  See the ABOUT-NLS
  file for more information on configuring GNU make for NLS.

* Previously, GNU make quoted variables such as MAKEFLAGS and
  MAKEOVERRIDES for proper parsing by the shell.  This allowed them to
  be used within make build scripts.  However, using them there is not
  proper behavior: they are meant to be passed to subshells via the
  environment.  Unfortunately the values were not quoted properly to be
  passed through the environment.  This meant that make didn't properly
  pass some types of command line values to submakes.

  With this version we change that behavior: now these variables are
  quoted properly for passing through the environment, which is the
  correct way to do it.  If you previously used these variables
  explicitly within a make rule you may need to re-examine your use for
  correctness given this change.

* A new pseudo-target .NOTPARALLEL is available.  If defined, the
  current makefile is run serially regardless of the value of -j.
  However, submakes are still eligible for parallel execution.

* The --debug option has changed: it now allows optional flags
  controlling the amount and type of debugging output.  By default only
  a minimal amount information is generated, displaying the names of
  "normal" targets (not makefiles) that were deemed out of date and in
  need of being rebuilt.

  Note that the -d option behaves as before: it takes no arguments and
  all debugging information is generated.

* The `-p' (print database) output now includes filename and linenumber
  information for variable definitions, to aid debugging.

* The wordlist function no longer reverses its arguments if the "start"
  value is greater than the "end" value.  If that's true, nothing is
  returned.

* Hartmut Becker provided many updates for the VMS port of GNU make.
  See the readme.vms file for more details.

Version 3.78 (22 Sep 1999)

* Two new functions, $(error ...) and $(warning ...) are available.  The
  former will cause make to fail and exit immediately upon expansion of
  the function, with the text provided as the error message.  The latter
  causes the text provided to be printed as a warning message, but make
  proceeds normally.

* A new function $(call ...) is available.  This allows users to create
  their own parameterized macros and invoke them later.  Original
  implementation of this function was provided by Han-Wen Nienhuys
  <hanwen@cs.uu.nl>.

* A new function $(if ...) is available.  It provides if-then-else
  capabilities in a builtin function.  Original implementation of this
  function was provided by Han-Wen Nienhuys <hanwen@cs.uu.nl>.

* Make defines a new variable, .LIBPATTERNS.  This variable controls how
  library dependency expansion (dependencies like ``-lfoo'') is performed.

* Make accepts CRLF sequences as well as traditional LF, for
  compatibility with makefiles created on other operating systems.

* Make accepts a new option: -R, or --no-builtin-variables.  This option
  disables the definition of the rule-specific builtin variables (CC,
  LD, AR, etc.).  Specifying this option forces -r (--no-builtin-rules)
  as well.

* A "job server" feature, suggested by Howard Chu <hyc@highlandsun.com>.

  On systems that support POSIX pipe(2) semantics, GNU make can now pass
  -jN options to submakes rather than forcing them all to use -j1.  The
  top make and all its sub-make processes use a pipe to communicate with
  each other to ensure that no more than N jobs are started across all
  makes.  To get the old behavior of -j back, you can configure make
  with the --disable-job-server option.

* The confusing term "dependency" has been replaced by the more accurate
  and standard term "prerequisite", both in the manual and in all GNU make
  output.

* GNU make supports the "big archive" library format introduced in AIX 4.3.

* GNU make supports large files on AIX, HP-UX, and IRIX.  These changes
  were provided by Paul Eggert <eggert@twinsun.com>.  (Large file
  support for Solaris and Linux was introduced in 3.77, but the
  configuration had issues: these have also been resolved).

* The Windows 95/98/NT (W32) version of GNU make now has native support
  for the Cygnus Cygwin release B20.1 shell (bash).

* The GNU make regression test suite, long available separately "under
  the table", has been integrated into the release.  You can invoke it
  by running "make check" in the distribution.  Note that it requires
  Perl (either Perl 4 or Perl 5) to run.

Version 3.77 (28 Jul 1998)

* Implement BSD make's "?=" variable assignment operator.  The variable
  is assigned the specified value only if that variable is not already
  defined.

* Make defines a new variable, "CURDIR", to contain the current working
  directory (after the -C option, if any, has been processed).
  Modifying this variable has no effect on the operation of make.

* Make defines a new default RCS rule, for new-style master file
  storage: ``% :: RCS/%'' (note no ``,v'' suffix).

  Make defines new default rules for DOS-style C++ file naming
  conventions, with ``.cpp'' suffixes.  All the same rules as for
  ``.cc'' and ``.C'' suffixes are provided, along with LINK.cpp and
  COMPILE.cpp macros (which default to the same value as LINK.cc and
  COMPILE.cc).  Note CPPFLAGS is still C preprocessor flags!  You should
  use CXXFLAGS to change C++ compiler flags.

* A new feature, "target-specific variable values", has been added.
  This is a large change so please see the appropriate sections of the
  manual for full details.  Briefly, syntax like this:

    TARGET: VARIABLE = VALUE

  defines VARIABLE as VALUE within the context of TARGET.  This is
  similar to SunOS make's "TARGET := VARIABLE = VALUE" feature.  Note
  that the assignment may be of any type, not just recursive, and that
  the override keyword is available.

  COMPATIBILITY: This new syntax means that if you have any rules where
  the first or second dependency has an equal sign (=) in its name,
  you'll have to escape them with a backslash: "foo : bar\=baz".
  Further, if you have any dependencies which already contain "\=",
  you'll have to escape both of them: "foo : bar\\\=baz".

* A new appendix listing the most common error and warning messages
  generated by GNU make, with some explanation, has been added to the
  GNU make User's Manual.

* Updates to the GNU make Customs library support (see README.customs).

* Updates to the Windows 95/NT port from Rob Tulloh (see README.W32),
  and to the DOS port from Eli Zaretski (see README.DOS).

Version 3.76.1 (19 Sep 1997)

* Small (but serious) bug fix.  Quick rollout to get into the GNU source CD.

Version 3.76 (16 Sep 1997)

* GNU make now uses automake to control Makefile.in generation.  This
  should make it more consistent with the GNU standards.

* VPATH functionality has been changed to incorporate the VPATH+ patch,
  previously maintained by Paul Smith <psmith@baynetworks.com>.  See the
  manual.

* Make defines a new variable, `MAKECMDGOALS', to contain the goals that
  were specified on the command line, if any.  Modifying this variable
  has no effect on the operation of make.

* A new function, `$(wordlist S,E,TEXT)', is available: it returns a
  list of words from number S to number E (inclusive) of TEXT.

* Instead of an error, detection of future modification times gives a
  warning and continues.  The warning is repeated just before GNU make
  exits, so it is less likely to be lost.

* Fix the $(basename) and $(suffix) functions so they only operate on
  the last filename, not the entire string:

      Command              Old Result             New Result
      -------              ----------             ----------
    $(basename a.b)        a                      a
    $(basename a.b/c)      a                      a.b/c
    $(suffix a.b)          b                      b
    $(suffix a.b/c)        b/c                    <empty>

* The $(strip) function now removes newlines as well as TABs and spaces.

* The $(shell) function now changes CRLF (\r\n) pairs to a space as well
  as newlines (\n).

* Updates to the Windows 95/NT port from Rob Tulloh (see README.W32).

* Eli Zaretskii has updated the port to 32-bit protected mode on MSDOS
  and MS-Windows, building with the DJGPP v2 port of GNU C/C++ compiler
  and utilities.  See README.DOS for details, and direct all questions
  concerning this port to Eli Zaretskii <eliz@is.elta.co.il> or DJ
  Delorie <dj@delorie.com>.

* John W. Eaton has updated the VMS port to support libraries and VPATH.

Version 3.75 (27 Aug 1996)

* The directory messages printed by `-w' and implicitly in sub-makes,
  are now omitted if Make runs no commands and has no other messages to print.

* Make now detects files that for whatever reason have modification times
  in the future and gives an error.  Files with such impossible timestamps
  can result from unsynchronized clocks, or archived distributions
  containing bogus timestamps; they confuse Make's dependency engine
  thoroughly.

* The new directive `sinclude' is now recognized as another name for
  `-include', for compatibility with some other Makes.

* Aaron Digulla has contributed a port to AmigaDOS.  See README.Amiga for
  details, and direct all Amiga-related questions to <digulla@fh-konstanz.de>.

* Rob Tulloh of Tivoli Systems has contributed a port to Windows NT or 95.
  See README.W32 for details, and direct all Windows-related questions to
  <rob_tulloh@tivoli.com>.

Version 3.73 (05 Apr 1995)

* Converted to use Autoconf version 2, so `configure' has some new options.
  See INSTALL for details.

* You can now send a SIGUSR1 signal to Make to toggle printing of debugging
  output enabled by -d, at any time during the run.

Version 3.72 (04 Nov 1994)

* DJ Delorie has ported Make to MS-DOS using the GO32 extender.
  He is maintaining the DOS port, not the GNU Make maintainer;
  please direct bugs and questions for DOS to <djgpp@sun.soe.clarkson.edu>.
  MS-DOS binaries are available for FTP from ftp.simtel.net in
  /pub/simtelnet/gnu/djgpp/.

* The `MAKEFLAGS' variable (in the environment or in a makefile) can now
  contain variable definitions itself; these are treated just like
  command line variable definitions.  Make will automatically insert any
  variable definitions from the environment value of `MAKEFLAGS' or from
  the command line, into the `MAKEFLAGS' value exported to children.  The
  `MAKEOVERRIDES' variable previously included in the value of `$(MAKE)'
  for sub-makes is now included in `MAKEFLAGS' instead.  As before, you can
  reset `MAKEOVERRIDES' in your makefile to avoid putting all the variables
  in the environment when its size is limited.

* If `.DELETE_ON_ERROR' appears as a target, Make will delete the target of
  a rule if it has changed when its recipe exits with a nonzero status,
  just as when the recipe gets a signal.

* The automatic variable `$+' is new.  It lists all the dependencies like
  `$^', but preserves duplicates listed in the makefile.  This is useful
  for linking rules, where library files sometimes need to be listed twice
  in the link order.

* You can now specify the `.IGNORE' and `.SILENT' special targets with
  dependencies to limit their effects to those files.  If a file appears as
  a dependency of `.IGNORE', then errors will be ignored while running the
  recipe to update that file.  Likewise if a file appears as a dependency
  of `.SILENT', then the recipe to update that file will not be printed
  before it is run.  (This change was made to conform to POSIX.2.)

Version 3.71 (21 May 1994)

* The automatic variables `$(@D)', `$(%D)', `$(*D)', `$(<D)', `$(?D)', and
  `$(^D)' now omit the trailing slash from the directory name.  (This change
  was made to comply with POSIX.2.)

* The source distribution now includes the Info files for the Make manual.
  There is no longer a separate distribution containing Info and DVI files.

* You can now set the variables `binprefix' and/or `manprefix' in
  Makefile.in (or on the command line when installing) to install GNU make
  under a name other than `make' (i.e., ``make binprefix=g install''
  installs GNU make as `gmake').

* The built-in Texinfo rules use the new variables `TEXI2DVI_FLAGS' for
  flags to the `texi2dvi' script, and `MAKEINFO_FLAGS' for flags to the
  Makeinfo program.

* The exit status of Make when it runs into errors is now 2 instead of 1.
  The exit status is 1 only when using -q and some target is not up to date.
  (This change was made to comply with POSIX.2.)

Version 3.70 (03 Jan 1994)

* It is no longer a fatal error to have a NUL character in a makefile.
  You should never put a NUL in a makefile because it can have strange
  results, but otherwise empty lines full of NULs (such as produced by
  the `xmkmf' program) will always work fine.

* The error messages for nonexistent included makefiles now refer to the
  makefile name and line number where the `include' appeared, so Emacs's
  C-x ` command takes you there (in case it's a typo you need to fix).

Version 3.69 (07 Nov 1993)

* Implicit rule search for archive member references is now done in the
  opposite order from previous versions: the whole target name `LIB(MEM)'
  first, and just the member name and parentheses `(MEM)' second.

* Make now gives an error for an unterminated variable or function reference.
  For example, `$(foo' with no matching `)' or `${bar' with no matching `}'.

* The new default variable `MAKE_VERSION' gives the version number of
  Make, and a string describing the remote job support compiled in (if any).
  Thus the value (in this release) is something like `3.69' or `3.69-Customs'.

* Commands in an invocation of the `shell' function are no longer run
  with a modified environment like recipes are.  As in versions before
  3.68, they now run with the environment that `make' started with.  We
  have reversed the change made in version 3.68 because it turned out to
  cause a paradoxical situation in cases like:

	export variable = $(shell echo value)

  When Make attempted to put this variable in the environment for a
  recipe, it would try expand the value by running the shell command
  `echo value'.  In version 3.68, because it constructed an environment
  for that shell command in the same way, Make would begin to go into an
  infinite loop and then get a fatal error when it detected the loop.

* The recipe given for `.DEFAULT' is now used for phony targets with no
  recipe.

Version 3.68 (28 Jul 1993)

* You can list several archive member names inside parenthesis:
  `lib(mem1 mem2 mem3)' is equivalent to `lib(mem1) lib(mem2) lib(mem3)'.

* You can use wildcards inside archive member references.  For example,
  `lib(*.o)' expands to all existing members of `lib' whose names end in
  `.o' (e.g. `lib(a.o) lib(b.o)'); `*.a(*.o)' expands to all such members
  of all existing files whose names end in `.a' (e.g. `foo.a(a.o)
  foo.a(b.o) bar.a(c.o) bar.a(d.o)'.

* A suffix rule `.X.a' now produces two pattern rules:
	(%.o): %.X	# Previous versions produced only this.
	%.a: %.X	# Now produces this as well, just like other suffixes.

* The new flag `--warn-undefined-variables' says to issue a warning message
  whenever Make expands a reference to an undefined variable.

* The new `-include' directive is just like `include' except that there is
  no error (not even a warning) for a nonexistent makefile.

* Commands in an invocation of the `shell' function are now run with a
  modified environment like recipes are, so you can use `export' et al
  to set up variables for them.  They used to run with the environment
  that `make' started with.

Version 3.66 (21 May 1993)

* `make --version' (or `make -v') now exits immediately after printing
  the version number.

Version 3.65 (09 May 1993)

* Make now supports long-named members in `ar' archive files.

Version 3.64 (21 Apr 1993)

* Make now supports the `+=' syntax for a variable definition which appends
  to the variable's previous value.  See the section `Appending More Text
  to Variables' in the manual for full details.

* The new option `--no-print-directory' inhibits the `-w' or
  `--print-directory' feature.  Make turns on `--print-directory'
  automatically if you use `-C' or `--directory', and in sub-makes; some
  users have found this behavior undesirable.

* The built-in implicit rules now support the alternative extension
  `.txinfo' for Texinfo files, just like `.texinfo' and `.texi'.

Version 3.63 (22 Jan 1993)

* Make now uses a standard GNU `configure' script.  See the new file
  INSTALL for the new (and much simpler) installation procedure.

* There is now a shell script to build Make the first time, if you have no
  other `make' program.  `build.sh' is created by `configure'; see README.

* GNU Make now completely conforms to the POSIX.2 specification for `make'.

* Elements of the `$^' and `$?' automatic variables that are archive
  member references now list only the member name, as in Unix and POSIX.2.

* You should no longer ever need to specify the `-w' switch, which prints
  the current directory before and after Make runs.  The `-C' switch to
  change directory, and recursive use of Make, now set `-w' automatically.

* Multiple double-colon rules for the same target will no longer have their
  recipes run simultaneously under -j, as this could result in the two
  recipes trying to change the file at the same time and interfering with
  one another.

* The `SHELL' variable is now never taken from the environment.
  Each makefile that wants a shell other than the default (/bin/sh) must
  set SHELL itself.  SHELL is always exported to child processes.
  This change was made for compatibility with POSIX.2.

* Make now accepts long options.  There is now an informative usage message
  that tells you what all the options are and what they do.  Try `make --help'.

* There are two new directives: `export' and `unexport'.  All variables are
  no longer automatically put into the environments of the recipe lines that
  Make runs.  Instead, only variables specified on the command line or in
  the environment are exported by default.  To export others, use:
	export VARIABLE
  or you can define variables with:
	export VARIABLE = VALUE
  or:
	export VARIABLE := VALUE
  You can use just:
	export
  or:
	.EXPORT_ALL_VARIABLES:
  to get the old behavior.  See the node `Variables/Recursion' in the manual
  for a full description.

* The recipe from the `.DEFAULT' special target is only applied to
  targets which have no rules at all, not all targets with no recipe.
  This change was made for compatibility with Unix make.

* All fatal error messages now contain `***', so they are easy to find in
  compilation logs.

* Dependency file names like `-lNAME' are now replaced with the actual file
  name found, as with files found by normal directory search (VPATH).
  The library file `libNAME.a' may now be found in the current directory,
  which is checked before VPATH; the standard set of directories (/lib,
  /usr/lib, /usr/local/lib) is now checked last.
  See the node `Libraries/Search' in the manual for full details.

* A single `include' directive can now specify more than one makefile to
  include, like this:
	include file1 file2
  You can also use shell file name patterns in an `include' directive:
	include *.mk

* The default directories to search for included makefiles, and for
  libraries specified with `-lNAME', are now set by configuration.

* You can now use blanks as well as colons to separate the directories in a
  search path for the `vpath' directive or the `VPATH' variable.

* You can now use variables and functions in the left hand side of a
  variable assignment, as in "$(foo)bar = value".

* The `MAKE' variable is always defined as `$(MAKE_COMMAND) $(MAKEOVERRIDES)'.
  The `MAKE_COMMAND' variable is now defined to the name with which make
  was invoked.

* The built-in rules for C++ compilation now use the variables `$(CXX)' and
  `$(CXXFLAGS)' instead of `$(C++)' and `$(C++FLAGS)'.  The old names had
  problems with shells that cannot have `+' in environment variable names.

* The value of a recursively expanded variable is now expanded when putting
  it into the environment for child processes.  This change was made for
  compatibility with Unix make.

* A rule with no targets before the `:' is now accepted and ignored.
  This change was made for compatibility with SunOS 4 make.
  We do not recommend that you write your makefiles to take advantage of this.

* The `-I' switch can now be used in MAKEFLAGS, and are put there
  automatically just like other switches.

Version 3.61

* Built-in rules for C++ source files with the `.C' suffix.
  We still recommend that you use `.cc' instead.

* If a recipe is given too many times for a single target, the last one
  given is used, and a warning message is printed.

* Error messages about makefiles are in standard GNU error format,
  so C-x ` in Emacs works on them.

* Dependencies of pattern rules which contain no % need not actually exist
  if they can be created (just like dependencies which do have a %).

Version 3.60

* A message is always printed when Make decides there is nothing to be done.
  It used to be that no message was printed for top-level phony targets
  (because "`phony' is up to date" isn't quite right).  Now a different
  message "Nothing to be done for `phony'" is printed in that case.

* Archives on AIX now supposedly work.

* When the recipes specified for .DEFAULT are used to update a target,
  the $< automatic variable is given the same value as $@ for that target.
  This is how Unix make behaves, and this behavior is mandated by POSIX.2.

Version 3.59

* The -n, -q, and -t options are not put in the `MAKEFLAGS' and `MFLAG'
  variables while remaking makefiles, so recursive makes done while remaking
  makefiles will behave properly.

* If the special target `.NOEXPORT' is specified in a makefile,
  only variables that came from the environment and variables
  defined on the command line are exported.

Version 3.58

* Suffix rules may have dependencies (which are ignored).

Version 3.57

* Dependencies of the form `-lLIB' are searched for as /usr/local/lib/libLIB.a
  as well as libLIB.a in /usr/lib, /lib, the current directory, and VPATH.

Version 3.55

* There is now a Unix man page for GNU Make.  It is certainly not a
  replacement for the Texinfo manual, but it documents the basic
  functionality and the switches.  For full documentation, you should
  still read the Texinfo manual.  Thanks to Dennis Morse of Stanford
  University for contributing the initial version of this.

* Variables which are defined by default (e.g., `CC') will no longer be
  put into the environment for child processes.  (If these variables are
  reset by the environment, makefiles, or the command line, they will
  still go into the environment.)

* Makefiles which have recipes but no dependencies (and thus are always
  considered out of date and in need of remaking), will not be remade (if they
  were being remade only because they were makefiles).  This means that GNU
  Make will no longer go into an infinite loop when fed the makefiles that
  `imake' (necessary to build X Windows) produces.

* There is no longer a warning for using the `vpath' directive with an explicit
pathname (instead of a `%' pattern).

Version 3.51

* When removing intermediate files, only one `rm' command line is printed,
  listing all file names.

* There are now automatic variables `$(^D)', `$(^F)', `$(?D)', and `$(?F)'.
  These are the directory-only and file-only versions of `$^' and `$?'.

* Library dependencies given as `-lNAME' will use "libNAME.a" in the current
  directory if it exists.

* The automatic variable `$($/)' is no longer defined.

* Leading `+' characters on a recipe line make that line be executed even
  under -n, -t, or -q (as if the line contained `$(MAKE)').

* For recipe lines containing `$(MAKE)', `${MAKE}', or leading `+' characters,
  only those lines are executed, not the entire recipe.
  (This is how Unix make behaves for lines containing `$(MAKE)' or `${MAKE}'.)

Version 3.50

* Filenames in rules will now have ~ and ~USER expanded.

* The `-p' output has been changed so it can be used as a makefile.
  (All information that isn't specified by makefiles is prefaced with comment
  characters.)

Version 3.49

* The % character can be quoted with backslash in implicit pattern rules,
  static pattern rules, `vpath' directives, and `patsubst', `filter', and
  `filter-out' functions.  A warning is issued if a `vpath' directive's
  pattern contains no %.

* The `wildcard' variable expansion function now expands ~ and ~USER.

* Messages indicating failed recipe lines now contain the target name:
	make: *** [target] Error 1

* The `-p' output format has been changed somewhat to look more like
  makefile rules and to give all information that Make has about files.

Version 3.48

Version 3.47

* The `-l' switch with no argument removes any previous load-average limit.

* When the `-w' switch is in effect, and Make has updated makefiles,
  it will write a `Leaving directory' message before re-executing itself.
  This makes the `directory change tracking' changes to Emacs's compilation
  commands work properly.

Version 3.46

* The automatic variable `$*' is now defined for explicit rules,
  as it is in Unix make.

Version 3.45

* The `-j' switch is now put in the MAKEFLAGS and MFLAGS variables when
  specified without an argument (indicating infinite jobs).
  The `-l' switch is not always put in the MAKEFLAGS and MFLAGS variables.

* Make no longer checks hashed directories after running recipes.
  The behavior implemented in 3.41 caused too much slowdown.

Version 3.44

* A dependency is NOT considered newer than its dependent if
  they have the same modification time.  The behavior implemented
  in 3.43 conflicts with RCS.

Version 3.43

* Dependency loops are no longer fatal errors.

* A dependency is considered newer than its dependent if
  they have the same modification time.

Version 3.42

* The variables F77 and F77FLAGS are now set by default to $(FC) and
  $(FFLAGS).  Makefiles designed for System V make may use these variables in
  explicit rules and expect them to be set.  Unfortunately, there is no way to
  make setting these affect the Fortran implicit rules unless FC and FFLAGS
  are not used (and these are used by BSD make).

Version 3.41

* Make now checks to see if its hashed directories are changed by recipes.
  Other makes that hash directories (Sun, 4.3 BSD) don't do this.

Version 3.39

* The `shell' function no longer captures standard error output.

Version 3.32

* A file beginning with a dot can be the default target if it also contains
  a slash (e.g., `../bin/foo').  (Unix make allows this as well.)

Version 3.31

* Archive member names are truncated to 15 characters.

* Yet more USG stuff.

* Minimal support for Microport System V (a 16-bit machine and a
  brain-damaged compiler).  This has even lower priority than other USG
  support, so if it gets beyond trivial, I will take it out completely.

* Revamped default implicit rules (not much visible change).

* The -d and -p options can come from the environment.

Version 3.30

* Improved support for USG and HPUX (hopefully).

* A variable reference like `$(foo:a=b)', if `a' contains a `%', is
  equivalent to `$(patsubst a,b,$(foo))'.

* Defining .DEFAULT with no deps or recipe clears its recipe.

* New default implicit rules for .S (cpp, then as), and .sh (copy and
  make executable).  All default implicit rules that use cpp (even
  indirectly), use $(CPPFLAGS).

Version 3.29

* Giving the -j option with no arguments gives you infinite jobs.

Version 3.28

* New option: "-l LOAD" says not to start any new jobs while others are
  running if the load average is not below LOAD (a floating-point number).

* There is support in place for implementations of remote command execution
  in Make.  See the file remote.c.

Version 3.26

* No more than 10 directories will be kept open at once.
  (This number can be changed by redefining MAX_OPEN_DIRECTORIES in dir.c.)

Version 3.25

* Archive files will have their modification times recorded before doing
  anything that might change their modification times by updating an archive
  member.

Version 3.20

* The `MAKELEVEL' variable is defined for use by makefiles.

Version 3.19

* The recursion level indications in error messages are much shorter than
  they were in version 3.14.

Version 3.18

* Leading spaces before directives are ignored (as documented).

* Included makefiles can determine the default goal target.
  (System V Make does it this way, so we are being compatible).

Version 3.14.

* Variables that are defaults built into Make will not be put in the
  environment for children.  This just saves some environment space and,
  except under -e, will be transparent to sub-makes.

* Error messages from sub-makes will indicate the level of recursion.

* Hopefully some speed-up for large directories due to a change in the
  directory hashing scheme.

* One child will always get a standard input that is usable.

* Default makefiles that don't exist will be remade and read in.

Version 3.13.

* Count parentheses inside expansion function calls so you can
  have nested calls: `$(sort $(foreach x,a b,$(x)))'.

Version 3.12.

* Several bug fixes, including USG and Sun386i support.

* `shell' function to expand shell commands a la `

* If the `-d' flag is given, version information will be printed.

* The `-c' option has been renamed to `-C' for compatibility with tar.

* The `-p' option no longer inhibits other normal operation.

* Makefiles will be updated and re-read if necessary.

* Can now run several recipes at once (parallelism), -j option.

* Error messages will contain the level of Make recursion, if any.

* The `MAKEFLAGS' and `MFLAGS' variables will be scanned for options after
  makefiles are read.

* A double-colon rule with no dependencies will always have its recipe run.
  (This is how both the BSD and System V versions of Make do it.)

Version 3.05

(Changes from versions 1 through 3.05 were never recorded.  Sorry.)

-------------------------------------------------------------------------------
Copyright (C) 1988-2013 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 <http://www.gnu.org/licenses/>.
