New in 2.0:

* Compilation and object files:

 - If a source file is placed in a subdirectory, the corresponding compiled
   object will *always* be put into the subdirectory named after the source
   file, rather than in the current directory.  For instance, 'src/file.c'
   and 'src/file.f90' will be compiled to 'src/file.o', and 'sub/dir/mu.cc'
   will be compiled to 'sub/dir/mu.o'.  Put in another way, Automake 2.0
   and later will *unconditionally* behave as older Automake versions did
   when the 'subdir-objects' option was given.

* Texinfo support:

  - Automake used to implement an undocumented hack causing '.info' files
    that appeared to be cleaned (by e.g. being listed in the CLEANFILES
    variable) to also be built in the builddir rather than in the srcdir;
    this was for backward compatibility with packages such as Texinfo,
    which did things like:

        info_TEXINFOS = texinfo.txi info-stnd.texi info.texi
        DISTCLEANFILES = texinfo texinfo-* info*.info*
        # Do not create info files for distribution.
        dist-info:
            @:

    in order not to distribute .info files.

    Now that we have the 'info-in-builddir' option that explicitly causes
    generated '.info' files to be placed in the builddir, this hack is no
    longer necessary.  We have thus removed\ it.

* Aclocal search path:

  - Third-party m4 files located in the system-wide aclocal directory,
    as well as in any directory listed in the ACLOCAL_PATH environment
    variable, now take precedence over "built-in" Automake macros.
    For example, assuming Automake is installed in the '/usr/local'
    hierarchy, a definition of the AM_PROG_VALAC macro found in file
    (say) '/usr/local/share/aclocal/my-vala.m4' should take precedence
    over the same-named automake-provided macro, as defined in file
    '/usr/local/share/aclocal-2.0/vala.m4'.

* Obsolescent features flagged:

  - Use of the special makefile variable 'ACLOCAL_AMFLAGS' is deprecated.
    To specify locations of extra m4 files, the 'AC_CONFIG_MACRO_DIR' or
    'AC_CONFIG_MACRO_DIRS' (the latter introduced with autoconf 2.70)
    should be used instead.  And use of the '--install' aclocal option in
    'ACLOCAL_AMFLAGS' has proved to be a bad idea anyway -- see automake
    bug#9037.

* Obsolete features removed:

  - Support for the long-deprecated name 'configure.in' for the Autoconf
    input file has been removed altogether.  Just use the modern name
    'configure.ac' instead.

  - Support for the long-obsolete variable $(ACLOCAL_M4_SOURCES) has
    been removed.  It should be safe to simply remove any definition
    of it you have in your Makefiles.

* Removed support for obsolete platforms:

  - Support for automatic dependency tracking with the SGI C/C++ compilers
    on IRIX has been removed.  The SGI depmode had been reported broken
    "in the wild" already, and we don't think investing time in debugging
    and fixing it would have been worthwhile, especially considering that
    SGI has last updated those compilers in 2006, and is expected to retire
    support for them in December 2013:
    <http://www.sgi.com/services/support/irix_mips_support.html>

  - Support for DJGPP on MS-DOS and/or Windows 95/98/ME has been removed.
    Note that both Cygwin and MSYS/MinGW on modern Windows versions will
    continue to be fully supported.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* WARNING: Future backward-incompatibilities!

  - Makefile recipes generated by Automake 2.0 will expect to use an
    'rm' program that doesn't complain when called without any non-option
    argument if the '-f' option is given (so that commands like "rm -f"
    and "rm -rf" will act as a no-op, instead of raising usage errors).
    This behavior of 'rm' is very widespread in the wild, and it will be
    required in the next POSIX version:

      <http://austingroupbugs.net/view.php?id=542>

    Accordingly, AM_INIT_AUTOMAKE now expands some shell code that checks
    that the default 'rm' program in PATH satisfies this requirement,
    aborting the configure process if this is not the case.  For the
    moment, it's still possible to force the configuration process to
    succeed even with a broken 'rm', that that will no longer be the case
    for Automake 2.0.

  - Automake 2.0 will require Autoconf 2.70 or later (which is still
    unreleased at the moment of writing, but is planned to be released
    before Automake 2.0 is).

  - Automake 2.0 will drop support for the long-deprecated 'configure.in'
    name for the Autoconf input file.  You are advised to start using the
    recommended name 'configure.ac' instead, ASAP.

  - The ACLOCAL_AMFLAGS special make variable will be fully deprecated in
    Automake 2.0: it will raise warnings in the "obsolete" category (but
    still no hard error of course, for compatibilities with the many, many
    packages that still relies on that variable).  You are advised to
    start relying on the new Automake support for AC_CONFIG_MACRO_DIRS
    instead (which was introduced in Automake 1.13).

  - Automake 2.0 will remove support for automatic dependency tracking
    with the SGI C/C++ compilers on IRIX.  The SGI depmode has been
    reported broken "in the wild" already, and we don't think investing
    time in debugging and fixing is worthwhile, especially considering
    that SGI has last updated those compilers in 2006, and retired
    support for them in December 2013:
    <http://www.sgi.com/services/support/irix_mips_support.html>

  - Automake 2.0 will remove support for MS-DOS and Windows 95/98/ME
    (support for them was offered by relying on the DJGPP project).
    Note however that both Cygwin and MSYS/MinGW on modern Windows
    versions will continue to be fully supported.

  - Automake-provided scripts and makefile recipes might (finally!)
    start assuming a POSIX shell in Automake 2.0.  There still is no
    certainty about this though: we'd first like to wait and see
    whether future Autoconf versions will be enhanced to guarantee
    that such a shell is always found and provided by the checks in
    ./configure.

  - Starting from Automake 2.0, third-party m4 files located in the
    system-wide aclocal directory, as well as in any directory listed
    in the ACLOCAL_PATH environment variable, will take precedence
    over "built-in" Automake macros.  For example (assuming Automake
    is installed in the /usr/local hierarchy), a definition of the
    AM_PROG_VALAC macro found in '/usr/local/share/aclocal/my-vala.m4'
    should take precedence over the same-named automake-provided macro
    (defined in '/usr/local/share/aclocal-2.0/vala.m4').

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

New in ?.?.?:

* Miscellaneous changes

  - When subdir-objects is in effect, Automake will now construct
    shorter object file names when no programs and libraries name
    clashes are encountered.  This should make the discouraged use of
    'foo_SHORTNAME' unnecessary in many cases.

* Bugs fixed:

  - Automatic dependency tracking has been fixed to work also when the
    'subdir-object' option is used and some 'foo_SOURCES' definition
    contains unexpanded references to make variables, as in, e.g.:

        a_src = sources/libs/aaa
        b_src = sources/bbb
        foo_SOURCES = $(a_src)/bar.c $(b_src)/baz.c

    With such a setup, the created makefile fragment containing dependency
    tracking information will be correctly placed under the directories
    named 'sources/libs/aaa/.deps' and 'sources/bbb/.deps', rather than
    mistakenly under directories named (literally!) '$(src_a)/.deps' and
    '$(src_b)/.deps' (this was the first part of automake bug#13928).

    Notice that in order to fix this bug we had to slightly change the
    semantics of how config.status bootstraps the makefile fragments
    required for the dependency tracking to work: rather than attempting
    to parse the Makefiles via grep and sed trickeries only, we actually
    invoke 'make' on a slightly preprocessed version of those Makefiles,
    using a private target that is only meant to bootstrap the required
    makefile fragments.

  - The 'subdir-object' option no longer causes object files corresponding
    to source files specified with an explicit '$(srcdir)' component to be
    placed in the source tree rather than in the build tree.

    For example, if Makefile.am contains:

        AUTOMAKE_OPTIONS = subdir-objects
        foo_SOURCES = $(srcdir)/foo.c $(srcdir)/s/bar.c $(top_srcdir)/baz.c

    then "make all" will create 'foo.o' and 's/bar.o' in $(builddir) rather
    than in $(srcdir), and will create 'baz.o' in $(top_builddir) rather
    than in $(top_srcdir).

    This was the second part of automake bug#13928.

  - Installed 'aclocal' m4 macros can now accept installation directories
    containing '@' characters (automake bug#20903)

  - When combining AC_LIBOBJ or AC_FUNC_ALLOCA with the
    "--disable-dependency-tracking" configure option in an out of source
    build, the build sub-directory defined by AC_CONFIG_LIBOBJ_DIR is now
    properly created.  (automake bug#27781)

  - The time printed by 'mdate-sh' is now using the UTC time zone to support
    the reproducible build effort.  (automake bug#20314)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

New in 1.15.1:

* Bugs fixed:

  - The code has been adapted to remove a warning present since Perl
    5.22 stating that "Unescaped left brace in regex is deprecated".
    This warning has become an hard error in Perl 5.26 (bug#22372).

  - The generated Makefiles do not rely on the obsolescent GZIP
    environment variable which was used for passing arguments to
    'gzip'.  Compatibility with old versions has been
    preserved. (bug#20132)

* Miscellaneous changes:

  - Support the Windows version of the Intel C Compiler (icl) in the
    'compile' script in the same way the (compatible) Microsoft C
    Compiler is supported.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

New in 1.15:

* Improvements and refactorings in the install-sh script:

  - It has been modernized, and now makes the following assumptions
    *unconditionally*:
    (1) a working 'dirname' program is available;
    (2) the ${var:-value} shell parameters substitution works;
    (3) the "set -f" and "set +f" shell commands work, and, respectively,
        disable and enable shell globbing.

  - The script implements stricter error checking, and now it complains
    and bails out if any of the following expectations is not met:
    (1) the options -d and -t are never used together;
    (2) the argument passed to option -t is a directory;
    (3) if there are two or more SOURCEFILE arguments, the
        DESTINATION argument must be a directory.

* Automake-generated testsuites:

  - The default test-driver used by the Automake-generated testsuites
    now appends the result and exit status of each "plain" test to the
    associated log file (automake bug#11814).

  - The perl implementation of the TAP testsuite driver is no longer
    installed in the Automake's scripts directory, and is instead just
    distributed as a "contrib" addition.  There should be no reason to
    use this implementation anyway in real packages, since the awk+shell
    implementation of the TAP driver (which is documented in the manual)
    is more portable and has feature parity with the perl implementation.

  - The rule generating 'test-suite.log' no longer risk incurring in an
    extra useless "make all" recursive invocation in some corner cases
    (automake bug#16302).

* Distribution:

  - Automake bug#18286: "make distcheck" could sometimes fail to detect
    files missing from the distribution tarball, especially in those cases
    where both the generated files and their dependencies are explicitly
    in $(srcdir).  An important example of this are *generated* makefile
    fragments included at Automake time in Makefile.am; e.g.:

        ...
        $(srcdir)/fragment.am: $(srcdir)/data.txt $(srcdir)/preproc.sh
            cd $(srcdir) && $(SHELL) preproc.sh <data.txt >fragment.am
        include $(srcdir)/fragment.am
        ...

    If the use forgot to add data.txt and/or preproc.sh in the distribution
    tarball, "make distcheck" would have erroneously succeeded!  This issue
    is now fixed.

  - As a consequence of the previous change, "make distcheck" will run
    using '$(distdir)/_build/sub' as the build directory, rather than
    simply '$(distdir)/_build' (as it was the case for Automake 1.14 and
    earlier).  Consequently, the './configure' and 'make' invocations
    issued by the distcheck recipe now have $(srcdir) equal to '../..',
    rather than to just '..'.  Dependent and similar variables (e.g.,
    '$(top_srcdir)') are also changed accordingly.

    Thus, Makefiles that made assumptions about the exact values of the
    build and source directories used by "make distcheck" will have to
    be adjusted.  Notice that making such assumptions was a bad and
    unsupported practice anyway, since the exact locations of those
    directories should be considered implementation details, and we
    reserve the right to change them at any time.

* Miscellaneous bugs fixed:

  - The expansion of AM_INIT_AUTOMAKE ends once again with a trailing
    newline (bug#16841).  Regression introduced in Automake 1.14.

  - We no longer risk to use '$ac_aux_dir' before it's defined (see
    automake bug#15981). Bug introduced in Automake 1.14.

  - The code used to detect whether the currently used make is GNU make
    or not (relying on the private macro 'am__is_gnu_make') no longer
    risks causing "Arg list too long" for projects using automatic
    dependency tracking and having a ton of source files (bug#18744).

  - Automake tries to offer a more deterministic output for generated
    Makefiles, in the face of the newly-introduced randomization for
    hash keys order in Perl 5.18.

  - In older Automake versions, if a user defined one single Makefile
    fragment (say 'foo.am') to be included via Automake includes in
    his main Makefile.am, and defined a custom make rule to generate that
    file from other data, Automake used to spuriously complain with some
    message like "... overrides Automake target '$(srcdir)/foo.am".
    This bug is now fixed.

  - The user can now extend the special .PRECIOUS target, the same way
    he could already do with the .MAKE .and .PHONY targets.

  - Some confusing typos have been fixed in the manual and in few warning
    messages (automake bug#16827 and bug#16997).

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

New in 1.14.1:

* Bugs fixed:

  - The user is no longer allowed to override the --srcdir nor the --prefix
    configure options used by "make distcheck" (bug#14991).

  - Fixed a gross inefficiency in the recipes for installing byte-compiled
    python files, that was causing an O(N^2) performance on the number N of
    files, instead of the expected O(N) performance.  Note that this bug
    was only relevant when the number of python files was high (which is
    unusual in practice).

  - Automake try to offer a more deterministic output for warning messages,
    in the face of the newly-introduced randomization for hash keys order
    in Perl 5.18.

  - The 'test-driver' script now actually error out with a clear error
    message on the most common invalid usages.

  - Several spurious failures/hangs in the testsuite (bugs #14706, #14707,
    #14760, #14911, #15181, #15237).

* Documentation fixes:

  - Fixed typos in the 'fix-timestamp.sh' example script that made it
    nonsensical.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

New in 1.14:

* C compilation, and the AC_PROG_CC and AM_PROG_CC_C_O macros:

  - The 'compile' script is now unconditionally required for all packages
    that perform C compilation (if you are using the '--add-missing'
    option, automake will fetch that script for you, so you shouldn't
    need any explicit adjustment).  This new behaviour is needed to avoid
    obscure errors when the 'subdir-objects' option is used, and the
    compiler is an inferior one that doesn't grasp the combined use of
    both the "-c -o" options; see discussion about automake bug#13378 for
    more details:
    <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=13378#35>
    <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=13378#44>

  - The next major Automake version (2.0) will unconditionally activate
    the 'subdir-objects' option.  In order to smooth out the transition,
    we now give a warning (in the category 'unsupported') whenever a
    source file is present in a subdirectory but the 'subdir-object' is
    not enabled.  For example, the following usage will trigger such a
    warning:

        bin_PROGRAMS = sub/foo
        sub_foo_SOURCES = sub/main.c sub/bar.c

  - Automake will automatically enhance the autoconf-provided macro
    AC_PROG_CC to force it to check, at configure time, that the
    C compiler supports the combined use of both the '-c' and '-o'
    options.  The result of this check is saved in the cache variable
    'am_cv_prog_cc_c_o', and said result can be overridden by
    pre-defining that variable.

  - The AM_PROG_CC_C_O macro can still be called, albeit that should no
    longer be necessary. This macro is now just a thin wrapper around the
    Automake-enhanced AC_PROG_CC.  This means, among the other things,
    that its behaviour is changed in three ways:

      1. It no longer invokes the Autoconf-provided AC_PROG_CC_C_O
         macro behind the scenes.

      2. It caches the check result in the 'am_cv_prog_cc_c_o' variable,
         and not in a 'ac_cv_prog_cc_*_c_o' variable whose exact name is
         dynamically computed only at configure runtime (really!) from
         the content of the '$CC' variable.

      3. It no longer automatically AC_DEFINE the C preprocessor
         symbol 'NO_MINUS_C_MINUS_O'.

* Texinfo support:

  - Automake can now be instructed to place '.info' files generated from
    Texinfo input in the builddir rather than in the srcdir; this is done
    specifying the new automake option 'info-in-builddir'.  This feature
    was requested by the developers of GCC, GDB, GNU binutils and the GNU
    bfd library.  See the extensive discussion about automake bug#11034
    for more details.

  - For quite a long time, Automake has been implementing an undocumented
    hack which ensured that '.info' files which appeared to be cleaned
    (by being listed in the CLEANFILES or DISTCLEANFILES variables) were
    built in the builddir rather than in the srcdir; this hack was
    introduced to ensure better backward-compatibility with package
    such as Texinfo, which do things like:

        info_TEXINFOS = texinfo.txi info-stnd.texi info.texi
        DISTCLEANFILES = texinfo texinfo-* info*.info*
        # Do not create info files for distribution.
        dist-info:
            @:

    in order not to distribute generated '.info' files.

    Now that we have the 'info-in-builddir' option that explicitly causes
    generated '.info' files to be placed in the builddir, this hack should
    be longer necessary, so we deprecate it with runtime warnings.
    It will be removed altogether in Automake 2.0.

* Relative directory in Makefile fragments:

  - The special Automake-time substitutions '%reldir%' and '%canon_reldir%'
    (and their short versions, '%D%' and '%C%' respectively) can now be used
    in an included Makefile fragment.  The former is substituted with the
    relative directory of the included fragment (compared to the top-level
    including Makefile), and the latter with the canonicalized version of
    the same relative directory.

        # in 'Makefile.am':
        bin_PROGRAMS = # will be updated by included Makefile fragments
        include src/Makefile.inc

        # in 'src/Makefile.inc':
        bin_PROGRAMS += %reldir%/foo
        %canon_reldir%_foo_SOURCES = %reldir%/bar.c

    This should be especially useful for packages using a non-recursive
    build system.

* Deprecated distribution formats:

  - The 'shar' and 'compress' distribution formats are deprecated, and
    scheduled for removal in Automake 2.0.  Accordingly, the use of the
    'dist-shar' and 'dist-tarZ' will cause warnings at automake runtime
    (in the 'obsolete' category), and the recipes of the Automake-generated
    targets 'dist-shar' and 'dist-tarZ' will unconditionally display
    (non-fatal) warnings at make runtime.

* New configure runtime warnings about "rm -f" support:

  - To simplify transition to Automake 2.0, the shell code expanded by
    AM_INIT_AUTOMAKE now checks (at configure runtime) that the default
    'rm' program in PATH doesn't complain when called without any
    non-option argument if the '-f' option is given (so that commands like
    "rm -f" and "rm -rf" act as a no-op, instead of raising usage errors).
    If this is not the case, the configure script is aborted, to call the
    attention of the user on the issue, and invite him to fix his PATH.
    The checked 'rm' behavior is very widespread in the wild, and will be
    required by future POSIX versions:

        <http://austingroupbugs.net/view.php?id=542>

    The user can still force the configure process to complete even in the
    presence of a broken 'rm' by defining the ACCEPT_INFERIOR_RM_PROGRAM
    environment variable to "yes".  And the generated Makefiles should
    still work correctly even when such broken 'rm' is used.  But note
    that this will no longer be the case with Automake 2.0 though, so, if
    you encounter the warning, please report it to us ASAP (and try to fix
    your environment as well).

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

New in 1.13.4:

* Bugs fixed:

  - Fix a minor regression introduced in Automake 1.13.3: when two or more
    user-defined suffix rules were present in a single Makefile.am,
    automake would needlessly include definition of some make variables
    related to C compilation in the generated Makefile.in (bug#14560).

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

New in 1.13.3:

* Documentation fixes:

  - The documentation no longer mistakenly reports that the obsolete
    'AM_MKDIR_PROG_P' macro and '$(mkdir_p)' make variable are going
    to be removed in Automake 2.0.

* Bugs fixed:

  - Byte-compilation of Emacs lisp files could fail spuriously on
    Solaris,  when /bin/ksh or /usr/xpg4/bin/sh were used as shell.

  - If the same user-defined suffixes were transformed into different
    Automake-known suffixes in different Makefile.am files in the same
    project, automake could get confused and generate inconsistent
    Makefiles (automake bug#14441).
    For example, if 'Makefile.am' contained a ".ext.cc:" suffix rule,
    and 'sub/Makefile.am' contained a ".ext.c:" suffix rule, automake
    would have mistakenly placed into 'Makefile.in' rules to compile
    "*.c" files into object files, and into 'sub/Makefile.in' rules to
    compile "*.cc" files into object files --- rather than the other
    way around.  This is now fixed.

* Testsuite work:

  - The test cases no longer have the executable bit set.  This should
    make it clear that they are not meant to be run directly; as
    explained in t/README, they can only be run through the custom
    'runtest' script, or by a "make check" invocation.

  - The testsuite has seen the introduction of a new helper function
    'run_make', and several related changes.  These serve a two-fold
    purpose:

     1. Remove brittleness due to the use of "make -e" in test cases.

     2. Seamlessly allow the use of parallel make ("make -j...") in the
        test cases, even where redirection of make output is involved
        (see automake bug#11413 for a description of the subtle issues
        in this area).

  - Several spurious failures have been fixed (they hit especially
    MinGW/MSYS builds).  See automake bugs #14493, #14494, #14495,
    #14498, #14499, #14500, #14501, #14517 and #14528.

  - Some other minor miscellaneous changes and fixlets.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

New in 1.13.2:

* Documentation fixes:

  - The long-deprecated but still supported two-arguments invocation form
    of AM_INIT_AUTOMAKE is documented once again.  This seems the sanest
    thing to do, given that support for such usage might need to remain
    in place for an unspecified amount of time in order to cater to people
    who want to define the version number for their package dynamically at
    configure runtime (unfortunately, Autoconf does not yet support this
    scenario, so we cannot delegate the work to it).

  - The serial testsuite harness is no longer reported as "deprecated",
    but as "discouraged".  We have no plan to remove it, nor to make its
    use cause runtime warnings.

  - The parallel testsuite is no longer reported as "experimental"; it
    is well tested, and should be stable now.

  - The 'shar' and 'tarZ' distribution formats and the 'dist-shar' and
    'dist-tarZ' options are obsolescent, and their use is deprecated
    in the documentation.

  - Other minor miscellaneous fixes and improvements; in particular,
    some improvements in cross-references.

* Obsolescent features:

  - Use of suffix-less info files (that can be specified through the
    '@setfilename' macro in Texinfo input files) is discouraged, and
    its use will raise warnings in the 'obsolete' category.  Simply
    use the '.info' extension for all your info files, transforming
    usages like:

        @setfilename myprogram

    into:

        @setfilename myprogram.info

  - Use of Texinfo input files with '.txi' or '.texinfo' extensions
    is discouraged, and its use will raise warnings in the 'obsolete'
    category.  You are advised to simply use the '.texi' extension
    instead.

* Bugs fixed:

  - When the 'ustar' option is used, the generated configure script no
    longer risks hanging during the tests for the availability of the
    'pax' utility, even if the user running configure has a UID or GID
    that requires more than 21 bits to be represented.
    See automake bug#8343 and bug#13588.

  - The obsolete macros AM_CONFIG_HEADER or AM_PROG_CC_STDC work once
    again, as they did in Automake 1.12.x (albeit printing runtime
    warnings in the 'obsolete' category).  Removing them has turned
    out to be a very bad idea, because it complicated distro packing
    enormously.  Making them issue fatal warnings, as we did in
    Automake 1.13, has turned out to be a similarly very bad idea,
    for exactly the same reason.

  - aclocal will no longer error out if the first local m4 directory
    (as specified by the '-I' option or the 'AC_CONFIG_MACRO_DIRS' or
    'AC_CONFIG_MACRO_DIR' macros) doesn't exist; it will merely report
    a warning in the 'unsupported' category.  This is done to support
    some pre-existing real-world usages.  See automake bug#13514.

  - aclocal will no longer consider directories for extra m4 files more
    than once, even if they are specified multiple times.  This ensures
    packages that specify both

        AC_CONFIG_MACRO_DIR([m4])       in configure.ac
        ACLOCAL_AMFLAGS = -I m4         in Makefile.am

    will work correctly, even when the 'm4' directory contains no
    package-specific files, but is used only to install third-party
    m4 files (as can happen with e.g., "libtoolize --install").
    See automake bug#13514.

  - Analysis of make flags in Automake-generated rules has been made more
    robust, and more future-proof.  For example, in presence of make that
    (like '-I') take an argument, the characters in said argument will no
    longer be spuriously considered as a set of additional make options.
    In particular, automake-generated rules will no longer spuriously
    believe to be running in dry mode ("make -n") if run with an invocation
    like "make -I noob"; nor will they believe to be running in keep-going
    mode ("make -k") if run with an invocation like "make -I kool"
    (automake bug#12554).

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

New in 1.13.1:

* Bugs fixed:

  - Use of the obsolete macros AM_CONFIG_HEADER or AM_PROG_CC_STDC now
    causes a clear and helpful error message, instead of obscure ones
    (issue introduced in Automake 1.13).

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

New in 1.13:

* Bugs fixed:

  - ylwrap renames properly header guards in generated header files
    (*.h), instead of leaving Y_TAB_H.

  - ylwrap now also converts header guards in implementation files
    (*.c).  Because ylwrap failed to rename properly #include in the
    implementation files, current versions of Bison (e.g., 2.7)
    duplicate the generated header file in the implementation file.
    The header guard then protects the implementation file from
    duplicate definitions from the header file.

* Version requirements:

  - Autoconf 2.65 or greater is now required.

  - The rules to build PDF and DVI output from Texinfo input now
    require Texinfo 4.9 or later.

* Obsolete features:

  - Support for the "Cygnus-style" trees (once enabled by the 'cygnus'
    option) has been removed.  See discussion about automake bug#11034
    for more background: <https://debbugs.gnu.org/11034>.

  - The deprecated aclocal option '--acdir' has been removed.  You
    should use the options '--automake-acdir' and '--system-acdir'
    instead (which have been introduced in Automake 1.11.2).

  - The following long-obsolete m4 macros have been removed:

      AM_PROG_CC_STDC:    superseded by AC_PROG_CC since October 2002
      fp_PROG_CC_STDC:    broken alias for AM_PROG_CC_STDC
      fp_WITH_DMALLOC:    old alias for AM_WITH_DMALLOC
      AM_CONFIG_HEADER:   superseded by AC_CONFIG_HEADERS since July 2002
      ud_PATH_LISPDIR:    old alias for AM_PATH_LISPDIR
      jm_MAINTAINER_MODE: old alias for AM_MAINTAINER_MODE
      ud_GNU_GETTEXT:     old alias for AM_GNU_GETTEXT
      gm_PROG_LIBTOOL:    old alias for AC_PROG_LIBTOOL
      fp_C_PROTOTYPES:    old alias for AM_C_PROTOTYPES (which was part
                          of the now-removed automatic de-ANSI-fication
                          support of Automake)

  - All the "old alias" macros in 'm4/obsolete.m4' have been removed.

  - Use of the long-deprecated two- and three-arguments invocation forms
    of the AM_INIT_AUTOMAKE is no longer documented.  It's still supported
    though (albeit with a warning in the 'obsolete' category), to cater
    for people who want to define the version number for their package
    dynamically (e.g., from the current VCS revision).  We'll have to
    continue this support until Autoconf itself is fixed to allow better
    support for such dynamic version numbers.

* Elisp byte-compilation:

  - The byte compilation of '.el' files into '.elc' files is now done
    with a suffix rule.  This has simplified the compilation process, and
    more importantly made it less brittle.  The downside is that emacs is
    now invoked once for each '.el' files, which cause some noticeable
    slowdowns.  These should however be mitigated on multicore machines
    (which are becoming the norm today) if concurrent  make ("make -j")
    is used.

  - Elisp files placed in a subdirectory are now byte-compiled to '.elc'
    files in the same subdirectory; for example, byte-compiling of file
    'sub/foo.el' file will result in 'sub/foo.elc' rather than in
    'foo.elc'.  This behaviour is backward-incompatible with older
    Automake versions, but it is more natural and more sane.  See also
    automake bug#7441.

  - The Emacs invocation performing byte-compilation of '.el' files honors
    the $(AM_ELCFLAGS) and $(ELCFLAGS) variables; as typical, the former
    one is  developer-reserved and the latter one user-reserved.

  - The 'elisp-comp' script, once provided by Automake, has been rendered
    obsoleted by the just-described changes, and thus removed.

* Changes to Automake-generated testsuite harnesses:

  - The parallel testsuite harness (previously only enabled by the
    'parallel-tests' option) is the default one; the older serial
    testsuite harness will still be available through the use of the
    'serial-tests' option (introduced in Automake 1.12).

  - The 'color-tests' option is now unconditionally activated by default.
    In particular, this means that testsuite output is now colorized by
    default if the attached terminal seems to support ANSI escapes, and
    that the user can force output colorization by setting the variable
    AM_COLOR_TESTS to "always".  The 'color-tests' is still recognized
    for backward-compatibility, although it's a handled as a no-op now.

* Silent rules support:

  - Support for silent rules is now always active in Automake-generated
    Makefiles.  So, although the verbose output is still the default,
    the user can now always use "./configure --enable-silent-rules" or
    "make V=0" to enable quieter output in the package he's building.

  - The 'silent-rules' option has now become a no-op, preserved for
    backward-compatibility only.  In particular, its use no longer
    disables the warnings in the 'portability-recursive' category.

* Texinfo Support:

  - The rules to build PDF and DVI files from Texinfo input now require
    Texinfo 4.9 or later.

  - The rules to build PDF and DVI files from Texinfo input now use the
    '--build-dir' option, to keep the auxiliary files used by texi2dvi
    and texi2pdf around without cluttering the build directory, and to
    make it possible to run the "dvi" and "pdf" recipes in parallel.

* Automatic remake rules and 'missing' script:

  - The 'missing' script no longer tries to update the timestamp of
    out-of-date files that require a maintainer-specific tool to be
    remade, in case the user lacks such a tool (or has a too-old version
    of it).  It just gives a useful warning, and in some cases also a
    tip about how to obtain such a tool.

  - The missing script has thus become useless as a (poor) way to work
    around the sketched-timestamps issues that can happen for projects
    that keep generated files committed in their VCS repository.  Such
    projects are now encouraged to write a custom "fix-timestamps.sh"
    script to avoid such issues; a simple example is provided in the
    "CVS and generated files" chapter of the automake manual.

* Recursive targets:

  - The user can now define his own recursive targets that recurse
    in the directories specified in $(SUBDIRS).  This can be done by
    specifying the name of such targets in invocations of the new
    'AM_EXTRA_RECURSIVE_TARGETS' m4 macro.

* Tags:

  - Any failure in the recipe of the "tags", "ctags", "cscope" or
    "cscopelist" targets in a subdirectory is now propagated to the
    top-level make invocation.

  - Tags are correctly computed also for files in _SOURCES variables that
    only list files with non-standard suffixes (see automake bug#12372).

* Improvements to aclocal and related rebuilds rules:

  - Autoconf-provided macros AC_CONFIG_MACRO_DIR and AC_CONFIG_MACRO_DIRS
    are now traced by aclocal, and can be used to declare the local m4
    include directories.  Formerly, one had to specify it with an explicit
    '-I' option to the 'aclocal' invocation.

  - The special make variable ACLOCAL_AMFLAGS is deprecated; future
    Automake versions will warn about its use, and later version will
    remove support for it altogether.

* The depcomp script:

  - Dropped support for libtool 1.4.

  - Various internal refactorings.  They should cause no visible change,
    but the chance for regression is there anyway, so please report any
    unexpected or suspicious behaviour.

  - Support for pre-8.0 versions of the Intel C Compiler has been dropped.
    This should cause no problem, since icc 8.0 has been released in
    December 2003 -- almost nine years ago.

  - Support for tcc (the Tiny C Compiler) has been improved, and is now
    handled through a dedicated 'tcc' mode.

* The ylwrap script:

  - ylwrap generates header guards with a single '_' for series of non
    alphabetic characters, instead of several.  This is what Bison >=
    2.5.1 does.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Bugs fixed in 1.12.6:

* Python-related bugs:

  - The default installation location for python modules has been improved
    for Python 3 on Debian and Ubuntu systems, changing from:

        ${prefix}/lib/python3/dist-packages

    to

        ${prefix}/lib/python3.x/site-packages

    This change should ensure modules installed using the default ${prefix}
    "/usr/local" are found by default by system python 3.x installations.
    See automake bug#10227.

  - Python byte-compilation supports the new layout mandated by PEP-3147,
    with its __pycache__ directory (automake bug#8847).

* Build system issues:

  - The maintainer rebuild rules for Makefiles and aclocal.m4 in
    Automake's own build system works correctly again (bug introduced
    in Automake 1.12.5).

* Testsuite issues:

  - The Vala-related tests has been changed to adjust to the removal of
    the 'posix' profile in the valac compiler.  See automake bug#12934
    a.k.a. bug#12522.

  - Some spurious testsuite failures related to older tools and systems
    have been fixed.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

New in 1.12.5:

* Vala support:

  - The AM_PROG_VALAC macro has been enhanced to takes two further
    optional arguments; it's signature now being

        AM_PROG_VALAC([MINIMUM-VERSION], [ACTION-IF-FOUND],
                      [ACTION-IF-NOT-FOUND])

  - By default, AM_PROG_VALAC no longer aborts the configure invocation
    if the Vala compiler found is too old, but simply prints a warning
    messages (as it did when the Vala compiler was not found).  This
    should avoid unnecessary difficulties for end users that just want
    to compile the unmodified, distributed Vala-generated C sources,
    but happens to have an old Vala compiler in their PATH.  This fixes
    automake bug#12688.

  - If no proper Vala compiler is found at configure runtime, AM_PROG_VALAC
    will set the AC_SUBST'd variable 'VALAC' to 'valac' rather than to ':'.
    This is a better default, because with it a triggered makefile rule
    invoking a Vala compilation will clearly fail with an informative error
    message like "valac: command not found", rather than silently, with
    the error possibly going unnoticed or triggering harder-to-diagnose
    fallout failures in later steps.

* Miscellaneous changes:

  - automake and aclocal no longer honours the 'perllibdir' environment
    variable.  That had always been intended only as an hack required in
    the testsuite, not meant for any use beyond that.

Bugs fixed in 1.12.5:

* Long-standing bugs:

  - Automake no longer generates spurious remake rules invoking autoheader
    to regenerate the template corresponding to header files specified after
    the first one in AC_CONFIG_HEADERS (automake bug#12495).

  - When wrapping Microsoft tools, the 'compile' script falls back to
    finding classic 'libname.a' style libraries when 'name.lib' and
    'name.dll.lib' aren't available.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

New in 1.12.4:

* Warnings and deprecations:

  - Warnings in the 'obsolete' category are enabled by default both in
    automake and aclocal.

* Miscellaneous changes:

  - Some testsuite weaknesses and spurious failures have been fixed.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

New in 1.12.3:

* Miscellaneous changes:

  - The '.m4' files provided by Automake no longer define serial numbers.
    This should cause no difference in the behaviour of aclocal though.

  - Some testsuite weaknesses and spurious failures have been fixed.

  - There is initial support for automatic dependency tracking with the
    Portland Group C/C++ compilers, thanks to the new new depmode 'pgcc'.

Bugs fixed in 1.12.3:

* Long-standing bugs:

  - Instead of renaming only self-references of files (typically for
    #lines), ylwrap now also renames references to the other generated
    files.  This fixes support for GLR and C++ parsers from Bison (PR
    automake/491 and automake bug#7648): 'parser.c' now properly
    #includes 'parser.h' instead of 'y.tab.h'.

  - Generated files unknown to ylwrap are now preserved.  This fixes
    C++ support for Bison (automake bug#7648): location.hh and the
    like are no longer discarded.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

New in 1.12.2:

* Warnings and deprecations:

  - Automake now issues a warning (in the 'portability' category) if
    'configure.in' is used instead of 'configure.ac' as the Autoconf
    input file.  Such a warning will also be present in the next
    Autoconf version (2.70).

* Cleaning rules:

  - Recursive cleaning rules descends into the $(SUBDIRS) in the natural
    order (as done by the other recursive rules), rather than in the
    inverse order.  They used to do that in order to work a round a
    limitation in an older implementation of the automatic dependency
    tracking support, but that limitation had been lifted years ago
    already, when the automatic dependency tracking based on side-effects
    of compilation had been introduced.

  - Cleaning rules for compiled objects (both "plain" and libtool) work
    better when subdir objects are involved, not triggering a distinct
    'rm' invocation for each such object.  They do so by removing *any*
    compiled object file that is in the same directory of a subdir
    object.  See automake bug#10697.

* Silent rules support:

  - A new predefined $(AM_V_P) make variable is provided; it expands
    to a shell conditional that can be used in recipes to know whether
    make is being run in silent or verbose mode.

Bugs fixed in 1.12.2:

* SECURITY VULNERABILITIES!

  - The 'distcheck' recipe no longer grants temporary world-write
    permissions on the extracted distdir.  Even if such rights were
    only granted for a vanishingly small time window, the implied
    race condition proved to be enough to allow a local attacker
    to run arbitrary code with the privileges of the user running
    "make distcheck".  This is CVE-2012-3386.

* Long-standing bugs:

  - The "recheck" targets behaves better in the face of build failures
    related to previously failed tests.  For example, if a test is a
    compiled program that must be rerun by "make recheck", and its
    compilation fails, it will still be rerun by further "make recheck"
    invocations.  See automake bug#11791.

* Bugs introduced by 1.12.1:

  - Automake provides once again the '$(mkdir_p)' make variable and the
    '@mkdir_p@' substitution (both as simple aliases for '$(MKDIR_P)'),
    for better backward-compatibility.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

New in 1.12.1:

* New supported languages:

  - Support for Objective C++ has been added; it should work similarly to
    the support for Objective C.

* Deprecated obsolescent features:

  - Use of the long-deprecated two- and three-arguments invocation forms
    of the AM_INIT_AUTOMAKE macro now elicits a warning in the 'obsolete'
    category.  Starting from some future major Automake release (likely
    post-1.13), such usages will no longer be allowed.

  - Support for the "Cygnus-style" trees (enabled by the 'cygnus' option) is
    now deprecated (its use triggers a warning in the 'obsolete' category).
    It will be removed in the next major Automake release (1.13).

  - The long-obsolete (since 1.10) automake-provided $(mkdir_p) make
    variable, @mkdir_p@ configure-time substitution and AM_PROG_MKDIR
    m4 macro are deprecated, eliciting a warning in the 'obsolete'
    category.

* Miscellaneous changes:

  - The Automake test cases now require a proper POSIX-conforming shell.
    Older non-POSIX Bourne shells (like Solaris 10 /bin/sh) will no longer
    be accepted.  In most cases, the user shouldn't have to specify such
    POSIX shell explicitly, since it will be looked up at configure time.
    Still, when this lookup fails, or when the user wants to override its
    conclusion, the variable 'AM_TEST_RUNNER_SHELL' can be used (pointing
    to the shell that will be used to run the Automake test cases).

Bugs fixed in 1.12.1:

* Bugs introduced by 1.12:

  - Several weaknesses in Automake's own build system and test suite
    have been fixed.

* Bugs introduced by 1.11.3:

  - When given non-option arguments, aclocal rejects them, instead of
    silently ignoring them.

* Long-standing bugs:

  - When the 'color-tests' option is in use, forcing of colored testsuite
    output through "AM_COLOR_TESTS=always" works even if the terminal is
    a non-ANSI one, i.e., if the TERM environment variable has a value of
    "dumb".

  - Several inefficiencies and poor performances in the implementation
    of the parallel-tests 'check' and 'recheck' targets have been fixed.

  - The post-processing of output "#line" directives done the ylwrap
    script is more faithful w.r.t. files in a subdirectory; for example,
    if the processed file is "src/grammar.y", ylwrap will correctly
    produce directives like:
        #line 7 "src/grammar.y"
    rather than like
        #line 7 "grammar.y"
    as it did before.

* Bugs with new Perl versions:

  - Aclocal works correctly with perl 5.16.0 (automake bug#11543).

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

New in 1.12:

* Obsolete features removed:

  - The never documented nor truly used script 'acinstall' has been
    removed.

  - Support for automatic de-ANSI-fication has been removed.

  - The support for the "obscure" multilib feature has been removed
    from Automake core (but remains available in the 'contrib/'
    directory of the Automake distribution).

  - Support for ".log -> .html" conversion and the check-html and
    recheck-html targets has been removed from Automake core (but
    remains available in the 'contrib/' directory of the Automake
    distribution).

  - The deprecated 'lzma' compression format for distribution archives
    has been removed, in favor of 'xz' and 'lzip'.

  - The obsolete AM_WITH_REGEX macro has been removed.

  - The long-deprecated options '--output-dir', '--Werror' and
    '--Wno-error' have been removed.

  - The chapter on the history of Automake has been moved out of the
    reference manual, into a new dedicated Texinfo file.

* New targets:

  - New 'cscope' target to build a cscope database for the source tree.

* Changes to Automake-generated testsuite harnesses:

  - The new automake option 'serial-tests' has been introduced.  It can
    be used to explicitly instruct automake to use the older serial
    testsuite harness.  This is still the default at the moment, but it
    might change in future versions.

  - The 'recheck' target (provided by the parallel testsuite harness) now
    depends on the 'all' target.  This allows for a better user-experience
    in test-driven development.  See automake bug#11252.

  - Test scripts that exit with status 99 to signal an "hard error" (e.g.,
    and unexpected or internal error, or a failure to set up the test case
    scenario) have their outcome reported as an 'ERROR' now.  Previous
    versions of automake reported such an outcome as a 'FAIL' (the only
    difference with normal failures being that hard errors were counted
    as failures even when the test originating them was listed in
    XFAIL_TESTS).

  - The testsuite summary displayed by the parallel-test harness has a
    completely new format, that always list the numbers of passed, failed,
    xfailed, xpassed, skipped and errored tests, even when these numbers
    are zero (but using smart coloring when the color-tests option is in
    effect).

  - The default testsuite driver offered by the 'parallel-tests' option is
    now implemented (partly at least) with the help of automake-provided
    auxiliary scripts (e.g., 'test-driver'), instead of relying entirely
    on code in the generated Makefile.in.
    This has two noteworthy implications.  The first one is that projects
    using the 'parallel-tests' option should now either run automake with
    the '--add-missing' option, or manually copy the 'test-driver' script
    into their tree.  The second, and more important, implication is that
    now, when the 'parallel-tests' option is in use, TESTS_ENVIRONMENT can
    no longer be used to define a test runner, and the command specified
    in LOG_COMPILER (and <ext>_LOG_COMPILER) must be a *real* executable
    program or script.  For example, this is still a valid usage (albeit
    a little contorted):

      TESTS_ENVIRONMENT = \
        if test -n '$(STRICT_TESTS)'; then \
          maybe_errexit='-e'; \
        else \
          maybe_errexit=''; \
        fi;
      LOG_COMPILER = $(SHELL) $$maybe_errexit

    OTOH, this is no longer a valid usage:

      TESTS_ENVIRONMENT = \
        $(SHELL) `test -n '$(STRICT_TESTS_CHECKING)' && echo ' -e'`

    neither is this:

      TESTS_ENVIRONMENT = \
        run_with_perl_or_shell () \
        { \
          if grep -q '^#!.*perl' $$1; then
            $(PERL) $$1; \
          else \
            $(SHELL) $$1; \
          fi; \
        }
      LOG_COMPILER = run_with_perl_or_shell

  - The package authors can now use customary testsuite drivers within
    the framework provided by the 'parallel-tests' testsuite harness.
    Consistently with the existing syntax, this can be done by defining
    special makefile variables 'LOG_DRIVER' and '<ext>_LOG_DRIVER'.

  - A new developer-reserved variable 'AM_TESTS_FD_REDIRECT' can be used
    to redirect/define file descriptors used by the test scripts.

  - The parallel-tests harness generates now, in addition the '.log' files
    holding the output produced by the test scripts, a new set of '.trs'
    files, holding "metadata" derived by the execution of the test scripts;
    among such metadata are the outcomes of the test cases run by a script.

  - Initial and still experimental support for the TAP test protocol is
    now provided.

* Changes to Yacc and Lex support:

  - C source and header files derived from non-distributed Yacc and/or
    Lex sources are now removed by a simple "make clean" (while they were
    previously removed only by "make maintainer-clean").

  - Slightly backward-incompatible change, relevant only for use of Yacc
    with C++: the extensions of the header files produced by the Yacc
    rules are now modelled after the extension of the corresponding
    sources.  For example, yacc files named "foo.y++" and "bar.yy" will
    produce header files named "foo.h++" and "bar.hh" respectively, where
    they would have previously produced header files named simply "foo.h"
    and "bar.h".  This change offers better compatibility with 'bison -o'.

* Miscellaneous changes:

  - The AM_PROG_VALAC macro now causes configure to exit with status 77,
    rather than 1, if the vala compiler found is too old.

  - The build system of Automake itself now avoids the use of make
    recursion as much as possible.

  - Automake now prefers to quote 'like this' or "like this", rather
    than `like this', in diagnostic message and generated Makefiles,
    to accommodate the new GNU Coding Standards recommendations.

  - Automake has a new option '--print-libdir' that prints the path of the
    directory containing the Automake-provided scripts and data files.

  - The 'dist' and 'dist-all' targets now can run compressors in parallel.

  - The rules to create pdf, dvi and ps output from Texinfo files now
    works better with modern 'texi2dvi' script, by explicitly passing
    it the '--clean' option to ensure stray auxiliary files are not
    left to clutter the build directory.

  - Automake can now generate silenced rules for texinfo outputs.

  - Some auxiliary files that are automatically distributed by Automake
    (e.g., 'install-sh', or the 'depcomp' script for packages compiling
    C sources) might now be listed in the DIST_COMMON variable in many
    Makefile.in files, rather than in the top-level one.

  - Messages of types warning or error from 'automake' and 'aclocal'
    are now prefixed with the respective type, and presence of -Werror
    is noted.

  - Automake's early configure-time sanity check now tries to avoid
    sleeping for a second, which slowed down cached configure runs
    noticeably.  In that case, it will check back at the end of the
    configure script to ensure that at least one second has passed, to
    avoid time stamp issues with makefile rules rerunning autotools
    programs.

  - The warnings in the category 'extra-portability' are now enabled by
    '-Wall'.  In previous versions, one has to use '-Wextra-portability'
    to enable them.

Bugs fixed in 1.12:

  - Various minor bugfixes for recent or long-standing bugs.

* Bugs introduced by 1.11:

  - The AM_COND_IF macro also works if the shell expression for the
    conditional is no longer valid for the condition.

  - The automake-provided parallel testsuite harness no longer fails
    with BSD make used in parallel mode when there are test scripts in
    a subdirectory, like in:

      TESTS = sub/foo.test sub/bar.test

* Long-standing bugs:

  - Automake's own build system finally have a real "installcheck" target.

  - Vala-related cleanup rules are now more complete, and work better in
    a VPATH setup.

  - Files listed with the AC_REQUIRE_AUX_FILE macro in configure.ac are
    now automatically distributed also if the directory of the auxiliary
    files coincides with the top-level directory.

  - Automake now detects the presence of the '-d' flag in the various
    '*YFLAGS' variables even when their definitions involve indirections
    through other variables, such as in:
      foo_opts = -d
      AM_YFLAGS = $(foo_opts)

  - Automake now complains if a '*YFLAGS' variable has any conditional
    content, not only a conditional definition.

  - Explicit enabling and/or disabling of Automake warning categories
    through the '-W...' options now always takes precedence over the
    implicit warning level implied by Automake strictness (foreign, gnu
    or gnits), regardless of the order in which such strictness and
    warning flags appear.  For example, a setting like:
      AUTOMAKE_OPTIONS = -Wall --foreign
    will cause the warnings in category 'portability' to be enabled, even
    if those warnings are by default disabled in 'foreign' strictness.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Bugs fixed in 1.11.5:

* Bugs introduced by 1.11.3:

  - Vala files with '.vapi' extension are now recognized and handled
    correctly again.  See automake bug#11222.

  - Vala support work again for projects that contain some program
    built from '.vala' (and possibly '.c') sources and some other
    program built from '.c' sources *only*.  See automake bug#11229.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

New in 1.11.4:

* Miscellaneous changes:

  - The 'ar-lib' script now ignores the "s" (symbol index) and "S" (no
    symbol index) modifiers as well as the "s" action, as the symbol index
    is created unconditionally by Microsoft lib.  Also, the "q" (quick)
    action is now a synonym for "r" (replace).  Also, the script has been
    ignoring the "v" (verbose) modifier already since Automake 1.11.3.

  - When the 'compile' script is used to wrap MSVC, it now accepts an
    optional space between the -I, -L and -l options and their respective
    arguments, for better POSIX compliance.

  - There is an initial, experimental support for automatic dependency
    tracking with tcc (the Tiny C Compiler).  Its associated depmode is
    currently recognized as "icc" (but this and other details are likely
    to change in future versions).

  - Automatic dependency tracking now works also with the IBM XL C/C++
    compilers, thanks to the new new depmode 'xlc'.

Bugs fixed in 1.11.4:

* Bugs introduced by 1.11.2:

  - A definition of 'noinst_PYTHON' before 'python_PYTHON' (or similar)
    no longer cause spurious failures upon "make install".

  - The user can now instruct the 'uninstall-info' rule not to update
    the '${infodir}/dir' file by exporting the environment variable
    'AM_UPDATE_INFO_DIR' to the value "no".  This is done for consistency
    with how the 'install-info' rule operates since automake 1.11.2.

* Long-standing bugs:

  - It is now possible for a foo_SOURCES variable to hold Vala sources
    together with C header files, as well as with sources and headers for
    other supported languages (e.g., C++).  Previously, only mixing C and
    Vala sources was supported.

  - If "aclocal --install" is used, and the first directory specified with
    '-I' is non-existent, aclocal will now create it before trying to copy
    files in it.

  - An empty declaration of a "foo_PRIMARY" no longer cause the generated
    install rules to create an empty $(foodir) directory; for example, if
    Makefile.am contains something like:

      pkglibexec_SCRIPTS =
      if FALSE
      pkglibexec_SCRIPTS += bar.sh
      endif

    the $(pkglibexec) directory will not be created upon "make install".

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

New in 1.11.3:

* Miscellaneous changes:

  - Automake's own build system is more silent by default, making use of
    the 'silent-rules' option.

  - The master copy of the 'gnupload' script is now maintained in gnulib,
    not in automake.

  - The 'missing' script no longer tries to wrap calls to 'tar'.

  - "make dist" no longer wraps 'tar' invocations with the 'missing'
    script.  Similarly, the obsolescent variable '$(AMTAR)' (which you
    shouldn't be using BTW ;-) no longer invokes the 'missing' script
    to wrap tar, but simply invokes the 'tar' program itself.

  - "make dist" can now create lzip-compressed tarballs.

  - In the Automake info documentation, the Top node and the nodes about
    the invocation of the automake and aclocal programs have been renamed;
    now, calling "info automake" will open the Top node, while calling
    "info automake-invocation" and "info aclocal-invocation" will access
    the nodes about the invocation of respectively automake and aclocal.

  - Automake is now distributed as a gzip-compressed and an xz-compressed
    tarball.  Previously, bzip2 was used instead of xz.

  - The last relics of Python 1.5 support have been removed from the
    AM_PATH_PYTHON macro.

  - For programs and libraries, automake now detects EXTRA_foo_DEPENDENCIES
    and adds them to the normal list of dependencies, but without
    overwriting the foo_DEPENDENCIES variable, which is normally computed
    by automake.

Bugs fixed in 1.11.3:

* Bugs introduced by 1.11.2:

  - Automake now correctly recognizes the prefix/primary combination
   'pkglibexec_SCRIPTS' as valid.

  - The parallel-tests harness no longer trips on sed implementations
    with stricter limits on the length of input lines (problem seen at
    least on Solaris 8).

* Long-standing bugs:

  - The "deleted header file problem" for *.am files is avoided by stub
    rules.  This allows 'make' to trigger a rerun of 'automake' also if
    some previously needed '.am' file has been removed.

  - The 'silent-rules' option now generates working makefiles even
    for the uncommon 'make' implementations that do not support the
    nested-variables extension to POSIX 2008.  For such 'make'
    implementations, whether a build is silent is determined at
    configure time, and cannot be overridden at make time with
    "make V=0" or "make V=1".

  - Vala support now works better in VPATH setups.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

New in 1.11.2:

* Changes to aclocal:

  - The `--acdir' option is deprecated.  Now you should use the new options
    `--automake-acdir' and `--system-acdir' instead.

  - The `ACLOCAL_PATH' environment variable is now interpreted as a
    colon-separated list of additional directories to search after the
    automake internal acdir (by default ${prefix}/share/aclocal-APIVERSION)
    and before the system acdir (by default ${prefix}/share/aclocal).

* Miscellaneous changes:

  - The Automake support for automatic de-ANSI-fication has been
    deprecated.  It will probably be removed in the next major Automake
    release (1.12).

  - The `lzma' compression scheme and associated automake option `dist-lzma'
    is obsoleted by `xz' and `dist-xz' due to upstream changes.

  - You may adjust the compression options used in dist-xz and dist-bzip2.
    The default is now merely -e for xz, but still -9 for bzip;  you may
    specify a different level via the XZ_OPT and BZIP2 envvars respectively.
    E.g., "make dist-xz XZ_OPT=-7" or "make dist-bzip2 BZIP2=-5"

  - The `compile' script now converts some options for MSVC for a better
    user experience.  Similarly, the new `ar-lib' script wraps Microsoft lib.

  - The py-compile script now accepts empty arguments passed to the options
    `--destdir' and `--basedir', and complains about unrecognized options.
    Moreover, a non-option argument or a special `--' argument terminates
    the list of options.

  - A developer that needs to pass specific flags to configure at "make
    distcheck" time can now, and indeed is advised to, do so by defining
    the developer-reserved makefile variable AM_DISTCHECK_CONFIGURE_FLAGS,
    instead of the old DISTCHECK_CONFIGURE_FLAGS.
    The DISTCHECK_CONFIGURE_FLAGS variable should now be reserved for the
    user; still, the old Makefile.am files that used to define it will
    still continue to work as before.

  - New macro AM_PROG_AR that looks for an archiver and wraps it in the new
    'ar-lib' auxiliary script if the selected archiver is Microsoft lib.
    This new macro is required for LIBRARIES and LTLIBRARIES when automake
    is run with -Wextra-portability and -Werror.

  - When using DejaGnu-based testsuites, the user can extend the `site.exp'
    file generated by automake-provided rules by defining the special make
    variable `$(EXTRA_DEJAGNU_SITE_CONFIG)'.

  - The `install-info' rule can now be instructed not to create/update
    the `${infodir}/dir' file, by exporting the new environment variable
    `AM_UPDATE_INFO_DIR' to the value "no".

Bugs fixed in 1.11.2:

* Bugs introduced by 1.11:

  - The parallel-tests driver no longer produces erroneous results with
    Tru64/OSF 5.1 sh upon unreadable log files.

  - The `parallel-tests' test driver does not report spurious successes
    when used with concurrent FreeBSD make (e.g., "make check -j3").

  - When the parallel-tests driver is in use, automake now explicitly
    rejects invalid entries and conditional contents in TEST_EXTENSIONS,
    instead of issuing confusing and apparently unrelated error messages
    (e.g., "non-POSIX variable name", "bad characters in variable name",
    or "redefinition of TEST_EXTENSIONS), or even, in some situations,
    silently producing broken `Makefile.in' files.

  - The `silent-rules' option now truly silences all compile rules, even
    when dependency tracking is disabled.  Also, when `silent-rules' is
    not used, `make' output no longer contains spurious backslash-only
    lines, thus once again matching what Automake did before 1.11.

  - The AM_COND_IF macro also works if the shell expression for the
    conditional is no longer valid for the condition.

* Long-standing bugs:

  - The order of Yacc and Lex flags is fixed to be consistent with other
    languages: $(AM_YFLAGS) comes before $(YFLAGS), and $(AM_LFLAGS) before
    $(LFLAGS), so that the user variables override the developer variables.

  - "make distcheck" now correctly complains also when "make uninstall"
    leaves one and only one file installed in $(prefix).

  - A "make uninstall" issued before a "make install", or after a mere
    "make install-data" or a mere "make install-exec" does not spuriously
    fail anymore.

  - Automake now warns about more primary/directory invalid combinations,
    such as "doc_LIBRARIES" or "pkglib_PROGRAMS".

  - Rules generated by Automake now try harder to not change any files when
    `make -n' is invoked.  Fixes include compilation of Emacs Lisp, Vala, or
    Yacc source files and the rule to update config.h.

  - Several scripts and the parallel-tests testsuite driver now exit with
    the right exit status upon receiving a signal.

  - A per-Makefile.am setting of -Werror does not erroneously carry over
    to the handling of other Makefile.am files.

  - The code for automatic dependency tracking works around a Solaris
    make bug triggered by sources containing repeated slashes when the
    `subdir-objects' option was used.

  - The makedepend and hp depmodes now work better with VPATH builds.

  - Java sources specified with check_JAVA are no longer compiled for
    "make all", but only for "make check".

  - An usage like "java_JAVA = foo.java" will now cause Automake to warn
    and error out if `javadir' is undefined, instead of silently producing
    a broken Makefile.in.

  - aclocal and automake now honour the configure-time definitions of
    AUTOCONF and AUTOM4TE when they spawn autoconf or autom4te processes.

  - The `install-info' recipe no longer tries to guess whether the
    `install-info' program is from Debian or from GNU, and adaptively
    change its behaviour; this has proven to be frail and easy to
    regress.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Bugs fixed in 1.11.1:

  - Lots of minor bugfixes.

* Bugs introduced by 1.11:

  - The `parallel-tests' test driver works around a GNU make 3.80 bug with
    trailing white space in the test list (`TESTS = foo $(EMPTY)').

* Long standing bugs:

  - On Darwin 9, `pythondir' and `pyexecdir' pointed below `/Library/Python'
    even if the `--prefix' argument pointed outside of a system directory.
    AM_PATH_PYTHON has been fixed to ignore the value returned from python's
    `get_python_lib' function if it points outside the configured prefix,
    unless the `--prefix' argument was either `/usr' or below `/System'.

  - The testsuite does not try to change the mode of `ltmain.sh' files from
    a Libtool installation (symlinked to test directories) any more.

  - AM_PROG_GCJ uses AC_CHECK_TOOLS to look for `gcj' now, so that prefixed
    tools are preferred in a cross-compile setup.

  - The distribution is tarred up with mode 755 now by the `dist*' targets.
    This fixes a race condition where untrusted users could modify files
    in the $(PACKAGE)-$(VERSION) distdir before packing if the toplevel
    build directory was world-searchable.  This is CVE-2009-4029.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

New in 1.11:

* Version requirements:

  - Autoconf 2.62 or greater is required.

* Changes to aclocal:

  - The autoconf version check implemented by aclocal in aclocal.m4
    (and new in Automake 1.10) is degraded to a warning.  This helps
    in the common case where the Autoconf versions used are compatible.

* Changes to automake:

  - The automake program can run multiple threads for creating most
    Makefile.in files concurrently, if at least Perl 5.7.2 is available
    with interpreter-based threads enabled.  Set the environment variable
    AUTOMAKE_JOBS to the maximum number of threads to use, in order to
    enable this experimental feature.

* Changes to Libtool support:

  - Libtool generic flags are now passed to the install and uninstall
    modes as well.

  - distcheck works with Libtool 2.x even when LT_OUTPUT is used, as
    config.lt is removed correctly now.

* Languages changes:

  - subdir-object mode works now with Fortran (F77, FC, preprocessed
    Fortran, and Ratfor).

  - For files with extension .f90, .f95, .f03, or .f08, the flag
    $(FCFLAGS_f[09]x) computed by AC_FC_SRCEXT is now used in compile rules.

  - Files with extension .sx are also treated as preprocessed assembler.

  - The default source file extension (.c) can be overridden with
    AM_DEFAULT_SOURCE_EXT now.

  - Python 3.0 is supported now, Python releases prior to 2.0 are no
    longer supported.

  - AM_PATH_PYTHON honors python's idea about the site directory.

  - There is initial support for the Vala programming language, when using
    Vala 0.7.0 or later.

* Miscellaneous changes:

  - Automake development is done in a git repository on Savannah now, see

      https://git.sv.gnu.org/gitweb/?p=automake.git

    A read-only CVS mirror is provided at

      cvs -d :pserver:anonymous@pserver.git.sv.gnu.org:/automake.git \
          checkout -d automake HEAD

  - "make dist" can now create xz-compressed tarballs,
    as well as (deprecated?) lzma-compressed tarballs.

  - `automake --add-missing' will by default install the GPLv3 file as
    COPYING if it is missing.  It will also warn that the license file
    should be added to source control.  Note that Automake will never
    overwrite an existing COPYING file, even when the `--force-missing'
    option is used.

  - The manual is now distributed under the terms of the GNU FDL 1.3.

  - Automake ships and installs man pages for automake and aclocal now.

  - New shorthand `$(pkglibexecdir)' for `$(libexecdir)/@PACKAGE@'.

  - install-sh supports -C, which does not update the installed file
    (and its time stamps) if the contents did not change.

  - The `gnupload' script has been revamped.

  - The `depcomp' and `compile' scripts now work with MSVC under MSYS.

  - The targets `install' and `uninstall' are more efficient now, in that
    for example multiple files from one Automake variable such as
    `bin_SCRIPTS' are copied in one `install' (or `libtool --mode=install')
    invocation if they do not have to be renamed.

    Both install and uninstall may sometimes enter (`cd' into) the target
    installation directory now, when no build-local scripts are used.

    Both install and uninstall do not fail anymore but do nothing if an
    installation directory variable like `bindir' is set to the empty string.

    For built-in rules, `make install' now fails reliably if installation
    of a file failed.  Conversely, `make uninstall' even succeeds when
    issued multiple times.

    These changes may need some adjustments from users:  For example,
    some `install' programs refuse to install multiple copies of the
    same file in one invocation, so you may need to remove duplicate
    entries from file lists.

    Also, within one set of files, say, nobase_data_DATA, the order of
    installation may be changed, or even unstable among different hosts,
    due to the use of associative arrays in awk.  The increased use of
    awk matches a similar move in Autoconf to provide for better scaling.

    Further, most undocumented per-rule install command variables such as
    binSCRIPT_INSTALL have been removed because they are not needed any
    more.  Packages which use them should be using the appropriate one of
    INSTALL_{DATA,PROGRAM,SCRIPT} or their install_sh_{DATA,PROGRAM,SCRIPT}
    counterpart, depending on the type of files and the need for automatic
    target directory creation.

  - The "deleted header file problem" for *.m4 files is avoided by
    stub rules.  This allows `make' to trigger a rerun of `aclocal'
    also if some previously needed macro file has been removed.

  - Rebuild rules now also work for a removed `subdir/Makefile.in' in
    an otherwise up to date tree.

  - The `color-tests' option causes colored test result output on terminals.

  - The `parallel-tests' option enables a new test driver that allows for
    parallel test execution, inter-test dependencies, lazy test execution
    for unit-testing, re-testing only failed tests, and formatted result output
    as RST (reStructuredText) and HTML.  Enabling this option may require some
    changes to your test suite setup; see the manual for details.

  - The `silent-rules' option enables Linux kernel-style silent build output.
    This option requires the widely supported but non-POSIX `make' feature
    of recursive variable expansion, so do not use it if your package needs
    to build with `make' implementations that do not support it.

    To enable less verbose build output, the developer has to use the Automake
    option `silent-rules' in `AM_INIT_AUTOMAKE', or call the `AM_SILENT_RULES'
    macro.  The user may then set the default verbosity by passing the
    `--enable-silent-rules' option to `configure'.  At `make' run time, this
    default may be overridden using `make V=0' for less verbose, and `make V=1'
    for backward-compatible verbose output.

  - New prefix `notrans_' for manpages which should not be transformed
    by --program-transform.

  - New macro AM_COND_IF for conditional evaluation and conditional
    config files.

  - For AC_CONFIG_LINKS, if source and destination are equal, do not
    remove the file in a non-VPATH build.  Such setups work with Autoconf
    2.62 or newer.

  - AM_MAINTAINER_MODE now allows for an optional argument specifying
    the default setting.

  - AM_SUBST_NOTMAKE may prevent substitution of AC_SUBSTed variables,
    useful especially for multi-line values.

  - Automake's early configure-time sanity check now diagnoses an
    unsafe absolute source directory name and makes configure fail.

  - The Automake macros and rules cope better with whitespace in the
    current directory name, as long as the relative path to `configure'
    does not contain whitespace.  To this end, the values of `$(MISSING)'
    and `$(install_sh)' may contain suitable quoting, and their expansion
    might need `eval'uation if used outside of a makefile.  These
    undocumented variables may be used in several documented macros such
    as $(AUTOCONF) or $(MAKEINFO).

Bugs fixed in 1.11:

* Long-standing bugs:

  - Fix aix dependency tracking for libtool objects.

  - Work around AIX sh quoting issue in AC_PROG_CC_C_O, leading to
    unnecessary use of the `compile' script.

  - For nobase_*_LTLIBRARIES with nonempty directory components, the
    correct `-rpath' argument is used now.

  - `config.status --file=Makefile depfiles' now also works with the
    extra quoting used internally by Autoconf 2.62 and newer
    (it used to work only without the `--file=' bit).

  - The `missing' script works better with versioned tool names.

  - Semantics for `missing help2man' have been revamped:

    Previously, if `help2man' was not present, `missing help2man' would have
    the following semantics: if some man page was out of date but present, then
    a warning would be printed, but the exit status was 0.  If the man page was
    not present at all, then `missing' would create a replacement man page
    containing an error message, and exit with a status of 2.  This does not play
    well with `make': the next run will see this particular man page as being up
    to date, and will only error out on the next generated man page, if any;
    repeat until all pages are done.  This was not desirable.

    These are the new semantics: if some man page is not present, and help2man
    is not either, then `missing' will warn and generate the replacement page
    containing the error message, but exit successfully.  However, `make dist'
    will ensure that no such bogus man pages are packaged into a tarball.

  - Targets provided by automake behave better with `make -n', in that they
    take care not to create files.

  - `config.status Makefile... depfiles' works fine again in the presence of
    disabled dependency tracking.

  - The default no-op recursive rules for these targets also work with BSD make
    now: html, install-html, install-dvi, install-pdf, install-pdf, install-info.

  - `make distcheck' works also when both a directory and some file below it
    have been added to a distribution variable, such as EXTRA_DIST or *_SOURCES.

  - Texinfo dvi, ps, pdf, and html output files are not removed upon
    `make mostlyclean' any more; only the LaTeX by-products are.

  - Renamed objects also work with the `subdir-objects' option and
    source file languages which Automake does not know itself.

  - `automake' now correctly complains about variable assignments which are
    preceded by a comment, extend over multiple lines with backslash-escaped
    newlines, and end in a comment sign.  Previous versions would silently
    and wrongly ignore such assignments completely.

* Bugs introduced by 1.10:

  - Fix output of dummy dependency files in presence of post-processed
    Makefile.in's again, but also cope with long lines.

  - $(EXEEXT) is automatically appended to filenames of XFAIL_TESTS
    that have been declared as programs in the same Makefile.
    This is for consistency with the analogous change to TESTS in 1.10.

  - Fix order of standard includes to again be `-I. -I$(srcdir)',
    followed by directories containing config headers.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

New in 1.10:

* Version requirements:

  - Autoconf 2.60 or greater is required.

  - Perl 5.6 or greater is required.

* Changes to aclocal:

  - aclocal now also supports -Wmumble and -Wno-mumble options.

  - `dirlist' entries (for the aclocal search path) may use shell
    wildcards such as `*', `?', or `[...]'.

  - aclocal supports an --install option that will cause system-wide
    third-party macros to be installed in the local directory
    specified with the first -I flag.  This option also uses #serial
    lines in M4 files to upgrade local macros.

    The new aclocal options --dry-run and --diff help to review changes
    before they are installed.

  - aclocal now outputs an autoconf version check in aclocal.m4 in
    projects using automake.

    For a few years, automake and aclocal have been calling autoconf
    (or its underlying engine autom4te) to accurately retrieve the
    data they need from configure.ac and its siblings.  Doing so can
    only work if all autotools use the same version of autoconf.  For
    instance a Makefile.in generated by automake for one version of
    autoconf may stop working if configure is regenerated with another
    version of autoconf, and vice versa.

    This new version check ensures that the whole build system has
    been generated using the same autoconf version.

* Support for new Autoconf macros:

  - The new AC_REQUIRE_AUX_FILE Autoconf macro is supported.

  - If `subdir-objects' is set, and AC_CONFIG_LIBOBJ_DIR is specified,
    $(LIBOBJS), $(LTLIBOBJS), $(ALLOCA), and $(LTALLOCA) can be used
    in different directories.  However, only one instance of such a
    library objects directory is supported.

* Change to Libtool support:

  - Libtool generic flags (those that go before the --mode=MODE option)
    can be specified using AM_LIBTOOLFLAGS and target_LIBTOOLFLAGS.

* Yacc and Lex changes:

  - The rebuild rules for distributed Yacc and Lex output will avoid
    overwriting existing files if AM_MAINTAINER_MODE and maintainer-mode
    is not enabled.

  - ylwrap is now always used for lex and yacc source files,
    regardless of whether there is more than one source per directory.

* Languages changes:

  - Preprocessed assembler (*.S) compilation now honors CPPFLAGS,
    AM_CPPFLAGS and per-target _CPPFLAGS, and supports dependency
    tracking, unlike non-preprocessed assembler (*.s).

  - subdir-object mode works now with Assembler.  Automake assumes
    that the compiler understands `-c -o'.

  - Preprocessed assembler (*.S) compilation now also honors
    $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES).

  - Improved support for Objective C:
    - Autoconf's new AC_PROG_OBJC will enable automatic dependency tracking.
    - A new section of the manual documents the support.

  - New support for Unified Parallel C:
    - AM_PROG_UPC looks for a UPC compiler.
    - A new section of the manual documents the support.

  - Per-target flags are now correctly handled in link rules.

    For instance maude_CFLAGS correctly overrides AM_CFLAGS; likewise
    for maude_LDFLAGS and AM_LDFLAGS.  Previous versions bogusly
    preferred AM_CFLAGS over maude_CFLAGS while linking, and they
    used both AM_LDFLAGS and maude_LDFLAGS on the same link command.

    The fix for compiler flags (i.e., using maude_CFLAGS instead of
    AM_CFLAGS) should not hurt any package since that is how _CFLAGS
    is expected to work (and actually works during compilation).

    However using maude_LDFLAGS "instead of" AM_LDFLAGS rather than
    "in addition to" breaks backward compatibility with older versions.
    If your package used both variables, as in

      AM_LDFLAGS = common flags
      bin_PROGRAMS = a b c
      a_LDFLAGS = more flags
      ...

    and assumed *_LDFLAGS would sum up, you should rewrite it as

      AM_LDFLAGS = common flags
      bin_PROGRAMS = a b c
      a_LDFLAGS = $(AM_LDFLAGS) more flags
      ...

    This new behavior of *_LDFLAGS is more coherent with other
    per-target variables, and the way *_LDFLAGS variables were
    considered internally.

* New installation targets:

  - New targets mandated by GNU Coding Standards:
      install-dvi
      install-html
      install-ps
      install-pdf
    By default they will only install Texinfo manuals.
    You can customize them with *-local variants:
      install-dvi-local
      install-html-local
      install-ps-local
      install-pdf-local

  - The undocumented recursive target `uninstall-info' no longer exists.
    (`uninstall' is in charge of removing all possible documentation
    flavors, including optional formats such as dvi, ps, or info even
    when `no-installinfo' is used.)

* Miscellaneous changes:

  - Automake no longer complains if input files for AC_CONFIG_FILES
    are specified using shell variables.

  - clean, distribution, or rebuild rules are normally disabled for
    inputs and outputs of AC_CONFIG_FILES, AC_CONFIG_HEADERS, and
    AC_CONFIG_LINK specified using shell variables.  However, if these
    variables are used as ${VAR}, and AC_SUBSTed, then Automake will
    be able to output rules anyway.
    (See the Automake documentation for AC_CONFIG_FILES.)

  - $(EXEEXT) is automatically appended to filenames of TESTS
    that have been declared as programs in the same Makefile.
    This is mostly useful when some check_PROGRAMS are listed in TESTS.

  - `-Wportability' has finally been turned on by default for `gnu' and
    `gnits' strictness.  This means, automake will complain about %-rules
    or $(GNU Make functions) unless you switch to `foreign' strictness or
    use `-Wno-portability'.

  - Automake now uses AC_PROG_MKDIR_P (new in Autoconf 2.60), and uses
    $(MKDIR_P) instead of $(mkdir_p) to create directories.  The
    $(mkdir_p) variable is still defined (to the same value as
    $(MKDIR_P)) but should be considered obsolete.  If you are using
    $(mkdir_p) in some of your rules, please plan to update them to
    $(MKDIR_P) at some point.

  - AM_C_PROTOTYPES and ansi2knr are now documented as being obsolete.
    They still work in this release, but may be withdrawn in a future one.

  - Inline compilation rules for gcc3-style dependency tracking are
    more readable.

  - Automake installs a "Hello World!" example package in $(docdir).
    This example is used throughout the new "Autotools Introduction"
    chapter of the manual.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

New in 1.9:

* Makefile.in bloat reduction:

  - Inference rules are used to compile sources in subdirectories when
    the `subdir-objects' option is used and no per-target flags are
    used.  This should reduce the size of some projects a lot, because
    Automake used to output an explicit rule for each such object in
    the past.

  - Automake no longer outputs three rules (.o, .obj, .lo) for each
    object that must be built with explicit rules.  It just outputs
    the rules required to build the kind of object considered: either
    the two .o and .obj rules for usual objects, or the .lo rule for
    libtool objects.

* Change to Libtool support:

  - Libtool tags are used with libtool versions that support them.
    (I.e., with Libtool 1.5 or greater.)

  - Automake is now able to handle setups where a libtool library is
    conditionally installed in different directories, as in

      if COND
        lib_LTLIBRARIES = liba.la
      else
        pkglib_LTLIBRARIES = liba.la
      endif
      liba_la_SOURCES = ...

* Changes to aclocal:

  - aclocal now ensures that AC_DEFUNs and AU_DEFUNs it discovers are
    really evaluated, before it decides to include them in aclocal.m4.
    This solves nasty problems with conditional redefinitions of
    Autoconf macros in /usr/share/aclocal/*.m4 files causing extraneous
    *.m4 files to be included in any project using these macros.
    (Calls to AC_PROG_EGREP causing libtool.m4 to be included is the
    most famous instance of this bug.)

  - Do not complain about missing conditionally AC_REQUIREd macros
    that are not actually used.  In 1.8.x aclocal would correctly
    determine which of these macros were really needed (and include
    only these in the package); unfortunately it would also require
    all of them to be present in order to run.  This created
    situations were aclocal would not work on a tarball distributing
    all the macros it uses.  For instance running aclocal on a project
    containing only the subset of the Gettext macros in use by the
    project did not work, because gettext conditionally requires other
    macros.

* Portability improvements:

  - Tar format can be chosen with the new options tar-v7, tar-ustar, and
    tar-pax.  The new option filename-length-max=99 helps diagnosing
    filenames that are too long for tar-v7.  (PR/414)

  - Variables augmented with `+=' are now automatically flattened (i.e.,
    trailing backslashes removed) and then wrapped around 80 columns
    (adding trailing backslashes).  In previous versions, a long series
    of
      VAR += value1
      VAR += value2
      VAR += value3
      ...
    would result in a single-line definition of VAR that could possibly
    exceed the maximum line length of some make implementations.

    Non-augmented variables are still output as they are defined in
    the Makefile.am.

* Miscellaneous:

  - Support Fortran 90/95 with the new "fc" and "ppfc" languages.
    Works the same as the old Fortran 77 implementation; just replace
    F77 with FC everywhere (exception: FFLAGS becomes FCFLAGS).
    Requires a version of autoconf which provides AC_PROG_FC (>=2.59).

  - Support for conditional _LISP.

  - Support for conditional -hook and -local rules (PR/428).

  - Diagnose AC_CONFIG_AUX_DIR calls following AM_INIT_AUTOMAKE. (PR/49)

  - Automake will not write any Makefile.ins after the first error it
    encounters.  The previous Makefile.ins (if any) will be left in
    place.  (Warnings will not prevent output, but remember they can
    be turned into errors with -Werror.)

  - The restriction that SUBDIRS must contain direct children is gone.
    Do not abuse.

  - The manual tells more about SUBDIRS vs. DIST_SUBDIRS.
    It also gives an example of nested packages using AC_CONFIG_SUBDIRS.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Bugs fixed in 1.8.5:

* Long-standing bugs:

  - Define DIST_SUBDIRS even when the `no-dist' or `cygnus' options are used
    so that `make distclean' and `make maintainer-clean' can work.

  - Define AR and ARFLAGS even when only EXTRA_LIBRARIES are defined.

  - Fix many rules to please FreeBSD make, which runs commands with `sh -e'.

  - Polish diagnostic when no input file is found.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Bugs fixed in 1.8.4:

* Long-standing bugs:

  - Fix AM_PATH_PYTHON to correctly display $PYTHON when it has been
    overridden by the user.

  - Honor PATH_SEPARATOR in various places of the Automake package, for
    the sake of OS/2.

  - Adjust dependency tracking mode detection to ICC 8.0's new output.
    (PR/416)

  - Fix install-sh so it can install the `mv' binary... using `mv'.

  - Fix tru64 dependency tracking for libtool objects.

  - Work around Exuberant Ctags when creating a TAGS files in a directory
    without files to scan but with subdirectories to include.

* Bugs introduced by 1.8:

  - Fix an "internal error" when @LIBOBJS@ is used in a variable that is
    not defined in the same conditions as the _LDADD that uses it.

  - Do not warn when JAVAROOT is overridden, this is legitimate.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Bugs fixed in 1.8.3:

* Long-standing bugs:

  - Quote filenames in installation rules, in case $DESTDIR, $prefix,
    or any of the other *dir variables contain a space.

    Please note that Automake does not and cannot support spaces in
    filenames that are involved during the build.  This change affects
    only installation paths, so that `make install' does not bomb out
    in packages configured with
      ./configure --prefix '/c/Program Files'

  - Fix the depfiles output so it works with GNU sed (<4.1) even when
    POSIXLY_CORRECT is set.

  - Do not AC_SUBST(LIBOBJS) in AM_WITH_REGEX.  This macro was unusable
    since Autoconf 2.54, which defines LIBOBJS itself.

  - Fix a potential (but unlikely) race condition in parallel elisp
    builds.  (Introduced in 1.7.3.)

  - Do not assume that users override _DEPENDENCIES in all conditions
    where Automake will try to define them.

  - Do not use `mkdir -p' in mkinstalldirs, unless this is GNU mkdir.
    Solaris 8's `mkdir -p' is not thread-safe and can break parallel
    builds.

    This fix also affects the $(mkdir_p) variable defined since
    Automake 1.8.  It will be set to `mkdir -p' only if mkdir is GNU
    mkdir, and to `mkinstalldirs' or `install-sh -d' otherwise.

  - Secure temporary directory creation in `make distcheck'. (PR/413)

  - Do not generate two build rules for `parser.h' when the
    parser appears in two different conditionals.

  - Work around a Solaris 8 /bin/sh bug in the test for dependency
    checking.  Usually ./configure will not pick this shell; so this
    fix only helps cases where the shell is forced to /bin/sh.

* Bugs introduced by 1.8:

  - In some situations (hand-written `m4_include's), aclocal would
    call the `File::Spec->rel2abs' method, which was only introduced
    in Perl 5.6.  This new version reestablish support Perl 5.005.

    It is likely that the next major Automake releases will require at
    least Perl 5.6.  Consider upgrading your development environment
    if you are still using the five-year-old Perl 5.005.

  - Automake would sometimes fail to define rules for targets listed
    in variables defined in multiple conditions.  For instance on
      if C1
	bin_PROGRAMS = a
      else
	bin_PROGRAMS = b
      endif
    it would define only the `a.$(OBJEXT): a.c' rule and omit the
    `b.$(OBJEXT): b.c' rule.

* New sections in manual:

  - Third-Party Makefiles: how to interface third party Makefiles.
  - Upgrading: upgrading packages to newer Automake versions.
  - Multiple Outputs: handling tools that produce many outputs.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Bug fixed in 1.8.2:

* A (well known) portability bug slipped in the changes made to
  install-sh in Automake 1.8.1.  The broken install-sh would refuse to
  install anything on Tru64.

* Fix install rules for conditionally built python files.  (This never
  really worked.)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Bug fixed in 1.8.1:

* Bugs introduced by 1.8:

  - Fix Config.pm import error with old Perl versions (at least
    5.005_03).  One symptom is that aclocal could not find its macro
    directory.

  - Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
    created by `make install' are always world readable, even if the
    installer happens to have an overly restrictive umask (e.g. 077).
    This was a mistake and has been reverted.  There are at least two
    reasons why we must not use `-m 0755':
      - it causes special bits like SGID to be ignored,
      - it may be too restrictive (some setups expect 775 directories).

  - Fix aclocal to honor definitions located in files which have been
    m4_included manually.  aclocal 1.8 had been updated to check
    m4_included files for new requirements, but forgot that these
    m4_included files can also provide new definitions.

    Note that if you have such a setup, we recommend you get rid of
    it.  In the past, there was a reason to m4_include files manually:
    aclocal used to duplicate entire M4 files into aclocal.m4, even
    files that were distributed.  Some packages were therefore
    m4_including the distributed file directly, and playing some
    tricks to ensure aclocal would not copy that file to aclocal.m4,
    in order to limit the amount of duplication.  Since aclocal 1.8.x
    will precisely output m4_includes for local M4 files, we recommend
    that you clean up your setup, removing all manual m4_includes and
    letting aclocal output them.

  - Output detailed menus in the Info version if the Automake manual,
    so that Emacs can locate the indexes.

  - configure.ac and configure were listed twice in DIST_COMMON (an
    internal variable where Automake lists configury files to
    distribute).  This was harmless, but unaesthetic.

  - Use `chmod a-w' instead of `chmod -w' as the latter honors umask.
    This was an issue only in the Automake package itself, not in
    its output.

  - Automake assumed that all AC_CONFIG_LINKS arguments had the form
    DEST:SRC.  This was wrong, as some packages do
    AC_CONFIG_LINKS($computedlinks).  This version no longer abort in
    that situation.

  - Contrary to mkinstalldirs, $(mkdir_p) was expecting exactly one
    argument.  This caused two kinds of failures:
      - Rules installing data in a conditionally defined directory
        failed when that directory was undefined.  In this case no
        argument was supplied.
      - `make installdirs' failed, because several directories were
        passed to $(mkdir_p).  This was an issue only on platform
        were $(mkdir_p) is implemented with `install-sh -d'.
    $(mkdir_p) as been changed to accept 0 or more arguments, as
    mkinstalldirs did.

* Long-standing bugs:

  - Fix an unexpected diagnostic occurring when users attempt
    to override some internal variables that Automake appends to.

  - aclocal now scans configure.ac for macro definitions (PR/319).

  - Fix a portability issue with OSF1/Tru64 Make.  If a directory
    distributes files which are outside itself (this usually occurs
    when using AC_CONFIG_AUX_DIR([../dir]) to use auxiliary files
    from a parent package), then `make distcheck' fails due to an
    optimization performed by OSF1/Tru64 Make in its VPATH handling.
    (tests/subpkg2.test failure)

  - Fix another portability issue with Sun and OSF1/Tru64 Make.
    In a VPATH-build configuration, `make install' would install
    nobase_ files to wrong locations.

  - Fix a Perl `uninitialized value' diagnostic occurring when
    automake complains that a Texinfo file does not have a
    @setfilename statement.

  - Erase config.status.lineno during `make distclean'.  This file
    can be created by config.status.  Automake already knew about
    configure.lineno, but forgot config.status.lineno.

  - Distribute all files, even those which are built and installed
    conditionally.  This change affects files listed in conditionally
    defined *_HEADERS and *_PYTHON variable (unless they are nodist_*)
    as well as those listed in conditionally defined dist_*_DATA,
    dist_*_JAVA, dist_*_LISP, and dist_*_SCRIPTS variables.

  - Fix AM_PATH_LISPDIR to avoid \? in sed regular expressions; it
    doesn't conform to POSIX.

  - Normalize help strings for configure variables and options added
    by Automake macros.

* Anticipation:

  - Check for python2.4 in AM_PATH_PYTHON.

* Spurious failures in test suite:

  - tests/libtool5.test, tests/ltcond.test, tests/ltcond2.test,
    tests/ltconv.test: fix failures with CVS Libtool.
  - tests/aclocal6.test: fix failure if autom4te.cache is disabled.
  - tests/txinfo24.test, tests/txinfo25.test, tests/txinfo28.test:
    fix failures with old Texinfo versions.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

New in 1.8:

* Meta-News

  - The NEWS file is more verbose.

* Requirements

  - Autoconf 2.58 or greater is required.

* New features

  - Default source file names in the absence of a _SOURCES declaration
    are made by removing any target extension before appending `.c', so
    to make the libtool module `foo.la' from `foo.c', you only need to
    do this:

	lib_LTLIBRARIES = foo.la
	foo_la_LDFLAGS  = -module

    For backward compatibility, foo_la.c will be used instead of
    foo.c if this file exists or is the explicit target of a rule.
    However -Wobsolete will warn about this deprecated naming.

  - AR's `cru' flags are now set in a global ARFLAGS variable instead
    of being hard-coded in each $(AR) invocation, so they can be
    substituted from configure.ac.  This has been requested by people
    dealing with non-POSIX ar implementations.

  - New warning option: -Woverride.  This will warn about any user
    target or variable definitions which override Automake
    definitions.

  - Texinfo rules back up and restore info files when makeinfo fails.

  - Texinfo rules now support the `html' target.
    Running this requires Texinfo 4.0 or greater.

    `html' is a new recursive target, so if your package mixes
    hand-crafted `Makefile.in's with Automake-generated
    `Makefile.in's, you should adjust the former to support (or
    ignore) this target so that `make html' recurses successfully.  If
    you had a custom `html' rule in your `Makefile.am', it's better to
    rename it as `html-local', otherwise your rule will override
    Automake's new rule (you can check that by running `automake
    -Woverride') and that will stop the recursion to subdirectories.

    Last but not least, this `html' rule is declared PHONY, even when
    overridden.  Fortunately, it appears that few packages use a
    non-PHONY `html' rule.

  - Any file which is m4_included from configure.ac will appear as a
    configure and Makefile.in dependency, and will be automatically
    distributed.

  - The rules for rebuilding Makefiles and Makefile.ins will now
    rebuild all Makefiles and all Makefile.ins at once when one of
    configure's dependencies has changed.  This is considerably faster
    than previous implementations, where config.status and automake
    were run separately in each directory (this still happens when you
    change a Makefile.am locally, without touching configure.ac or
    friends).  Doing this also solves a longstanding issue: these
    rebuild rules failed to work when adding new directories to the
    tree, forcing you to run automake manually.

  - For similar reasons, the rules to rebuild configure,
    config.status, and aclocal.m4 are now defined in all directories.
    Note that if you were using the CONFIG_STATUS_DEPENDENCIES and
    CONFIGURE_DEPENDENCIES (formerly undocumented) variables, you
    should better define them in all directories.  This is easily done
    using an AC_SUBST (make sure you prefix these dependencies with
    $(top_srcdir) since this variable will appear at different
    levels of the build tree).

  - aclocal will now use `m4_include' instead of copying local m4
    files into aclocal.m4.  (Local m4 files are those you ship with
    your project, other files will be copied as usual.)

    Because m4_included files are automatically distributed, it means
    for most projects there is no point in EXTRA_DISTing the list of
    m4 files which are used.  (You can probably get rid of
    m4/Makefile.am if you had one.)

  - aclocal will avoid touching aclocal.m4 when possible, so that
    Autom4te's cache isn't needlessly invalidated.  This behavior can
    be switched off with the new `--force' option.

  - aclocal now uses Autoconf's --trace to detect macros which are
    actually used and will no longer include unused macros simply
    because they where mentioned.  This was often the case for macros
    called conditionally.

  - New options no-dist and no-dist-gzip.

  - compile, depcomp, elisp-comp, install-sh, mdate-sh, mkinstalldirs,
    py-compile, and ylwrap, now all understand --version and --help.

  - Automake will now recognize AC_CONFIG_LINKS so far as removing created
    links as part of the distclean target and including source files in
    distributions.

  - AM_PATH_PYTHON now supports ACTION-IF-FOUND and ACTION-IF-NOT-FOUND
    argument.  The latter can be used to override the default behavior
    (which is to abort).

  - Automake will exit with $? = 63 on version mismatch.  (So does
    Autoconf 2.58)  missing knows this, and in this case it will
    emulate the tools as if they were absent.  Because older versions
    of Automake and Autoconf did not use this exit code, this change
    will only be useful in projects generated with future versions of
    these tools.

  - When using AC_CONFIG_FILES with multiple input files, Automake
    generates the first ".in" input file for which a ".am" exists.
    (Former versions would try to use only the first input file.)

  - lisp_DATA is now allowed.  If you are using the empty ELCFILES
    idiom to disable byte-compilation of lisp_LISP files, it is
    recommended that you switch to using lisp_DATA.  Note that
    this is not strictly equivalent: lisp_DATA will install elisp
    files even if emacs is not installed, while *_LISP do not
    install anything unless emacs is found.

  - Makefiles will prefer `mkdir -p' over mkinstalldirs if it is
    available.  This selection is achieved through the Makefile
    variable $(mkdir_p) that is set by AM_INIT_AUTOMAKE to either
    `mkdir -m 0755 -p --', `$(mkinstalldirs) -m 0755', or
    `$(install_sh) -m 0755 -d'.

* Obsolete features

  - Because `mkdir -p' is available on most platforms, and we can use
    `install-sh -d' when it is not, the use of the mkinstalldirs
    script is being phased out.  `automake --add-missing' no longer
    installs it, and if you remove mkinstalldirs from your package,
    automake will define $(mkinstalldirs) as an alias for $(mkdir_p).

    Gettext 0.12.1 still requires mkinstalldirs.  Fortunately
    gettextize and autopoint will install it when needed.  Automake
    will continue to define the $(mkinstalldirs) and to distribute
    mkinstalldirs when this script is in the source tree.

  - AM_PROG_CC_STDC is now empty.  The content of this macro was
    merged in AC_PROG_CC.  If your code uses $am_cv_prog_cc_stdc, you
    should adjust it to use $ac_cv_prog_cc_stdc instead.  (This
    renaming should be safe, even if you have to support several,
    versions of Automake, because AC_PROG_CC defines this variable
    since Autoconf 2.54.)

  - Some users where using the undocumented ACLOCAL_M4_SOURCES
    variable to override the aclocal.m4 dependencies computed
    (inaccurately) by older versions of Automake.  Because Automake
    now tracks configure's m4 dependencies accurately (see m4_include
    above), the use of ACLOCAL_M4_SOURCES should be considered
    obsolete and will be flagged as such when running `automake
    -Wobsolete'.

* Bug fixes

  - Defining programs conditionally using Automake conditionals no
    longer leads to a combinatorial explosion.  The following
    construct used to be troublesome when used with dozens of
    conditions.

      bin_PROGRAMS = a
      if COND1
        bin_PROGRAMS += a1
      endif
      if COND2
        bin_PROGRAMS += a2
      endif
      if COND3
        bin_PROGRAMS += a3
      endif
      ...

    Likewise for _SOURCES, _LDADD, and _LIBADD variables.

  - Due to implementation constraints, previous versions of Automake
    proscribed multiple conditional definitions of some variables
    like bin_PROGRAMS:

      if COND1
        bin_PROGRAMS = a1
      endif
      if COND2
        bin_PROGRAMS = a2
      endif

    All _PROGRAMS, _LDADD, and _LIBADD variables were affected.
    This restriction has been lifted, and these variables now
    support multiple conditional definitions as do other variables.

  - Cleanup the definitions of $(distdir) and $(top_distdir).
    $(top_distdir) now points to the root of the distribution
    directory created during `make dist', as it did in Automake 1.4,
    not to the root of the build tree as it did in intervening
    versions.  Furthermore these two variables are now only defined in
    the top level Makefile, and passed to sub-directories when running
    `make dist'.

  - The --no-force option now correctly checks the Makefile.in's
    dependencies before deciding not to update it.

  - Do not assume that make files are called Makefile in cleaning rules.

  - Update .info files in the source tree, not in the build tree.  This
    is what the GNU Coding Standard recommend.  Only Automake 1.7.x
    used to update these files in the build tree (previous versions did
    it in the source tree too), and it caused several problems, varying
    from mere annoyance to portability issues.

  - COPYING, COPYING.LIB, and COPYING.LESSER are no longer overwritten
    when --add-missing and --force-missing are used.  For backward
    compatibility --add-missing will continue to install COPYING (in
    `gnu' strictness) when none of these three files exist, but this
    use is deprecated: you should better choose a license yourself and
    install it once for all in your source tree (and in your code
    management system).

  - Fix ylwrap so that it does not overwrite header files that haven't
    changed, as the inline rule already does.

  - User-defined rules override automake-defined rules for the same
    targets, even when rules do not have commands.  This is not new
    (and was documented), however some of the automake-generated
    rules have escaped this principle in former Automake versions.
    Rules for the following targets are affected by this fix:

       clean, clean-am, dist-all, distclean, distclean-am, dvi, dvi-am,
       info, info-am, install-data-am, install-exec-am, install-info,
       install-info-am, install-man, installcheck-am, maintainer-clean,
       maintainer-clean-am, mostlyclean, mostlyclean-am, pdf, pdf-am,
       ps, ps-am, uninstall-am, uninstall-info, uninstall-man

    Practically it means that an attempt to supplement the dependencies
    of some target, as in

       clean: my-clean-rule

    will now *silently override* the automake definition of the
    rule for this target.  Running `automake -Woverride' will diagnose
    all such overriding definitions.

    It should be noted that almost all of these targets support a *-local
    variant that is meant to supplement the automake-defined rule
    (See node `Extending' in the manual).  The above rule should
    be rewritten as

      clean-local: my-clean-rule

    These *-local targets have been documented since at least
    Automake 1.2, so you should not fear the change if you have
    to support multiple automake versions.

* Miscellaneous

  - The Automake manual is now distributed under the terms of the GNU FDL.

  - Targets dist-gzip, dist-bzip2, dist-tarZ, dist-zip are always defined.

  - core dumps are no longer removed by the cleaning rules.  There are
    at least three reasons for this:
      1. These files should not be created by any build step,
	 so their removal do not fit any of the cleaning rules.
	 Actually, they may be precious to the developer.
      2. If such file is created during a build, then it's clearly a
         bug Automake should not hide.  Not removing the file will
         cause `make distcheck' to complain about its presence.
      3. Operating systems have different naming conventions for
         core dump files.  A core file on one system might be a
	 completely legitimate data file on another system.

  - RUNTESTFLAGS, CTAGSFLAGS, ETAGSFLAGS, JAVACFLAGS are no longer
    defined by Automake.  This means that any definition in the
    environment will be used, unless overridden in the Makefile.am or
    on the command line.  The old behavior, where these variables were
    defined empty in each Makefile, can be obtained by AC_SUBSTing or
    AC_ARG_VARing each variable from configure.ac.

  - CONFIGURE_DEPENDENCIES and CONFIG_STATUS_DEPENDENCIES are now
    documented.  (The is not a new feature, these variables have
    been there since at least Automake 1.4.)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Bugs fixed in 1.7.9:
* Fix install-strip to work with nobase_ binaries.
* Fix renaming of #line directives in ylwrap.
* Rebuild with Autoconf 2.59.  (1.7.8 was not installable with pdksh.)

Bugs fixed in 1.7.8:
* Remove spurious blank lines in cleaning rules introduced in 1.7.7.
* Fix detection of Debian's install-info, broken since version 1.5.
  (Debian bug #213524).
* Honor -module if it appears in AM_LDFLAGS (i.e., relax name checking)
  This was only done for libfoo_LDFLAGS and LDFLAGS in previous versions.

Bugs fixed in 1.7.7:
* The implementation of automake's --no-force option is unreliable,
  so this option is ignored in this version.  A real fix will appear in
  Automake 1.8.  (Debian Bug #206299)
* AM_PATH_PYTHON: really check the whole list of interpreters if no
  argument is given.  (PR/399)
* Do not warn about leading `_' in variable names, even with -Wportability.
* Support user redefinitions of TEXINFO_TEX.
* depcomp: support AIX Compiler version 6.
* Fix missing rebuilds during `make dist' with BSD make.
  (Could produce tarballs containing out-of-date files.)
* Resurrect multilib support.
* Noteworthy manual updates:
  - Extending aclocal: how to write m4 macros that won't trigger warnings
    with Automake 1.8.
  - A Shared Library: Rewrite and split into subsections.

Bugs fixed in 1.7.6:
* Fix depcomp's icc mode for ICC 7.1.
* Diagnose calls to AC_CONFIG_FILES and friends with not enough arguments.
* Fix maintainer-clean's removal of autom4te.cache in VPATH builds.
* Fix AM_PATH_LISPDIR to work with POSIXLY_CORRECT=1.
* Fix the location reported in some diagnostics related to AUTOMAKE_OPTIONS.
* Remove Latin-1 characters from elisp-comp.
* Update the manual's @dircategory to match the Free Software Directory.

Bugs fixed in 1.7.5:
* Update install-sh's license to remove an advertising clause.
  (Debian bug #191717)
* Fix a bug introduced in 1.7.4, related to BUILT_SOURCE handling,
  that caused invalid Makefile.ins to be generated.
* Make sure AM_MAKE_INCLUDE doesn't fail when a `doit' file exists.
* New FAQ entry: renamed objects.

Bugs fixed in 1.7.4:
* Tweak the TAGS rule to support Exuberant Ctags (in addition to
  the Emacs implementation)
* Fix output of aclocal.m4 dependencies in subdirectories.
* Use `mv -f' instead of `mv' in fastdep rules.
* Upgrade mdate-sh to work on OS/2.
* Don't byte-compile elisp files when ELCFILES is set empty.
  (this documented feature was broken by 1.7.3)
* Diagnose trailing backslashes on last line of Makefile.am.
* Diagnose whitespace following trailing backslashes.
* Multiple tests are now correctly supported in DEJATOOL. (PR/388)
* Fix rebuilt rules for AC_CONFIG_FILES([Makefile:Makefile.in:Makefile.bot])
  Makefiles. (PR/389)
* `make install' will build `BUILT_SOURCES' first.
* Minor documentation fixes.

Bugs fixed in 1.7.3:
* Fix stamp files numbering (when using multiple AC_CONFIG_HEADERS).
* Query distutils for `pythondir' and `pythonexecdir', instead of
  using an hardcoded path.  This should allow builds on 64-bit
  distributions that usually use lib64/ instead of lib/.
* AM_PATH_PYTHON will also search for python2.3.
* elisp files are now built all at once instead of one by one. Besides
  incurring a speed-up, this is required to support interdependent elisp files.
* Support for DJGPP:
  - `make distcheck' will now work in `_inst/' and `_build' instead
    of `=inst/' and `=build/'
  - use `_dirstamp' when the file-system doesn't support `.dirstamp'
  - install/uninstall `*.i[0-9][0-9]'-style info files
  - more changes that affect only the Automake package (not its output)
* Fix some incompatibilities with upcoming perl-5.10.
* Properly quote AC_PACKAGE_TARNAME and AC_PACKAGE_VERSION when defining
  PACKAGE and VERSION.
* depcomp fixes:
  - dashmstdout and dashXmstdout modes: don't use `-o /dev/null', this
    is troublesome with gcc and Solaris compilers. (PR/385)
  - makedepend mode: work with Libtool. (PR/385 too)
  - support for ICC.
* better support for unusual gettext setups, such as multiple po/ directories
  (PR/381):
  - Flag missing po/ and intl/ directories as warnings, not errors.
  - Disable these warnings if po/ does not exist.
* Noteworthy manual updates:
  - New FAQ chapter.
  - Document how AC_CONFIG_AUX_DIR interacts with missing files.
    (Debian Bug #39542)
  - Document `AM_YFLAGS = -d'.  (PR/382)

Bugs fixed in 1.7.2:
* Fix installation and uninstallation of Info files built in subdirectories.
* Do not run `./configure --with-included-gettext' during `make distcheck'
  if AM_GNU_GETTEXT([external]) is used.
* Correctly uninstall renamed man pages.
* Do not strip escaped newline in variables defined in one condition
  and augmented in another condition.
* Fix ansi2knr rules for LIBOBJS sources.
* Clean all known Texinfo index files, not only those which appear to
  be used, because we cannot know which indexes are used in included files.
  (PR/375, Debian Bug #168671)
* Honor only the first @setfilename seen in a Texinfo file.
* Treat "required file X not found" diagnostics as errors (exit status 1).
* Don't complain that a required file is not found when it is a Makefile
  target. (PR/357)
* Don't use single suffix inference rules when building `.info'-less
  Info files, for the sake of Solaris make.
* The `check' target now depends on `$(BUILT_SOURCES)'. (PR/359)
* Recognize multiple inference rules such as `.a.b .c.d:'. (PR/371)
* Warn about multiple inference rules when -Wportability is used. (PR/372)
* Fix building of deansified files from subdirectories. (PR/370)
* Add missing `fi' in the .c->.obj rules.
* Improve install-sh to work even when names contain spaces or certain
  (but not all) shell metachars.
* Fix the following spurious failures in the test suite:
  depcomp2.test, gnits2.test, gnits3.test, python3.test, texinfo13.test
* Noteworthy manual updates:
  - Augment the section about BUILT_SOURCES.
  - Mention that AM_PROG_CC_STDC is a relic that is better avoided today.

Bugs fixed in 1.7.1:
* Honor `ansi2knr' for files built in subdirectories, or using per-targets
  flags.
* Aclocal should now recognize macro names containing parentheses, e.g.
  AC_DEFUN([AC_LANG_PREPROC(Fortran 90)], [...]).
* Erase *.sum and *.log files created by DejaGnu, during `make distclean'.
  (Debian Bug#153697)
* Install Python files even if they were built.  (PR/369)
* Have stamp-vti dependent upon configure instead of configure.ac, as the
  version might not be defined in the latter. (PR/358)
* Reorder arguments passed to a couple of commands, so things works
  when POSIXLY_CORRECT=1.
* Fix a regex that can cause Perl to segfault on large input.
  (Debian Bug#162583)
* Fix distribution of packages that have some sources defined conditionally,
  as in the `Conditional compilation using Automake conditionals' example
  of the manual.
* Fix spurious test suite failures on IRIX.
* Don't report a required variable as undefined if it has been
  defined conditionally for the "right" conditions.
* Fix cleaning of the /tmp subdirectory used by `make distcheck', in case
  `make distcheck' fails.
* Fix distribution of included Makefile fragment, so we don't create
  spurious directories in the distribution. (PR/366)
* Don't complain that a target lacks `.$(EXEEXT)' when it has it.

New in 1.7:
* Autoconf 2.54 is required.
* `aclocal' and `automake' will no longer warn about obsolete
  configure macros.  This is done by `autoconf -Wobsolete'.
* AM_CONFIG_HEADER, AM_SYS_POSIX_TERMIOS and
  AM_HEADER_TIOCGWINSZ_NEEDS_SYS_IOCTL are obsolete (although still
  supported).  You should use AC_CONFIG_HEADERS, AC_SYS_POSIX_TERMIOS,
  and AC_HEADER_TIOCGWINSZ instead.  `autoupdate' can upgrade
  `configure.ac' for you.
* Support for per-program and per-library `_CPPFLAGS'.
* New `ctags' target (builds CTAGS files).
* Support for -Wmumble and -Wno-mumble, where mumble is a warning category
  (see `automake --help' or the manual for a list of them).
* Honor the WARNINGS environment variable.
* Omit the call to depcomp when using gcc3: call the compiler directly.
* A new option, std-options, tests that programs support --help and --version
  when `make installcheck' is run.  This is enabled by --gnits.
* Texinfo rules now support the `ps' and `pdf' targets.
* Info files are now created in the build directory, not the source directory.
* info_TEXINFOS supports files in subdirectories (this requires Texinfo 4.1
  or greater).
* `make distcheck' will enforce DESTDIR support by attempting
  a DESTDIR install.
* `+=' can be used in conditionals, even if the augmented variable
  was defined for another condition.
* Makefile fragments (inserted with `include') are always distributed.
* Use Autoconf's --trace interface to inspect configure.ac and get
  a more accurate view of it.
* Add support for extending aclocal's default macro search path
  using a `dirlist' file within the aclocal directory.
* automake --output-dir is deprecated.
* The part of the distcheck target that checks whether uninstall actually
  removes all installed files has been moved in a separate target,
  distuninstallcheck, so it can be overridden easily.
* Many bug fixes.

New in 1.6.3:
* Support for AM_INIT_GETTEXT([external])
* Bug fixes, including:
  - Fix Automake's own `make install' so it works even if `ln' doesn't.
  - nobase_ programs and scripts honor --program-transform correctly.
  - Erase configure.lineno during `make distclean'.
  - Erase YACC and LEX outputs during `make maintainer-clean'.

New in 1.6.2:
* Many bug fixes, including:
  - Requiring the current version works.
  - Fix "$@" portability issues (for Zsh).
  - Fix output of dummy dependency files in presence of post-processed
    Makefile.in's.
  - Don't compute dependencies in background to avoid races with libtool.
  - Fix handling of _OBJECTS variables for targets sharing source variables.
  - Check dependency mode for Java when AM_PROG_GCJ is used.

New in 1.6.1:
* automake --output-dir is deprecated
* Many bug fixes, including:
  - Don't choke on AM_LDFLAGS definitions.
  - Clean libtool objects from subdirectories.
  - Allow configure variables with reserved suffix and unknown prefix
    (e.g. AC_SUBST(mumble_LDFLAGS) when 'mumble' is not a target).
  - Fix the definition of AUTOMAKE and ACLOCAL in configure.

New in 1.6:
* Autoconf 2.52 is required.
* automake no longer run libtoolize.
  This is the job of autoreconf (from GNU Autoconf).
* `dist' generates all the archive flavors, as did `dist-all'.
* `dist-gzip' generates the Gzip tar file only.
* Combining Automake Makefile conditionals no longer lead to a combinatorial
  explosion.  Makefile.in's keep a reasonable size.
* AM_FUNC_ERROR_AT_LINE, AM_FUNC_STRTOD, AM_FUNC_OBSTACK, AM_PTRDIFF_T
  are no longer shipped, since Autoconf 2.52 provides them (both as AM_
  and AC_).
* `#line' of Lex and Yacc files are properly set.
* EXTRA_DIST can contain generated directories.
* Support for dot-less extensions in suffix rules.
* The part of the distcheck target that checks whether distclean actually
  cleans all built files has been moved in a separate target, distcleancheck,
  so it can be overridden easily.
* `make distcheck' will pass additional options defined in
  $(DISTCHECK_CONFIGURE_FLAGS) to configure.
* Fixed CDPATH portability problems, in particular for MacOS X.
* Fixed handling of nobase_ targets.
* Fixed support of implicit rules leading to .lo objects.
* Fixed late inclusion of --add-missing files (e.g. depcomp) in DIST_COMMON
* Added uninstall-hook target
* `AC_INIT AM_INIT_AUTOMAKE(tarname,version)' is an obsolete construct.
  You can now use `AC_INIT(pkgname,version) AM_INIT_AUTOMAKE' instead.
  (Note that "pkgname" is not "tarname", see the manual for details.)
  It is also possible to pass a list of global Automake options as
  first argument to this new form of AM_INIT_AUTOMAKE.
* Compiler-based assembler is now called `CCAS'; people expected `AS'
  to be a real assembler.
* AM_INIT_AUTOMAKE will set STRIP itself when it needs it.  Adding
  AC_CHECK_TOOL([STRIP], [strip]) manually is no longer required.
* aclocal and automake are also installed with the version number
  appended, and some of the install directory names have changed.
  This lets you have multiple versions installed simultaneously.
* Support for parsers and lexers in subdirectories.

New in 1.5:
* Support for `configure.ac'.
* Support for `else COND', `endif COND' and negated conditions `!COND'.
* `make dist-all' is much faster.
* Allows '@' AC_SUBSTs in macro names.
* Faster AM_INIT_AUTOMAKE (requires update of `missing' script)
* User-side dependency tracking.  Developers no longer need GNU make
* Python support
* Uses DIST_SUBDIRS in some situations when SUBDIRS is conditional
* Most files are correctly handled if they appear in subdirs
  For instance, a _DATA file can appear in a subdir
* GNU tar is no longer required for `make dist'
* Added support for `dist_' and `nodist_' prefixes
* Added support for `nobase_' prefix
* Compiled Java support
* Support for per-executable and per-library compilation flags
* Many bug fixes

New in 1.4:
* Added support for the Fortran 77 programming language.
* Re-indexed the Automake Texinfo manual.
* Added `AM_FOOFLAGS' variable for each compiler invocation;
  e.g. AM_CFLAGS can be used in Makefile.am to set C compiler flags
* Support for latest autoconf, including support for objext
* Can now put `.' in SUBDIRS to control build order
* `include' command and `+=' support for macro assignment
* Dependency tracking no long susceptible to deleted header file problem
* Maintainer mode now a conditional.  @MAINT@ is now an anachronism.
* Bug fixes

New in 1.3:
* Bug fixes
* Better Cygwin32 support
* Support for suffix rules with _SOURCES variables
* New options `readme-alpha' and `check-news'; Gnits mode sets these
* @LEXLIB@ no longer required when lex source seen
  Lex support in `missing', and new lex macro.  Update your missing script.
* Built-in support for assembly
* aclocal gives error if `AM_' macro not found
* Passed YFLAGS, not YACCFLAGS, to yacc
* AM_PROG_CC_STDC does not have to come before AC_PROG_CPP
* Dependencies computed as a side effect of compilation
* Preliminary support for Java
* DESTDIR support at "make install" time
* Improved ansi2knr support; you must use the latest ansi2knr.c (included)

New in 1.2:
* Bug fixes
* Better DejaGnu support
* Added no-installinfo option
* Added Emacs Lisp support
* Added --no-force option
* Included `aclocal' program
* Automake will now generate rules to regenerate aclocal.m4, if appropriate
* Now uses `AM_' macro names everywhere
* ansi2knr option can have directory prefix (eg `../lib/ansi2knr')
  ansi2knr now works correctly on K&R sources
* Better C++, yacc, lex support
* Will compute _DEPENDENCIES variables automatically if not supplied
* Will interpolate $(...) and ${...} when examining contents of a variable
* .deps files now in build directory, not source directory; dependency
  handling generally rewritten
* DATA, MANS and BUILT_SOURCES no longer included in distribution
* can now put config.h into a subdir
* Added dist-all target
* Support for install-info program (see texinfo 3.9)
* Support for "yacc -d"
* configure substitutions are automatically discovered and included
  in generated Makefile.in
* Special --cygnus mode
* OMIT_DEPENDENCIES can now hold list of dependencies to be omitted
  when making distribution.  Some dependencies are auto-ignored.
* Changed how libraries are specified in _LIBRARIES variable
* Full libtool support, from Gord Matzigkeit
* No longer have to explicitly touch stamp-h when using AC_CONFIG_HEADER;
  AM_CONFIG_HEADER handles it automatically
* Texinfo output files no longer need .info extension
* Added `missing' support
* Cygwin32 support
* Conditionals in Makefile.am, from Ian Taylor

New in 1.0:
* Bug fixes
* distcheck target runs install and installcheck targets
* Added preliminary support for DejaGnu.

New in 0.33:
* More bug fixes
* More checking
* More libtool fixes from Gord Matzigkeit; libtool support is still
  preliminary however
* Added support for jm_MAINTAINER_MODE
* dist-zip support
* New "distcheck" target

New in 0.32:
* Many bug fixes
* mkinstalldirs and mdate-sh now appear in directory specified by
  AC_CONFIG_AUX_DIR.
* Removed DIST_SUBDIRS, DIST_OTHER
* AC_ARG_PROGRAM only required when an actual program exists
* dist-hook target now run before distribution packaged up; idea from
  Dieter Baron.  Other hooks exist, too.
* Preliminary (unfinished) support for libtool
* Added short option names.
* Better "dist" support when gluing together multiple packages

New in 0.31:
* Bug fixes
* Documentation updates (many from François Pinard)
* strictness `normal' now renamed to `foreign'
* Renamed --install-missing to --add-missing
* Now handles AC_CONFIG_AUX_DIR
* Now handles TESTS macro
* DIST_OTHER renamed to EXTRA_DIST
* DIST_SUBDIRS is deprecated
* @ALLOCA@ and @LIBOBJS@ now work in _LDADD variables
* Better error messages in many cases
* Program names are canonicalized
* Added "check" prefix; from Gord Matzigkeit

New in 0.30:
* Bug fixes
* configure.in scanner knows about AC_PATH_XTRA, AC_OUTPUT ":" syntax
* Beginnings of a test suite
* Automatically adds -I options for $(srcdir), ".", and path to config.h
* Doesn't print anything when running
* Beginnings of MAINT_CHARSET support
* Can specify version in AUTOMAKE_OPTIONS
* Most errors recognizable by Emacs' M-x next-error
* Added --verbose option
* All "primary" variables now obsolete; use EXTRA_PRIMARY to supply
  configure-generated names
* Required macros now distributed in aclocal.m4
* New documentation
* --strictness=gnu is default

New in 0.29:
* Many bug fixes
* More sophisticated configure.in scanning; now understands ALLOCA and
  LIBOBJS directly, handles AC_CONFIG_HEADER more precisely, etc.
* TEXINFOS and MANS now obsolete; use info_TEXINFOS and man_MANS instead.
* CONFIG_HEADER variable now obsolete
* Can handle multiple Texinfo sources
* Allow hierarchies deeper than 2.  From Gord Matzigkeit.
* HEADERS variable no longer needed; now can put .h files directly into
  foo_SOURCES variable.
* Automake automatically rebuilds files listed in AC_OUTPUT.  The
  corresponding ".in" files are included in the distribution.

New in 0.28:
* Added --gnu and --gnits options
* More standards checking
* Bug fixes
* Cleaned up 'dist' targets
* Added AUTOMAKE_OPTIONS variable and several options
* Now scans configure.in to get some information (preliminary)

New in 0.27:
* Works with Perl 4 again

New in 0.26:
* Added --install-missing option.
* Pretty-prints generated macros and rules
* Comments in Makefile.am are placed more intelligently in Makefile.in
* Generates .PHONY target
* Rule or macro in Makefile.am now overrides contents of Automake file
* Substantial cleanups from François Pinard

New in 0.25:
* Bug fixes.
* Works with Perl 4 again.

New in 0.24:
* New uniform naming scheme.
* --strictness option
* Works with Perl 5
* '.c' files corresponding to '.y' or '.l' files are automatically
  distributed.
* Many bug fixes and cleanups

New in 0.23:
* Allow objects to be conditionally included in libraries via lib_LIBADD.

New in 0.22:
* Bug fixes in 'clean' code.
* Now generates 'installdirs' target.
* man page installation reworked.
* 'make dist' no longer re-creates all Makefile.in's.

New in 0.21:
* Reimplemented in Perl
* Added --amdir option (for debugging)
* Texinfo support cleaned up.
* Automatic de-ANSI-fication cleaned up.
* Cleaned up 'clean' targets.

New in 0.20:
* Automatic dependency tracking
* More documentation
* New variables DATA and PACKAGEDATA
* SCRIPTS installed using $(INSTALL_SCRIPT)
* No longer uses double-colon rules
* Bug fixes
* Changes in advance of internationalization

-----

Copyright (C) 1995-2017 Free Software Foundation, Inc.

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

This program 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/>.
