Subject: Re: bug#9822: AMTAR not used

From: Stefano Lattarini <[email-masked]>
Date: Tue, 03 Jan 2012 16:48:12 +0100

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: <52fef8d18[email-masked]>
From: Stefano Lattarini <[email-masked]>
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 <[email-masked]>, 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