[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Automake-NG] [PATCH 6/7] [ng] dist: new API to specify formats of d
From: |
Paolo Bonzini |
Subject: |
Re: [Automake-NG] [PATCH 6/7] [ng] dist: new API to specify formats of distribution tarballs |
Date: |
Tue, 21 Aug 2012 18:24:29 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:14.0) Gecko/20120717 Thunderbird/14.0 |
Il 12/08/2012 23:20, Stefano Lattarini ha scritto:
> The API to specify the formats of distribution tarballs has been changed
> completely, in a BACKWARD-INCOMPATIBLE way.
>
> Instead of using the various 'dist-*' automake options, the developer is
> now expected to specify the default formats of its distribution tarballs
> with the special variable AM_DIST_FORMATS; for example, where once would
> have been:
>
> AM_INIT_AUTOMAKE([dist-bzip2 dist-zip])
>
> now it must be:
>
> AM_DIST_FORMATS = gzip bzip2 zip
>
> and similarly, where once would have been:
>
> AUTOMAKE_OPTIONS = no-dist-gzip dist-bzip2 dist-xz
>
> now is it simply:
>
> AM_DIST_FORMATS = bzip2 xz
Nice, but I'm not sure why this couldn't have a backwards-compatible
replacement.
ifeq ($(origin AM_DIST_FORMATS),undefined)
AM_DIST_FORMATS := \
$(patsubst dist-%, %, $(filter dist-%, $(AUTOMAKE_OPTIONS)) \
$(if $(filter no-dist-gzip, $(AUTOMAKE_OPTIONS)),,gzip)
endif
This requires Automake-NG to merge AM_INIT_AUTOMAKE's arguments into the
Makefile.in's AUTOMAKE_OPTIONS, which is only goodness.
Paolo
> Similarly, The various 'dist-*' targets (dist-gzip, dist-xz, dist-lzip,
> dist-bzip2 and dist-gz) has been removed. If the user wants to generate
> tarballs for formats not specified by the default AM_DIST_FORMATS, he can
> simply override that variable dynamically:
>
> # Will generate a '.zip' archive and a '.tar.xz' archive, and not
> # further ones.
> make dist AM_DIST_FORMATS='zip xz'
>
> This change is of course is totally backward incompatible, but the
> enhanced flexibility and simplicity is worth it. Not to mention that
> the transition from the mainline Automake API to the new Automake-NG
> one is trivial.
>
> * NG-NEWS: Update.
> * ng/automake-ng.texi: Likewise.
> * configure.ac (AM_INIT_AUTOMAKE): Drop the 'dist-xz' option. While
> at it, drop the 'color-tests' option (now on by default, even in
> coming-soon Automake 1.13) and add the 'ng' option (mostly for some
> showing-off :-).
> * t/ax/am-test-lib.sh: Also unset 'AM_DIST_FORMATS'.
> * Makefile.am (AM_DIST_FORMATS): New, containing 'gzip' ad 'xz' (so
> that we distribute the same formats we did before).
> * lib/am/distcheck.mk (AM_DIST_FORMATS): New, defaulting to 'gzip'.
> (am.dist.bad-targets): New, list invalid entries of $(AM_DIST_FORMATS).
> Error out with a suitable message if that variable is non-empty.
> Rename all the 'dist-*' targets, once public, to '.am/dist-*' (which
> are private). Adjust their rules.
> (am.dist.all-targets): Adjust to said 'dist-*' => '.am/dist-*'
> renaming.
> (am.dist.default-targets): New, defined from $(AM_DIST_FORMATS).
> (dist, dist-all): Rewritten to rely on dependencies rather than on
> recursive make invocation (the new API allows us to do so easily).
> Other minor related adjustments.
> (distcheck): Use $(AM_DIST_FORMATS) instead of $(am.dist.formats)
> in the recipe.
> * automake.in (handle_dist): Drop analysis of the various 'dist-*'
> options, and of the 'no-dist-gzip' one; don't define the internal
> make variable 'am.dist.formats'.
> * lib/Automake/Options.pm (_is_valid_easy_option): Recognize the
> various 'dist-*' options and the 'no-dist-gzip' one no more.
> (_process_option_list): Explicitly reject them (to give better
> diagnostic).
> * t/dist-obsolete-opts.sh: New, check such diagnostic.
> * t/dist-obsolete.sh: Remove as obsolete.
> * t/repeated-options.sh: Minor adjustments to avoid spurious
> failures.
> * t/dist-formats.tap: Adjust heavily (almost a complete rewrite).
>
> Signed-off-by: Stefano Lattarini <address@hidden>
> ---
> Makefile.am | 3 +
> NG-NEWS | 48 +++-
> automake.in | 22 --
> configure.ac | 3 +-
> doc/automake-ng.texi | 109 ++++---
> lib/Automake/Options.pm | 22 +-
> lib/am/distcheck.mk | 34 +--
> t/ax/am-test-lib.sh | 2 +
> t/dist-formats.tap | 392
> ++++++--------------------
> t/{dist-obsolete.sh => dist-obsolete-opts.sh} | 15 +-
> t/repeated-options.sh | 25 +-
> 11 files changed, 229 insertions(+), 446 deletions(-)
> rename t/{dist-obsolete.sh => dist-obsolete-opts.sh} (64%)
>
> diff --git a/Makefile.am b/Makefile.am
> index db3dea7..9455f0f 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -27,6 +27,9 @@ EXTRA_DIST =
> ## Top level. ##
> ## ------------ ##
>
> +# Distribution formats.
> +AM_DIST_FORMATS = gzip xz
> +
> # We want a handful of substitutions to be fully-expanded by make;
> # then use config.status to substitute the remainder where a single
> # expansion is sufficient. We use a funny notation here to avoid
> diff --git a/NG-NEWS b/NG-NEWS
> index 8f3cf72..129da68 100644
> --- a/NG-NEWS
> +++ b/NG-NEWS
> @@ -212,24 +212,54 @@ Distribution
>
> EXTRA_DIST = $(wildcard doc/*.txt $(srcdir)/doc/*.txt) # Better.
>
> -* The make variables $(DISTFILES), $(DIST_COMMON), $(DIST_SOURCES),
> - $(DIST_TARGETS), $(DIST_ARCHIVES) had never been documented
> - in mainline Automake, and were always intended to be internal
> - variables. But that was not clear from their names. So we have
> - renamed rename like this:
> +* The make variables $(DISTFILES), $(DIST_COMMON), $(DIST_SOURCES) and
> + $(DIST_ARCHIVES) had never been documented in mainline Automake, and
> + were always intended to be internal variables. But that was not clear
> + from their names. So we have renamed rename like this:
>
> DISTFILES => am.dist.all-files
> DIST_COMMON => am.dist.common-files
> DIST_SOURCES => am.dist.sources
> - DIST_TARGETS => am.dist.default-targets
> DIST_ARCHIVES => am.dist.default-archives
>
> Do not use any of these variables in your Makefiles!
>
> * Support for distribution archived in the '.shar.gz' and '.tar.Z' formats
> - have been removed. Accordingly, the targets 'dist-shar' and 'dist-tarZ'
> - are no more present in the generated Makefiles, and the use of the
> - Automake options 'dist-shar' and 'dist-tarZ' will elicit a fatal error.
> + have been removed; and with them the targets 'dist-shar' and 'dist-tarZ'.
> +
> +* The API to specify the formats of distribution tarballs has been changed
> + completely.
> +
> + Instead of using the various 'dist-*' automake options, the developer is
> + now expected to specify the default formats of its distribution tarballs
> + with the special variable AM_DIST_FORMATS; for example, where once would
> + have been:
> +
> + AM_INIT_AUTOMAKE([dist-bzip2 dist-zip])
> +
> + now it must be:
> +
> + AM_DIST_FORMATS = gzip bzip2 zip
> +
> + and similarly, where once would have been:
> +
> + AUTOMAKE_OPTIONS = no-dist-gzip dist-bzip2 dist-xz
> +
> + now is it simply:
> +
> + AM_DIST_FORMATS = bzip2 xz
> +
> +* The various 'dist-*' targets (dist-gzip, dist-xz, dist-lzip, dist-bzip2
> + and dist-gz) has been removed. If the user wants to generate tarballs
> + for formats not specified by the default AM_DIST_FORMATS, he can simply
> + override that variable dynamically:
> +
> + # Will generate a '.zip' archive and a '.tar.xz' archive, and not
> + # further ones.
> + make dist AM_DIST_FORMATS='zip xz'
> +
> +* The DIST_TARGETS variable has been removed (as a side-effect of the
> + previous change).
>
>
> Obsolete Features Removed
> diff --git a/automake.in b/automake.in
> index 3a11b53..7428757 100644
> --- a/automake.in
> +++ b/automake.in
> @@ -3196,27 +3196,6 @@ sub handle_dist ()
> # The remaining definitions are only required when a dist target is used.
> return if option 'no-dist';
>
> - # The list of tarball formats we must support.
> - my @archive_formats;
> - if ($relative_dir eq '.')
> - {
> - # We order @archive_formats by expected duration of the
> - # compressors, slowest first, for better parallelism in
> - # "make dist".
> - unshift @archive_formats, 'gzip' unless option 'no-dist-gzip';
> - foreach my $fmt (qw/zip bzip2 lzip xz/)
> - {
> - unshift @archive_formats, $fmt if option "dist-$fmt";
> - }
> - # At least one of the archive formats must be enabled.
> - if (@archive_formats == 0)
> - {
> - error (option 'no-dist-gzip',
> - "no-dist-gzip specified but no dist-* specified,\n"
> - . "at least one archive format must be enabled");
> - }
> - }
> -
> # Look for common files that should be included in distribution.
> # If the aux dir is set, and it does not have a Makefile.am, then
> # we check for these files there as well.
> @@ -3276,7 +3255,6 @@ sub handle_dist ()
> rule ('distcheck-hook') ? 'yes' : '');
> define_variable ('am.dist.handle-gettext', INTERNAL,
> $seen_gettext && !$seen_gettext_external ? 'yes' : '');
> - define_variable ('am.dist.formats', INTERNAL, @archive_formats);
>
> my $flm = option 'filename-length-max';
> define_variable ('am.dist.filename-filter', INTERNAL,
> diff --git a/configure.ac b/configure.ac
> index 50176d8..ab64763 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -39,8 +39,7 @@ AC_SUBST([am_AUTOUPDATE], ["${AUTOUPDATE-autoupdate}"])
> dnl We call AC_PROG_CC in an unusual way, and only for use in our
> dnl testsuite, so also use 'no-dependencies' and 'no-define' among
> dnl the automake options to avoid bloating and potential problems.
> -AM_INIT_AUTOMAKE([dist-xz filename-length-max=99 color-tests
> - no-define no-dependencies])
> +AM_INIT_AUTOMAKE([filename-length-max=99 ng no-define no-dependencies])
>
> ## Keep this on a line of its own, since it must be found and processed
> ## by the 'update-copyright' rule in our Makefile.
> diff --git a/doc/automake-ng.texi b/doc/automake-ng.texi
> index 1470f63..ace21c5 100644
> --- a/doc/automake-ng.texi
> +++ b/doc/automake-ng.texi
> @@ -3930,7 +3930,7 @@ By default this macro @code{AC_DEFINE}'s @code{PACKAGE}
> and
> @code{VERSION}. This can be avoided by passing the @option{no-define}
> option:
> @example
> -AM_INIT_AUTOMAKE([gnits 1.5 no-define dist-bzip2])
> +AM_INIT_AUTOMAKE([gnits 1.11.6 no-define parallel-tests])
> @end example
>
> @item AM_PATH_LISPDIR
> @@ -8271,9 +8271,6 @@ distribution. The file is named based on the
> @code{PACKAGE} and
> @code{VERSION} variables defined by @code{AM_INIT_AUTOMAKE}
> (@pxref{Macros}); more precisely the gzipped @code{tar} file is named
> @address@hidden@var{version}.tar.gz}.
> address@hidden GZIP_ENV
> -You can use the @command{make} variable @code{GZIP_ENV} to control how gzip
> -is run. The default setting is @option{--best}.
>
> @cindex @code{m4_include}, distribution
> @cindex @code{include}, distribution
> @@ -8547,49 +8544,74 @@ distuninstallcheck:
> @node The Types of Distributions
> @section The Types of Distributions
>
> -Automake generates rules to provide archives of the project for
> -distributions in various formats. Their targets are:
> +Automake-generated @code{dist} rule can generated distributions in
> +various formats, depending on the content of the @code{AM_DIST_FORMATS}
> +variable; this is overridable at runtime, defaults to @code{gzip}, and
> +can contain several formats at once, to produce several kind of archives
> +in one go. The recognized formats are:
>
> @table @asis
> address@hidden GZIP_ENV
> address@hidden @code{gzip}
> +Usual compression with GNU @command{gzip}. Not very size-efficient
> +these days, but very portable and fast. You can use the @command{make}
> +variable @code{GZIP_ENV} to control which options @code{make dist}
> +passes to @code{gzip} (the default setting being @option{--best}).
> +For example:
> address@hidden
> +make dist GZIP_ENV=--fast
> address@hidden smallexample
> address@hidden gzip compression
> address@hidden Compression, gzip format
> +
> @vindex BZIP2
> address@hidden @code{dist-bzip2}
> -Generate a bzip2 tar archive of the distribution. bzip2 archives are
> -frequently smaller than gzipped archives.
> -By default, this rule makes @samp{bzip2} use a compression option of
> @option{-9}.
> -To make it use a different one, set the @env{BZIP2} environment variable.
> -For example, @samp{make dist-bzip2 BZIP2=-7}.
> address@hidden dist-bzip2
> -
> address@hidden @code{dist-gzip}
> -Generate a gzip tar archive of the distribution.
> address@hidden dist-gzip
> -
> address@hidden @code{dist-lzip}
> address@hidden @code{bzip2}
> +Archives compressed with @command{bzip2} are frequently smaller than
> +gzipped archives (albeit becoming more and more obsolescent today,
> +superseded by more advanced formats like @code{xz}). You can use
> +the environment variable @code{BZIP2} to control which options
> address@hidden dist} passes to @code{gzip} (the default setting being
> address@hidden). For example:
> address@hidden
> +make dist AM_DIST_FORMATS=bzip2 BZIP2=-7
> address@hidden smallexample
> address@hidden bzip2 compression
> address@hidden Compression, bzip2 format
> +
> address@hidden LZIP_OPT
> address@hidden @code{lzip}
> Generate an @samp{lzip} tar archive of the distribution. @command{lzip}
> archives are frequently smaller than @command{bzip2}-compressed archives.
> address@hidden dist-lzip
> +You can use the environment variable @code{LZIP_OPT} to control which
> +options @code{make dist} passes to @code{gzip} (the default setting
> +being @option{-9}). For example:
> address@hidden
> +make dist AM_DIST_FORMATS=lzip LZIP_OPT=--fast
> address@hidden smallexample
> address@hidden lzip compression
> address@hidden Compression, lzip format
>
> @vindex XZ_OPT
> address@hidden @code{dist-xz}
> address@hidden @code{xz}
> Generate an @samp{xz} tar archive of the distribution. @command{xz}
> archives are frequently smaller than @command{bzip2}-compressed archives.
> By default, this rule makes @samp{xz} use a compression option of
> @option{-e}. To make it use a different one, set the @env{XZ_OPT}
> environment variable. For example, run this command to use the
> default compression ratio, but with a progress indicator:
> address@hidden dist-xz XZ_OPT=-7e}.
> address@hidden dist-xz
> address@hidden
> +make dist AM_DIST_FORMATS=xz XZ_OPT=-7e
> address@hidden smallexample
> address@hidden xz compression
> address@hidden Compression, xz format
>
> address@hidden @code{dist-zip}
> address@hidden @code{zip}
> Generate a zip archive of the distribution.
> address@hidden dist-zip
> address@hidden zip compression
> address@hidden Compression, zip format
>
> @end table
>
> -The rule @code{dist} (and its historical synonym @code{dist-all}) will
> -create archives in all the enabled formats, @ref{Options}. By
> -default, only the @code{dist-gzip} target is hooked to @code{dist}.
> -
>
> @node Tests
> @chapter Support for test suites
> @@ -9909,24 +9931,6 @@ in the first few lines of the @file{NEWS} file.
> @opindex dejagnu
> Cause @command{dejagnu}-specific rules to be generated. @xref{DejaGnu
> Tests}.
>
> address@hidden @option{dist-bzip2}
> address@hidden Option, @option{dist-bzip2}
> address@hidden dist-bzip2
> -Hook @code{dist-bzip2} to @code{dist}.
> address@hidden dist-bzip2
> -
> address@hidden @option{dist-lzip}
> address@hidden Option, @option{dist-lzip}
> address@hidden dist-lzip
> -Hook @code{dist-lzip} to @code{dist}.
> address@hidden dist-lzip
> -
> address@hidden @option{dist-zip}
> address@hidden Option, @option{dist-zip}
> address@hidden dist-zip
> -Hook @code{dist-zip} to @code{dist}.
> address@hidden dist-zip
> -
> @item @option{filename-length-max=99}
> @cindex Option, @option{filename-length-max=99}
> @opindex filename-length-max=99
> @@ -9969,12 +9973,6 @@ disable automatic dependency tracking.
> Don't emit any code related to @code{dist} target. This is useful
> when a package has its own method for making distributions.
>
> address@hidden @option{no-dist-gzip}
> address@hidden Option, @option{no-dist-gzip}
> address@hidden no-dist-gzip
> -Do not hook @code{dist-gzip} to @code{dist}.
> address@hidden no-dist-gzip
> -
> @item @option{no-exeext}
> @cindex Option, @option{no-exeext}
> @opindex no-exeext
> @@ -10089,10 +10087,7 @@ AM_INSTALLCHECK_STD_OPTIONS_EXEMPT = false$(EXEEXT)
> true.sh
> @opindex tar-pax
>
> These three mutually exclusive options select the tar format to use
> -when generating tarballs with @samp{make dist}. (The tar file created
> -is then compressed according to the set of @option{no-dist-gzip},
> address@hidden, @option{dist-lzip}, @option{dist-xz} and
> address@hidden options in use.)
> +when generating tarballs with @samp{make dist}.
>
> These options must be passed as arguments to @code{AM_INIT_AUTOMAKE}
> (@pxref{Macros}) because they can require additional configure checks.
> diff --git a/lib/Automake/Options.pm b/lib/Automake/Options.pm
> index bdb3db9..77e9cbd 100644
> --- a/lib/Automake/Options.pm
> +++ b/lib/Automake/Options.pm
> @@ -270,15 +270,10 @@ sub _is_valid_easy_option ($)
> check-news
> color-tests
> dejagnu
> - dist-bzip2
> - dist-lzip
> - dist-xz
> - dist-zip
> ng
> no-define
> no-dependencies
> no-dist
> - no-dist-gzip
> no-exeext
> no-installinfo
> no-installman
> @@ -318,20 +313,11 @@ sub _process_option_list (\%@)
> {
> error $where, "support for Cygnus-style trees has been removed";
> }
> - elsif ($_ eq 'dist-lzma')
> + elsif (/^(?:no-)?dist-.*/)
> {
> - error ($where, "support for lzma-compressed distribution " .
> - "archives has been removed");
> - }
> - elsif ($_ eq 'dist-tarZ')
> - {
> - error ($where, "distribution archives compressed with legacy " .
> - "'compress' program are no more supported");
> - }
> - elsif ($_ eq 'dist-shar')
> - {
> - error ($where, "support for shar distribution archives has " .
> - "been removed");
> + error ($where,
> + "'$_' option and the like are no more supported;\n" .
> + "use AM_DIST_FORMATS in top-level Makefile.am instead");
> }
> elsif (/^filename-length-max=(\d+)$/)
> {
> diff --git a/lib/am/distcheck.mk b/lib/am/distcheck.mk
> index 5da7118..a6009a9 100644
> --- a/lib/am/distcheck.mk
> +++ b/lib/am/distcheck.mk
> @@ -67,7 +67,21 @@ am.dist.create-cmd.zip = \
> am.dist.extract-cmd.zip = \
> unzip $(distdir).zip
>
> -am.dist.all-targets = $(patsubst %,dist-%,$(am.dist.all-formats))
> +# This is namespace-safe, so it's OK to accept values from
> +# the environment.
> +AM_DIST_FORMATS ?= gzip
> +
> +am.dist.bad-targets := \
> + $(filter-out $(am.dist.all-formats),$(AM_DIST_FORMATS))
> +ifdef am.dist.bad-targets
> + $(call am.fatal,Invalid distribution formats: $(am.dist.bad-targets))
> +endif
> +
> +am.dist.all-targets = $(patsubst %,.am/dist-%,$(am.dist.all-formats))
> +am.dist.default-targets = $(patsubst %,.am/dist-%,$(AM_DIST_FORMATS))
> +
> +am.dist.default-archives = \
> + $(foreach x,$(AM_DIST_FORMATS),$(distdir).$(am.dist.ext.$x))
>
> define am.dist.create-archive-for-format.aux
> $(or $(am.dist.create-cmd.$1), \
> @@ -90,28 +104,16 @@ am.dist.extract-archive-for-format = $(call
> $0.aux,$(strip $1))
> # commit v0.0-7569-gec58403). So keep it.
> GZIP_ENV = --best
>
> -am.dist.default-targets = \
> - $(foreach x,$(am.dist.formats),dist-$x)
> -am.dist.default-archives = \
> - $(foreach x,$(am.dist.formats),$(distdir).$(am.dist.ext.$x))
> -
> .PHONY: $(am.dist.all-targets)
> -$(am.dist.all-targets): dist-%: distdir
> +$(am.dist.all-targets): .am/dist-%: distdir
> $(call am.dist.create-archive-for-format,$*)
> - $(am.dist.post-remove-distdir)
> -
> -
> -# -------------------------------------------------- #
> -# Building all the requested distribution flavors. #
> -# -------------------------------------------------- #
>
> ifdef SUBDIRS
> AM_RECURSIVE_TARGETS += dist dist-all
> endif
>
> .PHONY: dist dist-all
> -dist dist-all:
> - $(MAKE) $(am.dist.default-targets) am.dist.post-remove-distdir='@:'
> +dist dist-all: $(am.dist.default-targets)
> $(am.dist.post-remove-distdir)
>
>
> @@ -129,7 +131,7 @@ endif
> .PHONY: distcheck
> distcheck: dist
> $(call am.dist.extract-archive-for-format, \
> - $(firstword $(am.dist.formats)))
> + $(firstword $(AM_DIST_FORMATS)))
> ## Make the new source tree read-only. Distributions ought to work in
> ## this case. However, make the top-level directory writable so we
> ## can make our new subdirs.
> diff --git a/t/ax/am-test-lib.sh b/t/ax/am-test-lib.sh
> index e41c840..e1b3c02 100644
> --- a/t/ax/am-test-lib.sh
> +++ b/t/ax/am-test-lib.sh
> @@ -46,6 +46,8 @@ set +e
> unset MFLAGS MAKEFLAGS MAKELEVEL
> # Unset verbosity flag.
> unset V
> +# Distribution formats.
> +unset AM_DIST_FORMATS
> # Also unset variables that might let "make install" divert files
> # into unwanted directories.
> unset DESTDIR
> diff --git a/t/dist-formats.tap b/t/dist-formats.tap
> index d03fc74..5737227 100755
> --- a/t/dist-formats.tap
> +++ b/t/dist-formats.tap
> @@ -17,43 +17,52 @@
> # Check support for different compression formats used by distribution
> # archives.
>
> -am_create_testdir=empty
> . ./defs || exit 1
>
> -plan_ 59
> +plan_ 18
>
> -# ---------------------------------------------------- #
> -# Common and/or auxiliary subroutines and variables. #
> -# ---------------------------------------------------- #
> -
> -ocwd=$(pwd) || fatal_ "getting current working directory"
> +# -------------------------------------- #
> +# Auxiliary subroutines and variables. #
> +# -------------------------------------- #
>
> TAR='' && unset TAR
>
> -# Create common aclocal.m4 file, for later tests.
> -mkdir setup \
> - && cd setup \
> - && echo 'AC_INIT([x], [0]) AM_INIT_AUTOMAKE' > configure.ac \
> - && $ACLOCAL \
> - && mv aclocal.m4 .. \
> - && cd .. \
> - && rm -rf setup \
> - || fatal_ "creating common aclocal.m4 file"
> -
> # Set variables '$compressor' and '$suffix'.
> setup_vars_for_compression_format ()
> {
> - suffix=NONE compressor=NONE
> + suffix=NONE
> case $1 in
> - gzip) suffix=tar.gz compressor=gzip ;;
> - lzip) suffix=tar.lz compressor=lzip ;;
> - xz) suffix=tar.xz compressor=xz ;;
> - bzip2) suffix=tar.bz2 compressor=bzip2 ;;
> - zip) suffix=zip compressor=zip ;;
> + gzip) suffix=tar.gz ;;
> + lzip) suffix=tar.lz ;;
> + xz) suffix=tar.xz ;;
> + bzip2) suffix=tar.bz2 ;;
> + zip) suffix=zip ;;
> *) fatal_ "invalid compression format '$1'";;
> esac
> + compressor=$1
> }
>
> +check_tarball ()
> +{
> + format=$1
> + (
> + setup_vars_for_compression_format $format \
> + && tarball=$distdir.$suffix \
> + && test -f $tarball \
> + && mkdir check-$format \
> + && cp $tarball check-$format \
> + && cd check-$format \
> + && $compressor -d $tarball \
> + && tar xvf $distdir.tar \
> + && diff ../Makefile.in $distdir/Makefile.in \
> + && diff ../aclocal.m4 $distdir/aclocal.m4 \
> + && diff ../configure $distdir/configure \
> + && cd .. \
> + && rm -rf check-$format
> + )
> +}
> +
> +
> have_compressor ()
> {
> test $# -eq 1 || fatal_ "have_compressor(): bad usage"
> @@ -113,326 +122,91 @@ have_all_compressors ()
> test -z "$missing_compressors"
> }
>
> -start_subtest ()
> +clean_dist ()
> {
> - name=$1; shift
> - test -n "$name" || fatal_ "start_subtest: no subtest name given"
> - if test $# -gt 0; then
> - eval "$@" || fatal_ "start_subtest: evaluating assignments"
> - fi
> - ac_opts=$(echo $ac_opts | tr ',' ' ')
> - am_opts=$(echo $am_opts | tr ',' ' ')
> - mkdir "$name"
> - cd "$name"
> - unindent > configure.ac <<END
> - AC_INIT([$name], [1.0])
> - AM_INIT_AUTOMAKE([$ac_opts])
> - AC_CONFIG_FILES([Makefile])
> - AC_OUTPUT
> -END
> - echo "AUTOMAKE_OPTIONS = $am_opts" > Makefile.am
> - # It is imperative that aclocal.m4 is copied after configure.ac has
> - # been created, to avoid a spurious trigger of the automatic remake
> - # rules for configure & co.
> - cp "$ocwd"/aclocal.m4 \
> - "$am_scriptdir"/missing \
> - "$am_scriptdir"/install-sh \
> - .
> + rm -rf *$distdir*
> }
>
> -end_subtest ()
> -{
> - unset name; unset ac_opts; unset am_opts;
> - cd "$ocwd" || fatal_ "couldn't chdir back to '$ocwd'"
> -}
> +# ------------------------- #
> +# Setup and basic checks. #
> +# ------------------------- #
>
> -command_ok_if_have_compressor ()
> -{
> - if have_compressor "$compressor"; then
> - command_ok_ "$@"
> - else
> - skip_ -r "'$compressor' not available" "$1"
> - fi
> -}
> -
> -can_compress ()
> -{
> - test $# -eq 2 || fatal_ "can_compress: bad number of arguments"
> - tarname=$1 format=$2
> - setup_vars_for_compression_format "$format"
> -
> - command_ok_ "'dist-$format' target always created" $MAKE -n dist-$format
> -
> - command_ok_if_have_compressor "'make dist-$format' work by default" \
> - eval '
> - rm -rf *$tarname* \
> - && $MAKE dist-$format \
> - && ls -l *$tarname* \
> - && test -f $tarname-1.0.$suffix \
> - && test "$(echo *$tarname*)" = $tarname-1.0.$suffix'
> -
> - unset suffix compressor format tarname
> -}
> -
> -# ---------------------------------------- #
> -# Defaults layout of the dist-* targets. #
> -# ---------------------------------------- #
> -
> -start_subtest defaults
> -
> -command_ok_ "default [automake]" $AUTOMAKE
> -command_ok_ "default [autoconf]" $AUTOCONF
> -command_ok_ "default [configure]" ./configure
> -command_ok_ "default [make distcheck]" $MAKE distcheck
> -
> -command_ok_ "'make dist' only builds *.tar.gz by default" \
> - test "$(ls *defaults*)" = defaults-1.0.tar.gz
> +echo AC_OUTPUT >> configure.ac
> +: > Makefile.am
>
> -rm -rf *defaults*
> +$ACLOCAL && $AUTOCONF && $AUTOMAKE -a || fatal_ "autotools failed"
> +./configure || fatal_ "./configure failed"
>
> -for fmt in $all_compression_formats; do
> - can_compress defaults $fmt
> -done
> -unset fmt
> -
> -end_subtest
> -
> -# ----------------------------------------------------------- #
> -# Check diagnostic for no-dist-gzip without another dist-*. #
> -# ----------------------------------------------------------- #
> -
> -nogzip_stderr ()
> -{
> - grep "$1:.*no-dist-gzip" stderr \
> - && grep "$1:.* at least one archive format must be enabled" stderr
> -}
> +command_ok_ "make distcheck" $MAKE distcheck
>
> -nogzip_automake_failure ()
> -{
> - AUTOMAKE_fails -d "no-dist-gzip ($1) without other formats is an error"
> - command_ok_ "no-dist-gzip ($1) without other formats gives diagnostic" \
> - nogzip_stderr "$2"
> -}
> -
> -start_subtest am-nogz-only am_opts=no-dist-gzip ac_opts=
> -nogzip_automake_failure 'am' 'Makefile\.am:1'
> -end_subtest
> +command_ok_ "only gzip archive is built by default" \
> + test "$(ls *$distdir*)" = $distdir.tar.gz
>
> -start_subtest ac-nogz-only am_opts= ac_opts=no-dist-gzip
> -nogzip_automake_failure 'ac' 'configure\.ac:2'
> -end_subtest
>
> -# ------------------------------------------------- #
> -# Check use of no-dist-gzip with a dist-* option. #
> -# ------------------------------------------------- #
> -
> -append_to_opt ()
> -{
> - var=$1_opts val=$2
> - eval "$var=\${$var:+\"\$$var,\"}\$val" || fatal_ "evaluating \${$var}"
> - unset var val
> -}
> +# ------------------------------------- #
> +# Test all known formats, separately. #
> +# ------------------------------------- #
>
> -nogzip ()
> -{
> - test $#,$1,$3,$5 = 6,in,and,in \
> - && case $2,$6 in ac,ac|ac,am|am,ac|am,am) :;; *) false;; esac \
> - || fatal_ "nogzip: invalid usage"
> - format=$4 where_dist_nogzip=$2 where_dist_format=$6
> - shift 6
> -
> - am_opts= ac_opts=
> - append_to_opt $where_dist_format dist-$format
> - append_to_opt $where_dist_nogzip no-dist-gzip
> +for format in $all_compression_formats; do
> setup_vars_for_compression_format "$format"
> - # Do these before the am_opts and ac_opts variable can be munged
> - # by 'start_subtest'.
> - desc=
> - test -n "$am_opts" && desc=${desc:+"$desc "}"am=$am_opts"
> - test -n "$ac_opts" && desc=${desc:+"$desc "}"ac=$ac_opts"
> -
> - start_subtest nogzip-$format am_opts=$am_opts ac_opts=$ac_opts
> -
> - unindent >> Makefile.am <<END
> - check-ark-name:
> - test \$(am.dist.default-archives) = \$(distdir).$suffix
> - check-ark-exists:
> - test -f \$(distdir).$suffix
> - check-no-tar-gz:
> - test ! -f \$(distdir).tar.gz
> -END
> -
> - command_ok_ "$desc [automake]" $AUTOMAKE
> - command_ok_ "$desc [autoconf]" $AUTOCONF
> - command_ok_ "$desc [configure]" ./configure
> - command_ok_ "$desc [ark-name]" $MAKE check-ark-name
> - command_ok_if_have_compressor "$desc [distcheck]" $MAKE distcheck
> - command_ok_if_have_compressor "$desc [ark-exists]" $MAKE check-ark-exists
> - command_ok_ "$desc [no .tar.gz]" $MAKE check-no-tar-gz
> -
> - unset desc
> -
> - end_subtest
> -}
> -
> -# $1 $2 $3 $4 $5 $6
> -nogzip in am and bzip2 in am
> -nogzip in ac and xz in ac
> -nogzip in am and lzip in am
> -
> -
> -# ----------------------------------------------------------- #
> -# The 'dist-gzip' target is created also with no-dist-gzip. #
> -# ----------------------------------------------------------- #
> -
> -start_subtest dist-gzip-persistence am_opts=no-dist-gzip,dist-xz
> -command_ok_ "dist-gzip persistence [automake]" $AUTOMAKE
> -command_ok_ "dist-gzip persistence [autoconf]" $AUTOCONF
> -command_ok_ "dist-gzip persistence [configure]" ./configure
> -can_compress dist-gzip-persistence gzip
> -end_subtest
> -
> + desc="$format distribution format"
> + command_ok_ "$desc [seems accepted]" \
> + $MAKE -n dist AM_DIST_FORMATS="$format"
> + if have_compressor "$compressor"; then
> + command_ok_ "$desc $format distribution format [works]" \
> + eval '$MAKE dist AM_DIST_FORMATS="$format" \
> + && ls -l *$distdir* \
> + && test -f $distdir.$suffix \
> + && test "$(echo *$distdir*)" = $distdir.$suffix'
> + else
> + skip_ -r "'$compressor' not available" "$1"
> + fi
> + clean_dist
> + unset desc suffix compressor format
> +done
>
> # ----------------------- #
> # Parallel compression. #
> # ----------------------- #
>
> -# We only use formats requiring 'gzip', 'bzip2' and 'compress' programs,
> -# since there are the most likely to be all found on the great majority
> -# of systems.
> -
> -start_subtest parallel-compression ac_opts=dist-bzip2 am_opts=dist-xz
> +# We only use formats requiring 'gzip', 'bzip2' and 'xz' programs,
> +# since there are the most likely to be all found on the great
> +# majority of systems.
>
> -desc=gzip+bzip2+xz
> -tarname=parallel-compression-1.0
> -
> -check_tarball ()
> -{
> - format=$1
> - setup_vars_for_compression_format $format
> - (
> - tarball=$tarname.$suffix \
> - && test -f $tarball \
> - && mkdir check-$format \
> - && cp $tarball check-$format \
> - && cd check-$format \
> - && $compressor -d $tarball \
> - && tar xvf $tarname.tar \
> - && diff ../Makefile.in $tarname/Makefile.in \
> - && cd .. \
> - && rm -rf check-$format
> - )
> -}
> -
> -command_ok_ "$desc [automake]" $AUTOMAKE
> +desc='parallel compression'
>
> skip_reason=
> -have_compressor compress || skip_reason="'compress' not available"
> +have_compressor xz || skip_reason="'xz' not available"
> have_compressor bzip2 || skip_reason="'bzip2' not available"
>
> if test -n "$skip_reason"; then
> skip_row_ 6 -r "$skip_reason" "$desc"
> else
> - command_ok_ "$desc [autoconf]" $AUTOCONF
> - command_ok_ "$desc [configure]" ./configure
> - command_ok_ "$desc [make -j4 dist-all]" $MAKE -j4 dist
> + command_ok_ "$desc [make -j8 distcheck]" \
> + $MAKE -j8 distcheck AM_DIST_FORMATS='gzip bzip2 xz'
> ls -l # For debugging.
> command_ok_ "$desc [check .tar.gz tarball]" check_tarball gzip
> command_ok_ "$desc [check .tar.bz2 tarball]" check_tarball bzip2
> command_ok_ "$desc [check .tar.xz tarball]" check_tarball xz
> fi
>
> -unset tarname desc skip_reason
> -
> -end_subtest
> -
> -
> -# --------------------------------------------------------- #
> -# The various 'dist-*' targets can happily work together. #
> -# --------------------------------------------------------- #
> -
> -start_subtest all-together
> -
> -desc='all compressors together'
> -tarname=all-together-1.0
> -
> -echo 'AM_INIT_AUTOMAKE([' > am-init.m4
> -echo 'AUTOMAKE_OPTIONS =' > Makefile.am
> -
> -# Add half 'dist-*' options to AM_INIT_AUTOMAKE, half to AUTOMAKE_OPTIONS.
> -flip=:
> -for fmt in $all_compression_formats; do
> - test $fmt = gzip && continue
> - if $flip; then
> - echo " dist-$fmt" >> am-init.m4
> - flip=false
> - else
> - echo "AUTOMAKE_OPTIONS += dist-$fmt" >> Makefile.am
> - flip=:
> - fi
> -done
> -unset flip fmt
> -
> -echo '])' >> am-init.m4
> -
> -sed 's/AM_INIT_AUTOMAKE.*/m4_include([am-init.m4])/' configure.ac > t
> -mv -f t configure.ac
> -
> -# For debugging.
> -cat Makefile.am
> -cat configure.ac
> -cat am-init.m4
> -
> -command_ok_ "$desc [aclocal]" $ACLOCAL --force
> -command_ok_ "$desc [automake]" $AUTOMAKE
> -command_ok_ "$desc [autoconf]" $AUTOCONF
> -command_ok_ "$desc [configure]" ./configure
> -
> -if have_all_compressors; then
> - command_ok_ "$desc [make distcheck, real]" $MAKE distcheck
> -else
> - skip_ -r "not all compressors available" "$desc [make distcheck, real]"
> -fi
> -
> -# We fake existence of all the compressors here, so that we don't have
> -# to require any of them to run the further tests. This is especially
> -# important since it's very unlikely that a non-developer has all the
> -# compression tools installed on his machine at the same time.
> -
> -mkdir bin
> -cd bin
> -cat > check-distdir <<END
> -#!/bin/sh
> -{ ls -l '$tarname' && diff Makefile.am '$tarname'/Makefile.am; } >&2 \
> - || { echo "== distdir fail =="; exit 1; }
> -END
> -cat > grep-distdir-error <<'END'
> -#!/bin/sh
> -grep 'distdir fail' && exit 1
> -:
> -END
> -chmod a+x check-distdir grep-distdir-error
> -for prog in tar $all_compressors; do
> - case $prog in
> - tar|zip) cp check-distdir $prog;;
> - *) cp grep-distdir-error $prog;;
> - esac
> -done
> -unset prog
> -ls -l # For debugging.
> -cd ..
> +clean_dist
> +unset desc skip_reason
>
> -oPATH=$PATH
> -PATH=$(pwd)/bin$PATH_SEPARATOR$PATH; export PATH
>
> -command_ok_ \
> - "$desc ['make dist-all', stubbed]" \
> - $MAKE dist-all
> +# ------------------------------- #
> +# Invalid distribution formats. #
> +# ------------------------------- #
>
> -command_ok_ "$desc ['make dist -j4', stubbed]" $MAKE -j4 dist
> +command_ok_ "invalid distribution formats [exit status]" eval '
> + ! $MAKE dist AM_DIST_FORMATS="foobar tarZ shar" 2>stderr'
>
> -PATH=$oPATH; export PATH
> +cat stderr >&2 # For debugging.
>
> -end_subtest
> +command_ok_ "invalid distribution formats [error report]" eval '
> + sed -e "s/^/ /" -e "s/$/ /" stderr >stderr2 \
> + && grep "[iI]nvalid distribution format.* foobar " stderr2 \
> + && grep "[iI]nvalid distribution format.* tarZ " stderr2 \
> + && grep "[iI]nvalid distribution format.* shar " stderr2'
>
> :
> diff --git a/t/dist-obsolete.sh b/t/dist-obsolete-opts.sh
> similarity index 64%
> rename from t/dist-obsolete.sh
> rename to t/dist-obsolete-opts.sh
> index a7b68d0..06bea8d 100644
> --- a/t/dist-obsolete.sh
> +++ b/t/dist-obsolete-opts.sh
> @@ -14,28 +14,31 @@
> # You should have received a copy of the GNU General Public License
> # along with this program. If not, see <http://www.gnu.org/licenses/>.
>
> -# Obsolete archive formats.
> +# Obsolete 'dist-*' and 'no-dist-gzip' options.
>
> . ./defs || exit 1
>
> $ACLOCAL
>
> -for fmt in lzma shar; do
> +for fmt in gzip bzip2 xz lzip zip tarZ lzma shar; do
> echo AUTOMAKE_OPTIONS = dist-$fmt > Makefile.am
> AUTOMAKE_fails -Wnone -Wno-error
> - grep "^Makefile\\.am:1:.*support for $fmt.*removed" stderr
> + grep "^Makefile\\.am:1:.* 'dist-$fmt' option.* no more supported" stderr
> + grep "^Makefile\\.am:1:.* use AM_DIST_FORMATS .*instead" stderr
> done
>
> rm -rf autom4te*.cache
>
> cat > configure.ac << 'END'
> -AC_INIT([lzma], [1.0])
> -AM_INIT_AUTOMAKE([dist-tarZ])
> +AC_INIT([foo], [1.0])
> +AM_INIT_AUTOMAKE([no-dist-gzip dist-xz])
> AC_CONFIG_FILES([Makefile])
> END
> : > Makefile.am
> $ACLOCAL
> AUTOMAKE_fails -Wnone -Wno-error
> -grep "^configure\\.ac:2:.*legacy 'compress' program.* no more supported"
> stderr
> +grep "^configure\\.ac:2:.* 'no-dist-gzip' option.* no more supported" stderr
> +grep "^configure\\.ac:2:.* 'dist-xz' option.* no more supported" stderr
> +grep "^configure\\.ac:2:.*use AM_DIST_FORMATS .*instead" stderr
>
> :
> diff --git a/t/repeated-options.sh b/t/repeated-options.sh
> index 69a9cb4..489c313 100755
> --- a/t/repeated-options.sh
> +++ b/t/repeated-options.sh
> @@ -17,21 +17,31 @@
> # Check that automake does not complain on repeated options, nor
> # generate broken or incorrect makefiles.
>
> -required=bzip2
> . ./defs || exit 1
>
> cat >configure.ac <<END
> AC_INIT([$me], [1.0])
> -AM_INIT_AUTOMAKE([foreign foreign dist-bzip2 no-dist-gzip dist-bzip2])
> +AM_INIT_AUTOMAKE([foreign foreign no-installman serial-tests \
> + no-installman])
> AC_CONFIG_FILES([Makefile])
> AC_OUTPUT
> END
>
> cat > Makefile.am <<'END'
> -AUTOMAKE_OPTIONS = no-dist-gzip no-dist-gzip dist-bzip2
> -AUTOMAKE_OPTIONS += dist-bzip2 foreign
> +AUTOMAKE_OPTIONS = no-installman no-installman serial-tests
> +AUTOMAKE_OPTIONS += serial-tests foreign
> +TESTS = foo
> +EXTRA_DIST = foo
> +CLEANFILES = bar.out
> END
>
> +cat > foo <<'END'
> +#!/bin/sh
> +echo RUN RUN
> +: > bar.out
> +END
> +chmod a+x foo
> +
> $ACLOCAL
> $AUTOCONF
> $AUTOMAKE --foreign --foreign -Wall 2>stderr && test ! -s stderr \
> @@ -39,9 +49,10 @@ $AUTOMAKE --foreign --foreign -Wall 2>stderr && test ! -s
> stderr \
>
> ./configure
>
> -$MAKE
> +$MAKE check
> +test -f bar.out
> +test ! -e foo.log
> +test ! -e test-suite.log
> $MAKE distcheck
> -test -f $me-1.0.tar.bz2
> -test ! -e $me-1.0.tar.gz
>
> :
>
- [Automake-NG] [PATCH 3/7] [ng] distcheck: remove stale tarballs with 'rm -f', not 'rm -rf', (continued)
- [Automake-NG] [PATCH 3/7] [ng] distcheck: remove stale tarballs with 'rm -f', not 'rm -rf', Stefano Lattarini, 2012/08/12
- [Automake-NG] [PATCH 5/7] [ng] diag: new make function $(am.fatal), Stefano Lattarini, 2012/08/12
- [Automake-NG] [PATCH 4/7] [ng] dist: fixup: add 'dist' and 'dist-all' to AM_RECURSIVE_TARGETS, Stefano Lattarini, 2012/08/12
- [Automake-NG] [PATCH 7/7] [ng] rename: am.dist.uninstallcheck-listfiles -> am.dist.uninstallcheck-listfiles, Stefano Lattarini, 2012/08/12
- [Automake-NG] [PATCH 6/7] [ng] dist: new API to specify formats of distribution tarballs, Stefano Lattarini, 2012/08/12
- Re: [Automake-NG] [PATCH 6/7] [ng] dist: new API to specify formats of distribution tarballs,
Paolo Bonzini <=
Re: [Automake-NG] [PATCH 0/7] More patches on distribution tarballs support, Stefano Lattarini, 2012/08/14