bug#19614: [PATCH] dist: fix automake bug #19614
Kamila Szewczyk <[email protected]>
| Newsgroups | gmane.comp.sysutils.automake.bugs,gmane.comp.sysutils.automake.patches |
|---|---|
| Message-ID | <[email protected]> |
`make dist' now fails when tar fails, instead of exiting successfully with a truncated archive. The uncompressed tarball is built by a rule of its own, $(distdir).tar, rather than piped into the compressors, whose exit status was the only one the shell reported. As a side effect, tar is run only once, whatever the number of enabled formats; on the other hand, `make dist' now needs room for the uncompressed tarball. Since some tar implementations merely warn about the files they fail to archive and still exit successfully, anything tar writes to standard error is treated as a failure too (unless AM_DIST_TAR_IGNORE_STDERR is set to `yes'). (bug#19614) --- NEWS | 3 ++ doc/automake.texi | 23 ++++++++++ lib/am/distdir.am | 64 +++++++++++++++++++------- m4/optional.m4 | 11 +++-- m4/tar.m4 | 11 +++++ t/dist-formats.tap | 7 ++- t/dist-shar.sh | 19 ++++++++ t/dist-tar-fails.sh | 108 ++++++++++++++++++++++++++++++++++++++++++++ t/list-of-tests.mk | 1 + 9 files changed, 224 insertions(+), 23 deletions(-) create mode 100644 t/dist-tar-fails.sh -- With Valediction, Kamila Szewczyk (https://iczelia.net)
0001-dist-fix-automake-bug-19614.patch
(text/x-patch, 16 KB)
From d5fc3ae245c81140825ecdd5ad2c82f335d07452 Mon Sep 17 00:00:00 2001 From: Kamila Szewczyk <[email protected]> Date: Wed, 5 Aug 2026 19:59:37 +0200 Subject: [PATCH] dist: fix automake bug #19614 `make dist' now fails when tar fails, instead of exiting successfully with a truncated archive. The uncompressed tarball is built by a rule of its own, $(distdir).tar, rather than piped into the compressors, whose exit status was the only one the shell reported. As a side effect, tar is run only once, whatever the number of enabled formats; on the other hand, `make dist' now needs room for the uncompressed tarball. Since some tar implementations merely warn about the files they fail to archive and still exit successfully, anything tar writes to standard error is treated as a failure too (unless AM_DIST_TAR_IGNORE_STDERR is set to `yes'). (bug#19614) --- NEWS | 3 ++ doc/automake.texi | 23 ++++++++++ lib/am/distdir.am | 64 +++++++++++++++++++------- m4/optional.m4 | 11 +++-- m4/tar.m4 | 11 +++++ t/dist-formats.tap | 7 ++- t/dist-shar.sh | 19 ++++++++ t/dist-tar-fails.sh | 108 ++++++++++++++++++++++++++++++++++++++++++++ t/list-of-tests.mk | 1 + 9 files changed, 224 insertions(+), 23 deletions(-) create mode 100644 t/dist-tar-fails.sh diff --git a/NEWS b/NEWS index b798fbbd2..372ea46f3 100644 --- a/NEWS +++ b/NEWS @@ -18,6 +18,9 @@ New in 1.18.2 (????-??-??): - Busybox tar no longer assumed to be GNU tar just because it supports --version. + - `make dist' now fails when tar fails, instead of exiting + successfully with a truncated archive. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ New in 1.18.1 (2025-06-25): diff --git a/doc/automake.texi b/doc/automake.texi index f2bf092b3..c9a72ca66 100644 --- a/doc/automake.texi +++ b/doc/automake.texi @@ -9585,6 +9585,29 @@ will create archives in all the enabled formats (@pxref{List of Automake options} for how to change this list). By default, only the @code{dist-gzip} target is enabled by @code{dist}. +@cindex Distribution archive, failures of @command{tar} +All the tar-based formats above compress one and the same +@file{@var{package}-@var{version}.tar} file; it is created once, no +matter how many formats are requested, and removed again as soon as the +archives have been built. Beware that this needs room for the +uncompressed tarball, in addition to the @file{@var{package}-@var{version}} +directory. Automake used to pipe @command{tar} directly into the +compressors instead, but then a failure of @command{tar} went unnoticed, +since the exit status of a shell pipeline is the one of its last +command; @samp{make dist} would exit successfully after creating a +truncated archive. + +@vindex AM_DIST_TAR_IGNORE_STDERR +Some @command{tar} implementations do not fail when they cannot archive +a file, for instance because its name is too long for the selected +format: they merely print a diagnostic, and still exit successfully. +For this reason, anything @command{tar} writes to its standard error +also makes @samp{make dist} fail. If your @command{tar} is known to +write harmless messages there, set @code{AM_DIST_TAR_IGNORE_STDERR} to +@samp{yes}, either in @file{Makefile.am} or on the @command{make} +command line; its messages are then still printed, but no longer +considered errors. + @node Tests @chapter Support for test suites diff --git a/lib/am/distdir.am b/lib/am/distdir.am index 7b286cef6..e83fbe987 100644 --- a/lib/am/distdir.am +++ b/lib/am/distdir.am @@ -33,7 +33,9 @@ am__remove_distdir = \ ## See automake bug#10470. || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi -am__post_remove_distdir = $(am__remove_distdir) +am__post_remove_distdir = \ + rm -f $(distdir).tar; \ + $(am__remove_distdir) endif %?TOPDIR_P% if %?SUBDIRS% @@ -330,51 +332,78 @@ endif %?TOPDIR_P% if %?TOPDIR_P% +## Do not pipe tar into the compressor: the exit status of a shell +## pipeline is that of its last command only, so a failure of tar would +## go unnoticed, and "make dist" would exit successfully after creating +## a truncated archive. There is no portable equivalent of the +## 'pipefail' shell option, so build the uncompressed tarball in a rule +## of its own, and let each dist-* target compress it. This also means +## running tar just once, no matter how many formats are requested. +## See automake bug#19614. +## +## Some tar implementations do not fail when they cannot archive a file +## (say, because its name is too long for the selected format): they +## only print a diagnostic and exit successfully. So treat any output +## on tar's standard error as a failure, too. Archivers that write to +## standard error even when all went well (cpio reports the number of +## blocks written) are exempted by configure. + +# Exists only to be overridden by the user if desired. +AM_DIST_TAR_IGNORE_STDERR = $(am__tar_ignore_stderr) + +$(distdir).tar: distdir + am__tar_msg=`tardir=$(distdir) && $(am__tar) 2>&1 >$(distdir).tar`; \ + am__tar_rc=$$?; \ + test -z "$$am__tar_msg" || { printf '%s\n' "$$am__tar_msg" >&2; \ + test x"$(AM_DIST_TAR_IGNORE_STDERR)" = xyes || am__tar_rc=1; }; \ + test $$am__tar_rc -eq 0 || { rm -f $(distdir).tar; \ + echo "$(distdir).tar: cannot create the distribution archive" >&2; exit 1; } + ?GZIP?DIST_ARCHIVES += $(distdir).tar.gz GZIP_ENV = -9 .PHONY: dist-gzip -dist-gzip: distdir - tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz +dist-gzip: $(distdir).tar + eval GZIP= gzip $(GZIP_ENV) -c <$(distdir).tar >$(distdir).tar.gz $(am__post_remove_distdir) ?BZIP2?DIST_ARCHIVES += $(distdir).tar.bz2 .PHONY: dist-bzip2 -dist-bzip2: distdir - tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 +dist-bzip2: $(distdir).tar + BZIP2=$${BZIP2--9} bzip2 -c <$(distdir).tar >$(distdir).tar.bz2 $(am__post_remove_distdir) ?BZIP3?DIST_ARCHIVES += $(distdir).tar.bz3 .PHONY: dist-bzip3 ## bzip3 does not read any envvars. -dist-bzip3: distdir - tardir=$(distdir) && $(am__tar) | bzip3 -c >$(distdir).tar.bz3 +dist-bzip3: $(distdir).tar + bzip3 -c <$(distdir).tar >$(distdir).tar.bz3 $(am__post_remove_distdir) ?LZIP?DIST_ARCHIVES += $(distdir).tar.lz .PHONY: dist-lzip -dist-lzip: distdir - tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz +dist-lzip: $(distdir).tar + lzip -c $${LZIP_OPT--9} <$(distdir).tar >$(distdir).tar.lz $(am__post_remove_distdir) ?XZ?DIST_ARCHIVES += $(distdir).tar.xz .PHONY: dist-xz -dist-xz: distdir - tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz +dist-xz: $(distdir).tar + XZ_OPT=$${XZ_OPT--e} xz -c <$(distdir).tar >$(distdir).tar.xz $(am__post_remove_distdir) ?ZSTD?DIST_ARCHIVES += $(distdir).tar.zst .PHONY: dist-zstd -dist-zstd: distdir - tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst +dist-zstd: $(distdir).tar + zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} <$(distdir).tar >$(distdir).tar.zst $(am__post_remove_distdir) ?COMPRESS?DIST_ARCHIVES += $(distdir).tar.Z .PHONY: dist-tarZ -dist-tarZ: distdir +dist-tarZ: $(distdir).tar @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 - tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + compress -c <$(distdir).tar >$(distdir).tar.Z $(am__post_remove_distdir) ?SHAR?DIST_ARCHIVES += $(distdir).shar.gz @@ -383,7 +412,10 @@ dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 - shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz +## shar is expected to be chatty on its standard error, so only its exit +## status is checked here. + shar $(distdir) >$(distdir).shar || { rm -f $(distdir).shar; exit 1; } + eval GZIP= gzip $(GZIP_ENV) -f $(distdir).shar $(am__post_remove_distdir) ?ZIP?DIST_ARCHIVES += $(distdir).zip diff --git a/m4/optional.m4 b/m4/optional.m4 index 9d0e96bb4..314b9f5da 100644 --- a/m4/optional.m4 +++ b/m4/optional.m4 @@ -15,7 +15,7 @@ # dist' builds each archive when its tool is present and skips it # otherwise, without failing. Unknown OPTION warns at autoreconf; a # tool absent at configure appends no rule; a tool lost afterwards -# fails the pipeline, which the recipe catches. See bug#81040. +# fails, which the recipe catches. See bug#81040. AC_DEFUN([AM_OPTIONAL_AUTOMAKE], [m4_foreach_w([_am_opt_o], [$1], [_AM_OPTIONAL_AUTOMAKE_ONE(_m4_defn([_am_opt_o]))])dnl @@ -80,13 +80,14 @@ fi # _AM_OPTIONAL_TAR(TOOL, VAR-TAG, EXT, FLAGS) # ------------------------------------------- -# Single-tool tar pipe; TOOL is last, so its failure is what's caught. +# Compress the tarball built by the $(distdir).tar rule, which the +# built-in dist-* targets share and which reports the failures of tar +# itself (see automake bug#19614); only TOOL failing is tolerated here. AC_DEFUN([_AM_OPTIONAL_TAR], [_AM_OPTIONAL_RULE([$1], [$2], -[am--optional-dist-$1: distdir +[am--optional-dist-$1: $(distdir).tar @if test -n "$(am__optional_$2)"; then \ - { tardir=$(distdir) \ - && $(am__tar) | "$(am__optional_$2)" $4 > $(distdir).tar.$3; } \ + "$(am__optional_$2)" $4 < $(distdir).tar > $(distdir).tar.$3 \ || { rm -f $(distdir).tar.$3; \ echo "am-optional: dist-$1 failed; archive not built" >&2; }; \ else \ diff --git a/m4/tar.m4 b/m4/tar.m4 index fa6d12a93..154025f6f 100644 --- a/m4/tar.m4 +++ b/m4/tar.m4 @@ -25,6 +25,14 @@ AC_DEFUN([_AM_PROG_TAR], # in the wild, let's not break things. AC_SUBST([AMTAR], ['$${TAR-tar}']) +# The rules that build the distribution archives consider anything the +# command in $(am__tar) writes to its standard error to be an error, +# since some tar implementations merely warn about the files they fail +# to archive, and still exit successfully (see automake bug#19614). +# Set this to "yes" for the archivers that are chatty even when they +# succeed; cpio, for one, always reports the number of blocks written. +am__tar_ignore_stderr=no + # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' @@ -76,6 +84,7 @@ m4_if([$1], [v7], _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do + am__tar_ignore_stderr=no case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do @@ -102,6 +111,7 @@ m4_if([$1], [v7], am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' + am__tar_ignore_stderr=yes ;; none) am__tar=false @@ -133,4 +143,5 @@ m4_if([$1], [v7], AC_SUBST([am__tar]) AC_SUBST([am__untar]) +AC_SUBST([am__tar_ignore_stderr]) ]) # _AM_PROG_TAR diff --git a/t/dist-formats.tap b/t/dist-formats.tap index 84e795626..b76e12470 100644 --- a/t/dist-formats.tap +++ b/t/dist-formats.tap @@ -429,10 +429,13 @@ fi mkdir bin cd bin +# Keep the standard error of this stub clean: 'make dist' considers +# anything the archiver writes there to be an error (bug#19614). cat > check-distdir <<END #!/bin/sh -{ ls -l '$tarname' && diff Makefile.am '$tarname'/Makefile.am; } >&2 \ - || { echo "== distdir fail =="; exit 1; } +{ ls -l '$tarname' && diff Makefile.am '$tarname'/Makefile.am; } \ + > check-distdir.log 2>&1 \ + || { cat check-distdir.log >&2; echo "== distdir fail =="; exit 1; } END cat > grep-distdir-error <<'END' #!/bin/sh diff --git a/t/dist-shar.sh b/t/dist-shar.sh index f6f83a7b7..f2584caf4 100644 --- a/t/dist-shar.sh +++ b/t/dist-shar.sh @@ -44,4 +44,23 @@ $AUTOCONF $MAKE distcheck test -f $distdir.shar.gz +# A failure of shar must not go unnoticed just because its output used +# to be fed to gzip, which happily succeeded. See automake bug#19614. + +mkdir bin +echo '#!/bin/sh' > bin/shar +echo 'echo "fake shar: cannot do that" >&2; exit 1' >> bin/shar +chmod a+x bin/shar + +rm -f $distdir.shar.gz +saved_PATH=$PATH +PATH=$(pwd)/bin$PATH_SEPARATOR$PATH; export PATH +$MAKE dist-shar > output 2>&1 && { cat output; exit 1; } +PATH=$saved_PATH; export PATH + +cat output +grep 'cannot do that' output +test ! -e $distdir.shar +test ! -e $distdir.shar.gz + : diff --git a/t/dist-tar-fails.sh b/t/dist-tar-fails.sh new file mode 100644 index 000000000..31fbafb56 --- /dev/null +++ b/t/dist-tar-fails.sh @@ -0,0 +1,108 @@ +#! /bin/sh +# Copyright (C) 2026 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/>. + +# 'make dist' must fail when the archiver fails, even though its output +# used to be fed to a compressor that exits successfully. Also check +# that the archiver is run only once, whatever the number of requested +# formats. See automake bug#19614. + +. test-init.sh + +cat > configure.ac << END +AC_INIT([$me], [1.0]) +AM_INIT_AUTOMAKE([dist-xz dist-bzip2]) +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT +END +: > Makefile.am + +# Stub compressors, so that this test does not depend on 'xz' and +# 'bzip2' being installed ('gzip' is assumed to be available on every +# reasonable portability target). They just copy their input, which is +# all the checks below care about. +mkdir bin +for c in xz bzip2; do + echo '#!/bin/sh' > bin/$c + echo 'exec cat' >> bin/$c + chmod a+x bin/$c +done +PATH=$(pwd)/bin$PATH_SEPARATOR$PATH; export PATH + +# Stub archivers, to be used in place of $(am__tar). Their names +# contain no whitespace, so that overriding am__tar from the 'make' +# command line works with any make implementation. + +cat > tar-fails << 'END' +#!/bin/sh +echo "fake tar: cannot archive that" >&2 +exit 2 +END + +# Some tar implementations merely warn about the files they cannot +# archive, and still exit successfully. +cat > tar-warns << 'END' +#!/bin/sh +echo "fake tar: cannot archive that" >&2 +echo "definitely not a valid tar archive" +END + +cat > tar-counts << 'END' +#!/bin/sh +echo x >> tar-runs +echo "definitely not a valid tar archive" +END + +chmod a+x tar-fails tar-warns tar-counts + +$ACLOCAL +$AUTOCONF +$AUTOMAKE +./configure + +for fake_tar in tar-fails tar-warns; do + $MAKE dist am__tar=./$fake_tar > output 2>&1 && { cat output; exit 1; } + cat output + grep 'cannot archive that' output + grep "$distdir\.tar: cannot create the distribution archive" output + # No archive, and no leftovers, must have been created. + test ! -e $distdir.tar + test ! -e $distdir.tar.gz + test ! -e $distdir.tar.xz + test ! -e $distdir.tar.bz2 +done + +# Diagnostics from tar can be declared harmless by the user. +$MAKE dist am__tar=./tar-warns AM_DIST_TAR_IGNORE_STDERR=yes > output 2>&1 \ + || { cat output; exit 1; } +cat output +grep 'cannot archive that' output +test ! -e $distdir.tar +test -s $distdir.tar.gz +test -s $distdir.tar.xz +test -s $distdir.tar.bz2 + +rm -f $distdir.tar.* + +# Three formats, but a single run of the archiver. +$MAKE dist am__tar=./tar-counts +cat tar-runs # For debugging. +test "$(cat tar-runs)" = x +test ! -e $distdir.tar +test -s $distdir.tar.gz +test -s $distdir.tar.xz +test -s $distdir.tar.bz2 + +: diff --git a/t/list-of-tests.mk b/t/list-of-tests.mk index 6c522bd8e..cd9b6bc55 100644 --- a/t/list-of-tests.mk +++ b/t/list-of-tests.mk @@ -425,6 +425,7 @@ t/dist-pr109765.sh \ t/dist-readonly.sh \ t/dist-repeated.sh \ t/dist-shar.sh \ +t/dist-tar-fails.sh \ t/dist-tarZ.sh \ t/dist-vs-built-sources.sh \ t/dist-with-unreadable-makefile-fails.sh \ -- 2.53.0
OpenPGP_0xC868F0B6DE38409D.asc
(application/pgp-keys, 17.7 KB)
-----BEGIN PGP PUBLIC KEY BLOCK----- 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 xduOmaKpvtEs =hUfZ -----END PGP PUBLIC KEY BLOCK-----
OpenPGP_signature.asc
(application/pgp-signature, 236 B)
-----BEGIN PGP SIGNATURE----- wnsEABYIACMWIQTV1Sfn4zimgsutscEhf89zFGNsBwUCanN7RAUDAAAAAAAKCRAhf89zFGNsB/88 AQCBT+GccBr0v0M0hNtkfOWzUS24mr46Ycl05YYBrUqsJgEAoqQnA6PvzEHqwDZVfxnriUxuu2QC zJOwqHppKtAHVAg= =gbR6 -----END PGP SIGNATURE-----