2 # Copyright (C) 2012-2013 Free Software Foundation, Inc.
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 2, or (at your option)
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 # Check support for different compression formats used by distribution
20 am_create_testdir=empty
25 # ---------------------------------------------------- #
26 # Common and/or auxiliary subroutines and variables. #
27 # ---------------------------------------------------- #
29 ocwd=$(pwd) || fatal_ "getting current working directory"
33 # Create common aclocal.m4 file, for later tests.
36 && echo 'AC_INIT([x], [0]) AM_INIT_AUTOMAKE' > configure.ac \
41 || fatal_ "creating common aclocal.m4 file"
43 # Some make implementations (e.g., HP-UX) don't grok '-j', some require
44 # no space between '-j' and the number of jobs (e.g., older GNU make
45 # versions), and some *do* require a space between '-j' and the number
46 # of jobs (e.g., Solaris dmake). We need a runtime test to see what
48 for MAKE_j4 in "$MAKE -j4" "$MAKE -j 4" false; do
49 echo all: | $MAKE_j4 -f - && break
50 : For shells with buggy 'set -e'.
53 # Set variables '$compressor' and '$suffix'.
54 setup_vars_for_compression_format ()
56 suffix=NONE compressor=NONE
58 gzip) suffix=tar.gz compressor=gzip ;;
59 tarZ) suffix=tar.Z compressor=compress ;;
60 lzip) suffix=tar.lz compressor=lzip ;;
61 xz) suffix=tar.xz compressor=xz ;;
62 bzip2) suffix=tar.bz2 compressor=bzip2 ;;
63 zip) suffix=zip compressor=zip ;;
64 shar) suffix=shar.gz compressor=shar ;;
65 *) fatal_ "invalid compression format '$1'";;
71 test $# -eq 1 || fatal_ "have_compressor(): bad usage"
73 # Assume gzip(1) is available on every reasonable portability target.
76 # On Cygwin, as of 9/2/2012, 'compress' is provided by sharutils
77 # and is just a dummy script that is not able to actually compress
78 # (it can only decompress). So, check that the 'compress' program
79 # is actually able to compress input.
80 # Note that, at least on GNU/Linux, 'compress' does (and is
81 # documented to) exit with status 2 if the output is larger than
82 # the input after (attempted) compression; so we need to pass it
83 # an input that it can actually reduce in size when compressing.
85 for x in 1 2 3 4 5 6 7 8; do
86 echo aaaaaaaaaaaaaaaaaaaaa
87 done | compress -c >/dev/null && return 0
92 # Do not use --version, or older versions bzip2 would try to
93 # compress stdin. This would cause binary output in the test
94 # logs, with potential breakage of our testsuite harness.
96 # OpenSolaris zip do not support the '--version' option, but
97 # accepts the '-v' one with a similar meaning (if no further
98 # arguments are given).
100 # Assume the other compressors we care about support the
101 # '--version' option.
104 # Redirect to stderr to avoid polluting the output, in case this
105 # function is used in a command substitution (as it is, below).
106 if $1 $o </dev/null >&2; then
113 fatal_ "have_compressor(): dead code reached"
116 all_compression_formats='gzip tarZ lzip xz bzip2 zip shar'
119 for x in $all_compression_formats; do
120 setup_vars_for_compression_format $x
123 echo All compressors: $all_compressors
125 missing_compressors=$(
126 for c in $all_compressors; do
127 have_compressor $c || echo $c
129 echo Missing compressors: $missing_compressors
131 # Redefine to avoid re-running the already executed checks.
134 case " $missing_compressors " in *\ $1\ *) false;; *) : ;; esac
137 have_all_compressors ()
139 test -z "$missing_compressors"
145 test -n "$name" || fatal_ "start_subtest: no subtest name given"
146 if test $# -gt 0; then
147 eval "$@" || fatal_ "start_subtest: evaluating assignments"
149 ac_opts=$(echo $ac_opts | tr ',' ' ')
150 am_opts=$(echo $am_opts | tr ',' ' ')
153 unindent > configure.ac <<END
154 AC_INIT([$name], [1.0])
155 AM_INIT_AUTOMAKE([$ac_opts])
156 AC_CONFIG_FILES([Makefile])
159 echo "AUTOMAKE_OPTIONS = $am_opts" > Makefile.am
160 # It is imperative that aclocal.m4 is copied after configure.ac has
161 # been created, to avoid a spurious trigger of the automatic remake
162 # rules for configure & co.
163 cp "$ocwd"/aclocal.m4 \
164 "$am_scriptdir"/missing \
165 "$am_scriptdir"/install-sh \
171 unset name; unset ac_opts; unset am_opts;
172 cd "$ocwd" || fatal_ "couldn't chdir back to '$ocwd'"
175 command_ok_if_have_compressor ()
177 if have_compressor "$compressor"; then
180 skip_ -r "'$compressor' not available" "$1"
186 test $# -eq 2 || fatal_ "can_compress: bad number of arguments"
188 setup_vars_for_compression_format "$format"
190 command_ok_ "'dist-$format' target always created" $MAKE -n dist-$format
192 command_ok_if_have_compressor "'make dist-$format' work by default" \
195 && $MAKE dist-$format \
196 && test -f $tarname-1.0.$suffix \
197 && ls -l *$tarname* \
198 && test "$(echo *$tarname*)" = $tarname-1.0.$suffix'
200 unset suffix compressor format tarname
203 # ---------------------------------------- #
204 # Defaults layout of the dist-* targets. #
205 # ---------------------------------------- #
207 start_subtest defaults
209 command_ok_ "default [automake]" $AUTOMAKE
210 command_ok_ "default [autoconf]" $AUTOCONF
211 command_ok_ "default [configure]" ./configure
212 command_ok_ "default [make distcheck]" $MAKE distcheck
214 command_ok_ "'make dist' only builds *.tar.gz by default" \
215 test "$(ls *defaults*)" = defaults-1.0.tar.gz
219 for fmt in $all_compression_formats; do
220 can_compress defaults $fmt
226 # ----------------------------------------------------------- #
227 # Check diagnostic for no-dist-gzip without another dist-*. #
228 # ----------------------------------------------------------- #
232 grep "$1:.*no-dist-gzip" stderr \
233 && grep "$1:.* at least one archive format must be enabled" stderr
236 nogzip_automake_failure ()
238 AUTOMAKE_fails -d "no-dist-gzip ($1) without other formats is an error"
239 command_ok_ "no-dist-gzip ($1) without other formats gives diagnostic" \
243 start_subtest am-nogz-only am_opts=no-dist-gzip ac_opts=
244 nogzip_automake_failure 'am' 'Makefile\.am:1'
247 start_subtest ac-nogz-only am_opts= ac_opts=no-dist-gzip
248 nogzip_automake_failure 'ac' 'configure\.ac:2'
251 # ------------------------------------------------- #
252 # Check use of no-dist-gzip with a dist-* option. #
253 # ------------------------------------------------- #
258 eval "$var=\${$var:+\"\$$var,\"}\$val" || fatal_ "evaluating \${$var}"
264 test $#,$1,$3,$5 = 6,in,and,in \
265 && case $2,$6 in ac,ac|ac,am|am,ac|am,am) :;; *) false;; esac \
266 || fatal_ "nogzip: invalid usage"
267 format=$4 where_dist_nogzip=$2 where_dist_format=$6
271 append_to_opt $where_dist_format dist-$format
272 append_to_opt $where_dist_nogzip no-dist-gzip
273 setup_vars_for_compression_format "$format"
274 # Do these before the am_opts and ac_opts variable can be munged
275 # by 'start_subtest'.
277 test -n "$am_opts" && desc=${desc:+"$desc "}"am=$am_opts"
278 test -n "$ac_opts" && desc=${desc:+"$desc "}"ac=$ac_opts"
280 start_subtest nogzip-$format am_opts=$am_opts ac_opts=$ac_opts
282 unindent >> Makefile.am <<END
284 test \$(DIST_ARCHIVES) = \$(distdir).$suffix
286 test -f \$(distdir).$suffix
288 test ! -f \$(distdir).tar.gz
291 command_ok_ "$desc [automake]" $AUTOMAKE
292 command_ok_ "$desc [autoconf]" $AUTOCONF
293 command_ok_ "$desc [configure]" ./configure
294 command_ok_ "$desc [ark-name]" $MAKE check-ark-name
295 command_ok_if_have_compressor "$desc [distcheck]" $MAKE distcheck
296 command_ok_if_have_compressor "$desc [ark-exists]" $MAKE check-ark-exists
297 command_ok_ "$desc [no .tar.gz]" $MAKE check-no-tar-gz
305 nogzip in am and bzip2 in am
306 nogzip in ac and xz in am
307 nogzip in am and lzip in ac
308 nogzip in ac and tarZ in ac
311 # ----------------------------------------------------------- #
312 # The 'dist-gzip' target is created also with no-dist-gzip. #
313 # ----------------------------------------------------------- #
315 start_subtest dist-gzip-persistence am_opts=no-dist-gzip,dist-xz
316 command_ok_ "dist-gzip persistence [automake]" $AUTOMAKE
317 command_ok_ "dist-gzip persistence [autoconf]" $AUTOCONF
318 command_ok_ "dist-gzip persistence [configure]" ./configure
319 can_compress dist-gzip-persistence gzip
323 # ----------------------- #
324 # Parallel compression. #
325 # ----------------------- #
327 # We only use formats requiring 'gzip', 'bzip2' and 'compress' programs,
328 # since there are the most likely to be all found on the great majority
331 start_subtest parallel-compression ac_opts=dist-bzip2 am_opts=dist-tarZ
334 tarname=parallel-compression-1.0
339 setup_vars_for_compression_format $format
341 tarball=$tarname.$suffix \
342 && test -f $tarball \
343 && mkdir check-$format \
344 && cp $tarball check-$format \
345 && cd check-$format \
346 && $compressor -d $tarball \
347 && tar xvf $tarname.tar \
348 && diff ../Makefile.in $tarname/Makefile.in \
350 && rm -rf check-$format
354 command_ok_ "$desc [automake]" $AUTOMAKE
357 have_compressor compress || skip_reason="'compress' not available"
358 have_compressor bzip2 || skip_reason="'bzip2' not available"
359 if test "$MAKE_j4" = false; then
360 test -z "$skip_reason" || skip_reason="$skip_reason and "
361 skip_reason="${skip_reason}make concurrency unavailable"
364 if test -n "$skip_reason"; then
365 skip_row_ 6 -r "$skip_reason" "$desc"
367 command_ok_ "$desc [autoconf]" $AUTOCONF
368 command_ok_ "$desc [configure]" ./configure
369 command_ok_ "$desc [make -j4 dist-all]" $MAKE_j4 dist
370 ls -l # For debugging.
371 command_ok_ "$desc [check .tar.gz tarball]" check_tarball gzip
372 command_ok_ "$desc [check .tar.bz2 tarball]" check_tarball bzip2
373 command_ok_ "$desc [check .tar.Z tarball]" check_tarball tarZ
376 unset tarname desc skip_reason
381 # --------------------------------------------------------- #
382 # The various 'dist-*' targets can happily work together. #
383 # --------------------------------------------------------- #
385 start_subtest all-together
387 desc='all compressors together'
388 tarname=all-together-1.0
390 echo 'AM_INIT_AUTOMAKE([' > am-init.m4
391 echo 'AUTOMAKE_OPTIONS =' > Makefile.am
393 # Add half 'dist-*' options to AM_INIT_AUTOMAKE, half to AUTOMAKE_OPTIONS.
395 for fmt in $all_compression_formats; do
396 test $fmt = gzip && continue
398 echo " dist-$fmt" >> am-init.m4
401 echo "AUTOMAKE_OPTIONS += dist-$fmt" >> Makefile.am
407 echo '])' >> am-init.m4
409 sed 's/AM_INIT_AUTOMAKE.*/m4_include([am-init.m4])/' configure.ac > t
417 command_ok_ "$desc [aclocal]" $ACLOCAL --force
418 command_ok_ "$desc [automake]" $AUTOMAKE
419 command_ok_ "$desc [autoconf]" $AUTOCONF
420 command_ok_ "$desc [configure]" ./configure
422 if have_all_compressors; then
423 command_ok_ "$desc [make distcheck, real]" $MAKE distcheck
425 skip_ -r "not all compressors available" "$desc [make distcheck, real]"
428 # We fake existence of all the compressors here, so that we don't have
429 # to require any of them to run the further tests. This is especially
430 # important since it's very unlikely that a non-developer has all the
431 # compression tools installed on his machine at the same time.
435 cat > check-distdir <<END
437 { ls -l '$tarname' && diff Makefile.am '$tarname'/Makefile.am; } >&2 \
438 || { echo "== distdir fail =="; exit 1; }
440 cat > grep-distdir-error <<'END'
442 grep 'distdir fail' && exit 1
445 chmod a+x check-distdir grep-distdir-error
446 for prog in tar $all_compressors; do
448 tar|shar|zip) cp check-distdir $prog;;
449 *) cp grep-distdir-error $prog;;
453 ls -l # For debugging.
457 PATH=$(pwd)/bin$PATH_SEPARATOR$PATH; export PATH
460 "$desc ['make dist-all', stubbed]" \
463 subdesc="$desc ['make dist -j4', stubbed]"
464 if test "$MAKE_j4" = false; then
465 skip_ -r "make concurrency unavailable" "$subdesc"
467 command_ok_ "$subdesc" $MAKE_j4 dist
471 PATH=$oPATH; export PATH