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 lzip) suffix=tar.lz compressor=lzip ;;
60 xz) suffix=tar.xz compressor=xz ;;
61 bzip2) suffix=tar.bz2 compressor=bzip2 ;;
62 zip) suffix=zip compressor=zip ;;
63 *) fatal_ "invalid compression format '$1'";;
69 test $# -eq 1 || fatal_ "have_compressor(): bad usage"
71 # Assume gzip(1) is available on every reasonable portability target.
76 # Do not use --version, or older versions bzip2 would try to
77 # compress stdin. This would cause binary output in the test
78 # logs, with potential breakage of our testsuite harness.
80 # OpenSolaris zip do not support the '--version' option, but
81 # accepts the '-v' one with a similar meaning (if no further
82 # arguments are given).
84 # Assume the other compressors we care about support the
88 # Redirect to stderr to avoid polluting the output, in case this
89 # function is used in a command substitution (as it is, below).
90 if $1 $o </dev/null >&2; then
97 fatal_ "have_compressor(): dead code reached"
100 all_compression_formats='gzip lzip xz bzip2 zip'
103 for x in $all_compression_formats; do
104 setup_vars_for_compression_format $x
107 echo All compressors: $all_compressors
109 missing_compressors=$(
110 for c in $all_compressors; do
111 have_compressor $c || echo $c
113 echo Missing compressors: $missing_compressors
115 # Redefine to avoid re-running the already executed checks.
118 case " $missing_compressors " in *\ $1\ *) false;; *) : ;; esac
121 have_all_compressors ()
123 test -z "$missing_compressors"
129 test -n "$name" || fatal_ "start_subtest: no subtest name given"
130 if test $# -gt 0; then
131 eval "$@" || fatal_ "start_subtest: evaluating assignments"
133 ac_opts=$(echo $ac_opts | tr ',' ' ')
134 am_opts=$(echo $am_opts | tr ',' ' ')
137 unindent > configure.ac <<END
138 AC_INIT([$name], [1.0])
139 AM_INIT_AUTOMAKE([$ac_opts])
140 AC_CONFIG_FILES([Makefile])
143 echo "AUTOMAKE_OPTIONS = $am_opts" > Makefile.am
144 # It is imperative that aclocal.m4 is copied after configure.ac has
145 # been created, to avoid a spurious trigger of the automatic remake
146 # rules for configure & co.
147 cp "$ocwd"/aclocal.m4 \
148 "$am_scriptdir"/missing \
149 "$am_scriptdir"/install-sh \
155 unset name; unset ac_opts; unset am_opts;
156 cd "$ocwd" || fatal_ "couldn't chdir back to '$ocwd'"
159 command_ok_if_have_compressor ()
161 if have_compressor "$compressor"; then
164 skip_ -r "'$compressor' not available" "$1"
170 test $# -eq 2 || fatal_ "can_compress: bad number of arguments"
172 setup_vars_for_compression_format "$format"
174 command_ok_ "'dist-$format' target always created" $MAKE -n dist-$format
176 command_ok_if_have_compressor "'make dist-$format' work by default" \
179 && $MAKE dist-$format \
180 && test -f $tarname-1.0.$suffix \
181 && ls -l *$tarname* \
182 && test "$(echo *$tarname*)" = $tarname-1.0.$suffix'
184 unset suffix compressor format tarname
187 # ---------------------------------------- #
188 # Defaults layout of the dist-* targets. #
189 # ---------------------------------------- #
191 start_subtest defaults
193 command_ok_ "default [automake]" $AUTOMAKE
194 command_ok_ "default [autoconf]" $AUTOCONF
195 command_ok_ "default [configure]" ./configure
196 command_ok_ "default [make distcheck]" $MAKE distcheck
198 command_ok_ "'make dist' only builds *.tar.gz by default" \
199 test "$(ls *defaults*)" = defaults-1.0.tar.gz
203 for fmt in $all_compression_formats; do
204 can_compress defaults $fmt
210 # ----------------------------------------------------------- #
211 # Check diagnostic for no-dist-gzip without another dist-*. #
212 # ----------------------------------------------------------- #
216 grep "$1:.*no-dist-gzip" stderr \
217 && grep "$1:.* at least one archive format must be enabled" stderr
220 nogzip_automake_failure ()
222 AUTOMAKE_fails -d "no-dist-gzip ($1) without other formats is an error"
223 command_ok_ "no-dist-gzip ($1) without other formats gives diagnostic" \
227 start_subtest am-nogz-only am_opts=no-dist-gzip ac_opts=
228 nogzip_automake_failure 'am' 'Makefile\.am:1'
231 start_subtest ac-nogz-only am_opts= ac_opts=no-dist-gzip
232 nogzip_automake_failure 'ac' 'configure\.ac:2'
235 # ------------------------------------------------- #
236 # Check use of no-dist-gzip with a dist-* option. #
237 # ------------------------------------------------- #
242 eval "$var=\${$var:+\"\$$var,\"}\$val" || fatal_ "evaluating \${$var}"
248 test $#,$1,$3,$5 = 6,in,and,in \
249 && case $2,$6 in ac,ac|ac,am|am,ac|am,am) :;; *) false;; esac \
250 || fatal_ "nogzip: invalid usage"
251 format=$4 where_dist_nogzip=$2 where_dist_format=$6
255 append_to_opt $where_dist_format dist-$format
256 append_to_opt $where_dist_nogzip no-dist-gzip
257 setup_vars_for_compression_format "$format"
258 # Do these before the am_opts and ac_opts variable can be munged
259 # by 'start_subtest'.
261 test -n "$am_opts" && desc=${desc:+"$desc "}"am=$am_opts"
262 test -n "$ac_opts" && desc=${desc:+"$desc "}"ac=$ac_opts"
264 start_subtest nogzip-$format am_opts=$am_opts ac_opts=$ac_opts
266 unindent >> Makefile.am <<END
268 test \$(DIST_ARCHIVES) = \$(distdir).$suffix
270 test -f \$(distdir).$suffix
272 test ! -f \$(distdir).tar.gz
275 command_ok_ "$desc [automake]" $AUTOMAKE
276 command_ok_ "$desc [autoconf]" $AUTOCONF
277 command_ok_ "$desc [configure]" ./configure
278 command_ok_ "$desc [ark-name]" $MAKE check-ark-name
279 command_ok_if_have_compressor "$desc [distcheck]" $MAKE distcheck
280 command_ok_if_have_compressor "$desc [ark-exists]" $MAKE check-ark-exists
281 command_ok_ "$desc [no .tar.gz]" $MAKE check-no-tar-gz
289 nogzip in am and bzip2 in am
290 nogzip in ac and xz in am
291 nogzip in am and lzip in ac
292 nogzip in ac and zip in ac
295 # ----------------------------------------------------------- #
296 # The 'dist-gzip' target is created also with no-dist-gzip. #
297 # ----------------------------------------------------------- #
299 start_subtest dist-gzip-persistence am_opts=no-dist-gzip,dist-xz
300 command_ok_ "dist-gzip persistence [automake]" $AUTOMAKE
301 command_ok_ "dist-gzip persistence [autoconf]" $AUTOCONF
302 command_ok_ "dist-gzip persistence [configure]" ./configure
303 can_compress dist-gzip-persistence gzip
307 # ----------------------- #
308 # Parallel compression. #
309 # ----------------------- #
311 # We only use formats requiring 'gzip', 'bzip2' and 'xz' programs,
312 # since there are the most likely to be all found on the majority
315 start_subtest parallel-compression ac_opts=dist-bzip2 am_opts=dist-xz
318 tarname=parallel-compression-1.0
323 setup_vars_for_compression_format $format
325 tarball=$tarname.$suffix \
326 && test -f $tarball \
327 && mkdir check-$format \
328 && cp $tarball check-$format \
329 && cd check-$format \
330 && $compressor -d $tarball \
331 && tar xvf $tarname.tar \
332 && diff ../Makefile.in $tarname/Makefile.in \
334 && rm -rf check-$format
338 command_ok_ "$desc [automake]" $AUTOMAKE
340 if ! have_compressor xz && ! have_compressor bzip2; then
341 skip_reason="both 'bzip2' and 'xz' are unavailable"
342 elif ! have_compressor xz; then
343 skip_reason="'xz' not available"
344 elif ! have_compressor bzip2; then
345 skip_reason="'bzip2' not available"
349 if test "$MAKE_j4" = false; then
350 test -z "$skip_reason" || skip_reason="$skip_reason, and "
351 skip_reason="${skip_reason}make concurrency unavailable"
354 if test -n "$skip_reason"; then
355 skip_row_ 6 -r "$skip_reason" "$desc"
357 command_ok_ "$desc [autoconf]" $AUTOCONF
358 command_ok_ "$desc [configure]" ./configure
359 command_ok_ "$desc [make -j4 dist-all]" $MAKE_j4 dist
360 ls -l # For debugging.
361 command_ok_ "$desc [check .tar.gz tarball]" check_tarball gzip
362 command_ok_ "$desc [check .tar.bz2 tarball]" check_tarball bzip2
363 command_ok_ "$desc [check .tar.xz tarball]" check_tarball xz
366 unset tarname desc skip_reason
371 # --------------------------------------------------------- #
372 # The various 'dist-*' targets can happily work together. #
373 # --------------------------------------------------------- #
375 start_subtest all-together
377 desc='all compressors together'
378 tarname=all-together-1.0
380 echo 'AM_INIT_AUTOMAKE([' > am-init.m4
381 echo 'AUTOMAKE_OPTIONS =' > Makefile.am
383 # Add half 'dist-*' options to AM_INIT_AUTOMAKE, half to AUTOMAKE_OPTIONS.
385 for fmt in $all_compression_formats; do
386 test $fmt = gzip && continue
388 echo " dist-$fmt" >> am-init.m4
391 echo "AUTOMAKE_OPTIONS += dist-$fmt" >> Makefile.am
397 echo '])' >> am-init.m4
399 sed 's/AM_INIT_AUTOMAKE.*/m4_include([am-init.m4])/' configure.ac > t
407 command_ok_ "$desc [aclocal]" $ACLOCAL --force
408 command_ok_ "$desc [automake]" $AUTOMAKE
409 command_ok_ "$desc [autoconf]" $AUTOCONF
410 command_ok_ "$desc [configure]" ./configure
412 if have_all_compressors; then
413 command_ok_ "$desc [make distcheck, real]" $MAKE distcheck
415 skip_ -r "not all compressors available" "$desc [make distcheck, real]"
418 # We fake existence of all the compressors here, so that we don't have
419 # to require any of them to run the further tests. This is especially
420 # important since it's very unlikely that a non-developer has all the
421 # compression tools installed on his machine at the same time.
425 cat > check-distdir <<END
427 { ls -l '$tarname' && diff Makefile.am '$tarname'/Makefile.am; } >&2 \
428 || { echo "== distdir fail =="; exit 1; }
430 cat > grep-distdir-error <<'END'
432 grep 'distdir fail' && exit 1
435 chmod a+x check-distdir grep-distdir-error
436 for prog in tar $all_compressors; do
438 tar|zip) cp check-distdir $prog;;
439 *) cp grep-distdir-error $prog;;
443 ls -l # For debugging.
447 PATH=$(pwd)/bin$PATH_SEPARATOR$PATH; export PATH
450 "$desc ['make dist-all', stubbed]" \
453 subdesc="$desc ['make dist -j4', stubbed]"
454 if test "$MAKE_j4" = false; then
455 skip_ -r "make concurrency unavailable" "$subdesc"
457 command_ok_ "$subdesc" $MAKE_j4 dist
461 PATH=$oPATH; export PATH