Merge branch 'maint'
[platform/upstream/automake.git] / t / dist-formats.tap
1 #! /bin/sh
2 # Copyright (C) 2012 Free Software Foundation, Inc.
3 #
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)
7 # any later version.
8 #
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.
13 #
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/>.
16
17 # Check support for different compression formats used by distribution
18 # archives.
19
20 am_create_testdir=empty
21 . ./defs || exit 1
22
23 plan_ 70
24
25 # ---------------------------------------------------- #
26 #  Common and/or auxiliary subroutines and variables.  #
27 # ---------------------------------------------------- #
28
29 ocwd=$(pwd) || fatal_ "getting current working directory"
30
31 TAR='' && unset TAR
32
33 # Create common aclocal.m4 file, for later tests.
34 mkdir setup \
35   && cd setup \
36   && echo 'AC_INIT([x], [0]) AM_INIT_AUTOMAKE' > configure.ac \
37   && $ACLOCAL \
38   && mv aclocal.m4 .. \
39   && cd .. \
40   && rm -rf setup \
41   || fatal_ "creating common aclocal.m4 file"
42
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
47 # works.
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'.
51 done
52
53 # Set variables '$compressor' and '$suffix'.
54 setup_vars_for_compression_format ()
55 {
56   suffix=NONE compressor=NONE
57   case $1 in
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'";;
66   esac
67 }
68
69 have_compressor ()
70 {
71   test $# -eq 1 || fatal_ "have_compressor(): bad usage"
72   case $1 in
73     # Assume gzip(1) is available on every reasonable portability target.
74     gzip)
75       return 0;;
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.
84     compress)
85       for x in 1 2 3 4 5 6 7 8; do
86         echo aaaaaaaaaaaaaaaaaaaaa
87       done | compress -c >/dev/null && return 0
88       return 1
89       ;;
90     *)
91       case $1 in
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.
95         bzip2) o=--help;;
96             *) o=--version;;
97       esac
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
101         return 0
102       else
103         return 1
104       fi
105       ;;
106   esac
107   fatal_ "have_compressor(): dead code reached"
108 }
109
110 all_compression_formats='gzip tarZ lzip xz bzip2 zip shar'
111
112 all_compressors=$(
113   for x in $all_compression_formats; do
114     setup_vars_for_compression_format $x
115     echo $compressor
116   done | tr "$nl" ' ')
117 echo All compressors: $all_compressors
118
119 missing_compressors=$(
120   for c in $all_compressors; do
121     have_compressor $c || echo $c
122   done | tr "$nl" ' ')
123 echo Missing compressors: $missing_compressors
124
125 # Redefine to avoid re-running the already executed checks.
126 have_compressor ()
127 {
128   case " $missing_compressors " in *\ $1\ *) false;; *) : ;; esac
129 }
130
131 have_all_compressors ()
132 {
133   test -z "$missing_compressors"
134 }
135
136 start_subtest ()
137 {
138   name=$1; shift
139   test -n "$name" || fatal_ "start_subtest: no subtest name given"
140   if test $# -gt 0; then
141     eval "$@" || fatal_ "start_subtest: evaluating assignments"
142   fi
143   ac_opts=$(echo $ac_opts | tr ',' ' ')
144   am_opts=$(echo $am_opts | tr ',' ' ')
145   mkdir "$name"
146   cd "$name"
147   unindent > configure.ac <<END
148     AC_INIT([$name], [1.0])
149     AM_INIT_AUTOMAKE([$ac_opts])
150     AC_CONFIG_FILES([Makefile])
151     AC_OUTPUT
152 END
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 \
160      .
161 }
162
163 end_subtest ()
164 {
165   unset name; unset ac_opts; unset am_opts;
166   cd "$ocwd" || fatal_ "couldn't chdir back to '$ocwd'"
167 }
168
169 command_ok_if_have_compressor ()
170 {
171   if have_compressor "$compressor"; then
172     command_ok_ "$@"
173   else
174     skip_ -r "'$compressor' not available" "$1"
175   fi
176 }
177
178 can_compress ()
179 {
180   test $# -eq 2 || fatal_ "can_compress: bad number of arguments"
181   tarname=$1 format=$2
182   setup_vars_for_compression_format "$format"
183
184   command_ok_ "'dist-$format' target always created" $MAKE -n dist-$format
185
186   command_ok_if_have_compressor "'make dist-$format' work by default" \
187     eval '
188       rm -rf *$tarname* \
189         && $MAKE dist-$format \
190         && test -f $tarname-1.0.$suffix \
191         && ls -l *$tarname* \
192         && test "$(echo *$tarname*)" = $tarname-1.0.$suffix'
193
194   unset suffix compressor format tarname
195 }
196
197 # ---------------------------------------- #
198 #  Defaults layout of the dist-* targets.  #
199 # ---------------------------------------- #
200
201 start_subtest defaults
202
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
207
208 command_ok_ "'make dist' only builds *.tar.gz by default" \
209             test "$(ls *defaults*)" = defaults-1.0.tar.gz
210
211 rm -rf *defaults*
212
213 for fmt in $all_compression_formats; do
214   can_compress defaults $fmt
215 done
216 unset fmt
217
218 end_subtest
219
220 # ----------------------------------------------------------- #
221 #  Check diagnostic for no-dist-gzip without another dist-*.  #
222 # ----------------------------------------------------------- #
223
224 nogzip_stderr ()
225 {
226   grep "$1:.*no-dist-gzip" stderr \
227     && grep "$1:.* at least one archive format must be enabled" stderr
228 }
229
230 nogzip_automake_failure ()
231 {
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" \
234               nogzip_stderr "$2"
235 }
236
237 start_subtest am-nogz-only am_opts=no-dist-gzip ac_opts=
238 nogzip_automake_failure 'am' 'Makefile\.am:1'
239 end_subtest
240
241 start_subtest ac-nogz-only am_opts= ac_opts=no-dist-gzip
242 nogzip_automake_failure 'ac' 'configure\.ac:2'
243 end_subtest
244
245 # ------------------------------------------------- #
246 #  Check use of no-dist-gzip with a dist-* option.  #
247 # ------------------------------------------------- #
248
249 append_to_opt ()
250 {
251   var=$1_opts val=$2
252   eval "$var=\${$var:+\"\$$var,\"}\$val" || fatal_ "evaluating \${$var}"
253   unset var val
254 }
255
256 nogzip ()
257 {
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
262   shift 6
263
264   am_opts= ac_opts=
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'.
270   desc=
271   test -n "$am_opts" && desc=${desc:+"$desc "}"am=$am_opts"
272   test -n "$ac_opts" && desc=${desc:+"$desc "}"ac=$ac_opts"
273
274   start_subtest nogzip-$format am_opts=$am_opts ac_opts=$ac_opts
275
276   unindent >> Makefile.am <<END
277     check-ark-name:
278         test \$(DIST_ARCHIVES) = \$(distdir).$suffix
279     check-ark-exists:
280         test -f \$(distdir).$suffix
281     check-no-tar-gz:
282         test ! -f \$(distdir).tar.gz
283 END
284
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
292
293   unset desc
294
295   end_subtest
296 }
297
298 #      $1 $2  $3   $4     $5  $6
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
303
304
305 # ----------------------------------------------------------- #
306 #  The 'dist-gzip' target is created also with no-dist-gzip.  #
307 # ----------------------------------------------------------- #
308
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
314 end_subtest
315
316
317 # ----------------------- #
318 #  Parallel compression.  #
319 # ----------------------- #
320
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
323 # of systems.
324
325 start_subtest parallel-compression ac_opts=dist-bzip2 am_opts=dist-tarZ
326
327 desc=gzip+bzip2+tarZ
328 tarname=parallel-compression-1.0
329
330 check_tarball ()
331 {
332   format=$1
333   setup_vars_for_compression_format $format
334   (
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 \
343       && cd .. \
344       && rm -rf check-$format
345    )
346 }
347
348 command_ok_ "$desc [automake]" $AUTOMAKE
349
350 skip_reason=
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"
356 fi
357
358 if test -n "$skip_reason"; then
359   skip_row_ 6 -r "$skip_reason" "$desc"
360 else
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
368 fi
369
370 unset tarname desc skip_reason
371
372 end_subtest
373
374
375 # --------------------------------------------------------- #
376 #  The various 'dist-*' targets can happily work together.  #
377 # --------------------------------------------------------- #
378
379 start_subtest all-together
380
381 desc='all compressors together'
382 tarname=all-together-1.0
383
384 echo 'AM_INIT_AUTOMAKE([' > am-init.m4
385 echo 'AUTOMAKE_OPTIONS =' > Makefile.am
386
387 # Add half 'dist-*' options to AM_INIT_AUTOMAKE, half to AUTOMAKE_OPTIONS.
388 flip=:
389 for fmt in $all_compression_formats; do
390   test $fmt = gzip && continue
391   if $flip; then
392     echo "  dist-$fmt" >> am-init.m4
393     flip=false
394   else
395     echo "AUTOMAKE_OPTIONS += dist-$fmt" >> Makefile.am
396     flip=:
397   fi
398 done
399 unset flip fmt
400
401 echo '])' >> am-init.m4
402
403 sed 's/AM_INIT_AUTOMAKE.*/m4_include([am-init.m4])/' configure.ac > t
404 mv -f t configure.ac
405
406 # For debugging.
407 cat Makefile.am
408 cat configure.ac
409 cat am-init.m4
410
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
415
416 if have_all_compressors; then
417   command_ok_ "$desc [make distcheck, real]" $MAKE distcheck
418 else
419   skip_ -r "not all compressors available" "$desc [make distcheck, real]"
420 fi
421
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.
426
427 mkdir bin
428 cd bin
429 cat > check-distdir <<END
430 #!/bin/sh
431 { ls -l '$tarname' && diff Makefile.am '$tarname'/Makefile.am; } >&2 \
432   || { echo "== distdir fail =="; exit 1; }
433 END
434 cat > grep-distdir-error <<'END'
435 #!/bin/sh
436 grep 'distdir fail' && exit 1
437 :
438 END
439 chmod a+x check-distdir grep-distdir-error
440 for prog in tar $all_compressors; do
441   case $prog in
442     tar|shar|zip) cp check-distdir $prog;;
443                *) cp grep-distdir-error $prog;;
444   esac
445 done
446 unset prog
447 ls -l # For debugging.
448 cd ..
449
450 oPATH=$PATH
451 PATH=$(pwd)/bin$PATH_SEPARATOR$PATH; export PATH
452
453 command_ok_ \
454   "$desc ['make dist-all', stubbed]" \
455   $MAKE dist-all
456
457 subdesc="$desc ['make dist -j4', stubbed]"
458 if test "$MAKE_j4" = false; then
459   skip_ -r "make concurrency unavailable" "$subdesc"
460 else
461   command_ok_ "$subdesc" $MAKE_j4 dist
462 fi
463 unset subdesc
464
465 PATH=$oPATH; export PATH
466
467 end_subtest
468
469 :