Reference: <http://debbugs.gnu.org/cgi/bugreport.cgi?bug=9822>
So here is a proposed patch (for maint). I will push in 72 hours if there is no objection. Regards, Stefano
>From 52fef8d18acb3b71752dc683f1330bc3ad2dd9b3 Mon Sep 17 00:00:00 2001 Message-Id: <52fef8d18acb3b71752dc683f1330bc3ad2dd9b3.1325605508.git.stefano.lattar...@gmail.com> From: Stefano Lattarini <stefano.lattar...@gmail.com> Date: Tue, 3 Jan 2012 16:12:46 +0100 Subject: [PATCH] dist: do not wrap calls to 'tar' with the 'missing' script The `missing' script is meant to allow non-developers to build a package in the face of slightly-skewed timestamps (as might happen e.g. when the package is obtained from a VCS checkout rather than from a distribution tarball). It is *not* the business of the `missing' script to try to provide wrappers for all the maintainer tools (in this case, to tool being a decent tar program). Such wrapping of `tar' was not only inappropriate, but it was also preventing the legitimate overriding (at make runtime) of the `tar' program used in the creation of the distribution tarballs. See also automake bug#9822. * lib/missing: Don't try to specially wrap `tar' invocations anymore. * m4/tar.m4 (_AM_PROG_TAR): In the definitions of the `AMTAR' variable, do not wrap the `tar' invocation with the `missing' script anymore. Instead, allow the user to override the intended tar program at make runtime, by defining the `TAR' environment variable. [$1 == v7]: Similarly for the definitions of the `am__tar' and `am__untar' variables. Since we are at it, don't make them depend anymore on the definition of the obsolescent `AMTAR' variable. * NEWS: Update. * tests/missing-tar.test: Remove, it's obsolete. * tests/tar-override.test: New test. * tests/Makefile.am (TESTS): Update. Reported by Akim Demaille. --- NEWS | 7 ++ lib/missing | 32 +--------- m4/tar.m4 | 9 ++- tests/Makefile.am | 2 +- tests/missing-tar.test | 160 ----------------------------------------------- tests/tar-override.test | 67 ++++++++++++++++++++ 6 files changed, 82 insertions(+), 195 deletions(-) delete mode 100755 tests/missing-tar.test create mode 100755 tests/tar-override.test diff --git a/NEWS b/NEWS index fa1e75e..d4dbf24 100644 --- a/NEWS +++ b/NEWS @@ -32,6 +32,13 @@ New in 1.11.0a: * Miscellaneous changes: + - The `missing' script don't try to wrap calls to `tar' anymore. + + - "make dist" doesn't wrap `tar' invocations with the `missing' script + anymore. Similarly, the obsolescent variable `$(AMTAR)' (which you + shouldn't be using BTW ;-) does not invoke the missing script anymore + 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 diff --git a/lib/missing b/lib/missing index 1039955..6bbe953 100755 --- a/lib/missing +++ b/lib/missing @@ -1,10 +1,10 @@ #! /bin/sh # Common stub for a few missing GNU programs while installing. -scriptversion=2011-12-22.11; # UTC +scriptversion=2012-01-03.15; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, -# 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. # Originally by Fran,cois Pinard <pin...@iro.umontreal.ca>, 1996. # This program is free software; you can redistribute it and/or modify @@ -84,7 +84,6 @@ Supported PROGRAM values: help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file - tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and @@ -122,15 +121,6 @@ case $1 in # Not GNU programs, they don't have --version. ;; - tar*) - if test -n "$run"; then - echo 1>&2 "ERROR: \`tar' requires --run" - exit 1 - elif test "x$2" = "x--version" || test "x$2" = "x--help"; then - exit 1 - fi - ;; - *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. @@ -318,24 +308,6 @@ WARNING: \`$1' is $msg. You should only need it if touch $file ;; - tar*) - shift - # We have already tried tar in the generic part. So try with GNU tar. - # Look for gnutar/gtar before invocation to avoid ugly error messages. - for cmd in gnutar gtar; do - ($cmd --version) > /dev/null 2>&1 || continue - echo 1>&2 "\ -WARNING: I can't seem to be able to run \`tar' with the given arguments. - Trying to use GNU tar (\"$cmd\") instead ..." - exec $cmd "$@" - done - echo 1>&2 "\ -WARNING: I can't seem to be able to run \`tar' with the given arguments. - You may want to install GNU tar or Free paxutils, or check the - command line arguments." - exit 1 - ;; - *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. diff --git a/m4/tar.m4 b/m4/tar.m4 index a4a00ec..0683951 100644 --- a/m4/tar.m4 +++ b/m4/tar.m4 @@ -1,6 +1,6 @@ # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -22,10 +22,11 @@ # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], -[# Always define AMTAR for backward compatibility. -AM_MISSING_PROG([AMTAR], [tar]) +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) m4_if([$1], [v7], - [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) diff --git a/tests/Makefile.am b/tests/Makefile.am index 2f1ac0d..91702fd 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -582,7 +582,6 @@ missing3.test \ missing4.test \ missing5.test \ missing6.test \ -missing-tar.test \ mkinstall.test \ mkinst2.test \ mkinst3.test \ @@ -850,6 +849,7 @@ tagsub.test \ tar.test \ tar2.test \ tar3.test \ +tar-override.test \ target-cflags.test \ targetclash.test \ txinfo.test \ diff --git a/tests/missing-tar.test b/tests/missing-tar.test deleted file mode 100755 index 889ae20..0000000 --- a/tests/missing-tar.test +++ /dev/null @@ -1,160 +0,0 @@ -#! /bin/sh -# Copyright (C) 2011 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 <http://www.gnu.org/licenses/>. - -# Test how the `missing' script wraps the`tar' program . -# FIXME: we should also try to run the `missing' script with the -# $CONFIG_SHELL ... - -. ./defs || Exit 1 - -set -e - -# FIXME: make this working with "installcheck" too ... -cp "$testsrcdir"/../lib/missing . \ - || fatal_ "failed to fetch auxiliary script \`missing'" - -old_PATH=$PATH; export old_PATH -new_PATH=`pwd`/bin$PATH_SEPARATOR$PATH -mkdir bin - -cat > data.txt <<'END' -To be, or not to be: that is the question: -Whether 'tis nobler in the mind to suffer -... -END - -cat > nonesuch <<'END' -#!/bin/sh -exit 127 -END -chmod a+x nonesuch - -# Simple runs. -for nullify_gnu in yes no; do - case $nullify_gnu in - yes) - cp nonesuch bin/gtar - cp nonesuch bin/gnutar - PATH=$new_PATH; export PATH; - mkdir simple-nognu - cd simple-nognu - ;; - no) - mkdir simple-dflt - cd simple-dflt - ;; - *) - Exit 99 # Can't happen. - ;; - esac - cp ../data.txt foobar.txt - ../missing --run tar cvf mu.tar foobar.txt - rm -f foobar.txt - test -f mu.tar - ../missing --run tar tf mu.tar >output 2>&1 || { cat output; Exit 1; } - cat output - $FGREP 'foobar.txt' output - test ! -f foobar.txt - ../missing --run tar xvf mu.tar - diff ../data.txt foobar.txt - PATH=$old_PATH; export PATH; - cd .. -done - -rm -f bin/* - -# Helper scripts and functions for next tests. - -cat > fake-gnu-tar <<'END' -#!/bin/sh -case " $* " in *\ --version\ *) echo fake GNU tar; exit $?;; esac -PATH=$old_PATH; export PATH -exec tar "$@" -END -chmod a+x fake-gnu-tar - -cat > failing-tar <<'END' -#!/bin/sh -echo "Error message from tar passed through" >&2 -exit 1 -END -chmod a+x failing-tar - -grep_tar_failed () -{ - grep "WARNING:.* can't.* run \`tar' with .*given arguments" $* -} - -# The `tar' program does not work with the given options, but we have -# gtar or gnutar. -cp failing-tar bin/tar -for pfx in g gnu; do - case $pfx in g) othpfx=gnu;; gnu) othpfx=g;; *) Exit 99;; esac - cp nonesuch bin/${othpfx}tar - if ${pfx}tar --version | grep GNU; then :; else - cp fake-gnu-tar bin/${pfx}tar - fi - tarball=foo-$pfx.tar - PATH=$new_PATH; export PATH - ./missing --run tar cvf $tarball ./data.txt 2>stderr \ - || { cat stderr >&2; Exit 1; } - cat stderr >&2 - PATH=$old_PATH; export PATH - test -f $tarball - grep_tar_failed stderr - grep "Error message from tar passed through" stderr - grep "[Tt]rying to use GNU tar.*${pfx}tar" stderr - grep "${othpfx}tar" stderr && Exit 1 - : # For shells with broken 'set -e' -done - -rm -f bin/* - -# The `tar' program does not work with the given options, and we don't -# have neither gtar nor gnutar. -cp failing-tar bin/tar -cp nonesuch bin/gtar -cp nonesuch bin/gnutar -PATH=$new_PATH; export PATH -./missing --run tar cvf foo.tar ./data.txt 2>stderr \ - && { cat stderr >&2; Exit 1; } -cat stderr >&2 -PATH=$old_PATH; export PATH -test ! -f foo.tar -grep_tar_failed stderr -grep "Error message from tar passed through" stderr -grep "[iI]nstall GNU tar or Free [pP]axutils" stderr -$EGREP "(g|gnu)tar" stderr && Exit 1 - -rm -f bin/* - -# We try to use an option that causes any `tar' program (GNU or non-GNU) to. -./missing --run tar --bad-unknonw-option cvf foo.tar ./data.txt 2>stderr \ - && { cat stderr >&2; Exit 1; } -cat stderr >&2 -test ! -f foo.tar -grep_tar_failed stderr -grep "bad-unknonw-option" stderr -for p in gtar gnutar; do - if $p --version; then - cnt=1 - else - cnt=0 - fi - test `$EGREP -c "[Tt]rying to use GNU tar.*$p" stderr` -eq $cnt -done - -: diff --git a/tests/tar-override.test b/tests/tar-override.test new file mode 100755 index 0000000..b08c9f8 --- /dev/null +++ b/tests/tar-override.test @@ -0,0 +1,67 @@ +#! /bin/sh +# Copyright (C) 2011 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 <http://www.gnu.org/licenses/>. + +# Check that the user can override the tar program used by "make dist" +# at runtime, by redefining the `TAR' environment variable. +# FIXME: currently this works only when the tar format used is `v7' +# FIXME: (which is the default one). + +. ./defs || Exit 1 + +set -e + +cwd=`pwd` || fatal_ "couldn't get current working directory" + +echo AC_OUTPUT >> configure.in + +cat > am--tar <<'END' +#!/bin/sh +echo $1 > am--tar-has-run +shift +exec tar "$@" +END +chmod a+x am--tar + +cat > Makefile.am <<'END' +check-local: dist + test -f am--tar-has-run +CLEANFILES = am--tar-has-run +END + +$ACLOCAL +$AUTOCONF +$AUTOMAKE +./configure + +$MAKE dist +test -f $me-1.0.tar.gz +ls | grep has-run && Exit 1 + +rm -f *.tar.* *has-run* + +TAR="$cwd/am--tar foo" $MAKE distcheck +test -f $me-1.0.tar.gz +test "`cat am--tar-has-run`" = foo + +rm -f *.tar.* *has-run* + +TAR=; unset TAR +# Creative use of eval to pacify maintainer checks. +eval \$'MAKE dist "TAR=./am--tar mu"' +test -f $me-1.0.tar.gz +test "`cat am--tar-has-run`" = mu + +: -- 1.7.7.3