2 # Copyright (C) 2012 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.
98 # Redirect to stderr to avoid polluting the output, in case this
99 # function is used in a command substitution (as it is, below).
100 if $1 $o </dev/null >&2; then
107 fatal_ "have_compressor(): dead code reached"
110 all_compression_formats='gzip tarZ lzip xz bzip2 zip shar'
113 for x in $all_compression_formats; do
114 setup_vars_for_compression_format $x
117 echo All compressors: $all_compressors
119 missing_compressors=$(
120 for c in $all_compressors; do
121 have_compressor $c || echo $c
123 echo Missing compressors: $missing_compressors
125 # Redefine to avoid re-running the already executed checks.
128 case " $missing_compressors " in *\ $1\ *) false;; *) : ;; esac
131 have_all_compressors ()
133 test -z "$missing_compressors"
139 test -n "$name" || fatal_ "start_subtest: no subtest name given"
140 if test $# -gt 0; then
141 eval "$@" || fatal_ "start_subtest: evaluating assignments"
143 ac_opts=$(echo $ac_opts | tr ',' ' ')
144 am_opts=$(echo $am_opts | tr ',' ' ')
147 unindent > configure.ac <<END
148 AC_INIT([$name], [1.0])
149 AM_INIT_AUTOMAKE([$ac_opts])
150 AC_CONFIG_FILES([Makefile])
153 echo "AUTOMAKE_OPTIONS = $am_opts" > Makefile.am
154 # It is imperative that aclocal.m4 is copied after configure.ac has
155 # been created, to avoid a spurious trigger of the automatic remake
156 # rules for configure & co.
157 cp "$ocwd"/aclocal.m4 \
158 "$am_scriptdir"/missing \
159 "$am_scriptdir"/install-sh \
165 unset name; unset ac_opts; unset am_opts;
166 cd "$ocwd" || fatal_ "couldn't chdir back to '$ocwd'"
169 command_ok_if_have_compressor ()
171 if have_compressor "$compressor"; then
174 skip_ -r "'$compressor' not available" "$1"
180 test $# -eq 2 || fatal_ "can_compress: bad number of arguments"
182 setup_vars_for_compression_format "$format"
184 command_ok_ "'dist-$format' target always created" $MAKE -n dist-$format
186 command_ok_if_have_compressor "'make dist-$format' work by default" \
189 && $MAKE dist-$format \
190 && test -f $tarname-1.0.$suffix \
191 && ls -l *$tarname* \
192 && test "$(echo *$tarname*)" = $tarname-1.0.$suffix'
194 unset suffix compressor format tarname
197 # ---------------------------------------- #
198 # Defaults layout of the dist-* targets. #
199 # ---------------------------------------- #
201 start_subtest defaults
203 command_ok_ "default [automake]" $AUTOMAKE
204 command_ok_ "default [autoconf]" $AUTOCONF
205 command_ok_ "default [configure]" ./configure
206 command_ok_ "default [make distcheck]" $MAKE distcheck
208 command_ok_ "'make dist' only builds *.tar.gz by default" \
209 test "$(ls *defaults*)" = defaults-1.0.tar.gz
213 for fmt in $all_compression_formats; do
214 can_compress defaults $fmt
220 # ----------------------------------------------------------- #
221 # Check diagnostic for no-dist-gzip without another dist-*. #
222 # ----------------------------------------------------------- #
226 grep "$1:.*no-dist-gzip" stderr \
227 && grep "$1:.* at least one archive format must be enabled" stderr
230 nogzip_automake_failure ()
232 AUTOMAKE_fails -d "no-dist-gzip ($1) without other formats is an error"
233 command_ok_ "no-dist-gzip ($1) without other formats gives diagnostic" \
237 start_subtest am-nogz-only am_opts=no-dist-gzip ac_opts=
238 nogzip_automake_failure 'am' 'Makefile\.am:1'
241 start_subtest ac-nogz-only am_opts= ac_opts=no-dist-gzip
242 nogzip_automake_failure 'ac' 'configure\.ac:2'
245 # ------------------------------------------------- #
246 # Check use of no-dist-gzip with a dist-* option. #
247 # ------------------------------------------------- #
252 eval "$var=\${$var:+\"\$$var,\"}\$val" || fatal_ "evaluating \${$var}"
258 test $#,$1,$3,$5 = 6,in,and,in \
259 && case $2,$6 in ac,ac|ac,am|am,ac|am,am) :;; *) false;; esac \
260 || fatal_ "nogzip: invalid usage"
261 format=$4 where_dist_nogzip=$2 where_dist_format=$6
265 append_to_opt $where_dist_format dist-$format
266 append_to_opt $where_dist_nogzip no-dist-gzip
267 setup_vars_for_compression_format "$format"
268 # Do these before the am_opts and ac_opts variable can be munged
269 # by 'start_subtest'.
271 test -n "$am_opts" && desc=${desc:+"$desc "}"am=$am_opts"
272 test -n "$ac_opts" && desc=${desc:+"$desc "}"ac=$ac_opts"
274 start_subtest nogzip-$format am_opts=$am_opts ac_opts=$ac_opts
276 unindent >> Makefile.am <<END
278 test \$(DIST_ARCHIVES) = \$(distdir).$suffix
280 test -f \$(distdir).$suffix
282 test ! -f \$(distdir).tar.gz
285 command_ok_ "$desc [automake]" $AUTOMAKE
286 command_ok_ "$desc [autoconf]" $AUTOCONF
287 command_ok_ "$desc [configure]" ./configure
288 command_ok_ "$desc [ark-name]" $MAKE check-ark-name
289 command_ok_if_have_compressor "$desc [distcheck]" $MAKE distcheck
290 command_ok_if_have_compressor "$desc [ark-exists]" $MAKE check-ark-exists
291 command_ok_ "$desc [no .tar.gz]" $MAKE check-no-tar-gz
299 nogzip in am and bzip2 in am
300 nogzip in ac and xz in am
301 nogzip in am and lzip in ac
302 nogzip in ac and tarZ in ac
305 # ----------------------------------------------------------- #
306 # The 'dist-gzip' target is created also with no-dist-gzip. #
307 # ----------------------------------------------------------- #
309 start_subtest dist-gzip-persistence am_opts=no-dist-gzip,dist-xz
310 command_ok_ "dist-gzip persistence [automake]" $AUTOMAKE
311 command_ok_ "dist-gzip persistence [autoconf]" $AUTOCONF
312 command_ok_ "dist-gzip persistence [configure]" ./configure
313 can_compress dist-gzip-persistence gzip
317 # ----------------------- #
318 # Parallel compression. #
319 # ----------------------- #
321 # We only use formats requiring 'gzip', 'bzip2' and 'compress' programs,
322 # since there are the most likely to be all found on the great majority
325 start_subtest parallel-compression ac_opts=dist-bzip2 am_opts=dist-tarZ
328 tarname=parallel-compression-1.0
333 setup_vars_for_compression_format $format
335 tarball=$tarname.$suffix \
336 && test -f $tarball \
337 && mkdir check-$format \
338 && cp $tarball check-$format \
339 && cd check-$format \
340 && $compressor -d $tarball \
341 && tar xvf $tarname.tar \
342 && diff ../Makefile.in $tarname/Makefile.in \
344 && rm -rf check-$format
348 command_ok_ "$desc [automake]" $AUTOMAKE
351 have_compressor compress || skip_reason="'compress' not available"
352 have_compressor bzip2 || skip_reason="'bzip2' not available"
353 if test "$MAKE_j4" = false; then
354 test -z "$skip_reason" || skip_reason="$skip_reason and "
355 skip_reason="${skip_reason}make concurrency unavailable"
358 if test -n "$skip_reason"; then
359 skip_row_ 6 -r "$skip_reason" "$desc"
361 command_ok_ "$desc [autoconf]" $AUTOCONF
362 command_ok_ "$desc [configure]" ./configure
363 command_ok_ "$desc [make -j4 dist-all]" $MAKE_j4 dist
364 ls -l # For debugging.
365 command_ok_ "$desc [check .tar.gz tarball]" check_tarball gzip
366 command_ok_ "$desc [check .tar.bz2 tarball]" check_tarball bzip2
367 command_ok_ "$desc [check .tar.Z tarball]" check_tarball tarZ
370 unset tarname desc skip_reason
375 # --------------------------------------------------------- #
376 # The various 'dist-*' targets can happily work together. #
377 # --------------------------------------------------------- #
379 start_subtest all-together
381 desc='all compressors together'
382 tarname=all-together-1.0
384 echo 'AM_INIT_AUTOMAKE([' > am-init.m4
385 echo 'AUTOMAKE_OPTIONS =' > Makefile.am
387 # Add half 'dist-*' options to AM_INIT_AUTOMAKE, half to AUTOMAKE_OPTIONS.
389 for fmt in $all_compression_formats; do
390 test $fmt = gzip && continue
392 echo " dist-$fmt" >> am-init.m4
395 echo "AUTOMAKE_OPTIONS += dist-$fmt" >> Makefile.am
401 echo '])' >> am-init.m4
403 sed 's/AM_INIT_AUTOMAKE.*/m4_include([am-init.m4])/' configure.ac > t
411 command_ok_ "$desc [aclocal]" $ACLOCAL --force
412 command_ok_ "$desc [automake]" $AUTOMAKE
413 command_ok_ "$desc [autoconf]" $AUTOCONF
414 command_ok_ "$desc [configure]" ./configure
416 if have_all_compressors; then
417 command_ok_ "$desc [make distcheck, real]" $MAKE distcheck
419 skip_ -r "not all compressors available" "$desc [make distcheck, real]"
422 # We fake existence of all the compressors here, so that we don't have
423 # to require any of them to run the further tests. This is especially
424 # important since it's very unlikely that a non-developer has all the
425 # compression tools installed on his machine at the same time.
429 cat > check-distdir <<END
431 { ls -l '$tarname' && diff Makefile.am '$tarname'/Makefile.am; } >&2 \
432 || { echo "== distdir fail =="; exit 1; }
434 cat > grep-distdir-error <<'END'
436 grep 'distdir fail' && exit 1
439 chmod a+x check-distdir grep-distdir-error
440 for prog in tar $all_compressors; do
442 tar|shar|zip) cp check-distdir $prog;;
443 *) cp grep-distdir-error $prog;;
447 ls -l # For debugging.
451 PATH=$(pwd)/bin$PATH_SEPARATOR$PATH; export PATH
454 "$desc ['make dist-all', stubbed]" \
457 subdesc="$desc ['make dist -j4', stubbed]"
458 if test "$MAKE_j4" = false; then
459 skip_ -r "make concurrency unavailable" "$subdesc"
461 command_ok_ "$subdesc" $MAKE_j4 dist
465 PATH=$oPATH; export PATH