#! /bin/sh # Copyright (C) 2012-2013 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 . # Check support for different compression formats used by distribution # archives. am_create_testdir=empty . test-init.sh plan_ 70 # ---------------------------------------------------- # # Common and/or auxiliary subroutines and variables. # # ---------------------------------------------------- # ocwd=$(pwd) || fatal_ "getting current working directory" unset TAR # Create common aclocal.m4 file, for later tests. mkdir setup \ && cd setup \ && echo 'AC_INIT([x], [0]) AM_INIT_AUTOMAKE' > configure.ac \ && $ACLOCAL \ && mv aclocal.m4 .. \ && cd .. \ && rm -rf setup \ || fatal_ "creating common aclocal.m4 file" # Some make implementations (e.g., HP-UX) don't grok '-j', some require # no space between '-j' and the number of jobs (e.g., older GNU make # versions), and some *do* require a space between '-j' and the number # of jobs (e.g., Solaris dmake). We need a runtime test to see what # works. for MAKE_j4 in "$MAKE -j4" "$MAKE -j 4" false; do echo all: | $MAKE_j4 -f - && break : For shells with buggy 'set -e'. done # Set variables '$compressor' and '$suffix'. setup_vars_for_compression_format () { suffix=NONE compressor=NONE case $1 in gzip) suffix=tar.gz compressor=gzip ;; tarZ) suffix=tar.Z compressor=compress ;; lzip) suffix=tar.lz compressor=lzip ;; xz) suffix=tar.xz compressor=xz ;; bzip2) suffix=tar.bz2 compressor=bzip2 ;; zip) suffix=zip compressor=zip ;; shar) suffix=shar.gz compressor=shar ;; *) fatal_ "invalid compression format '$1'";; esac } have_compressor () { test $# -eq 1 || fatal_ "have_compressor(): bad usage" case $1 in # Assume gzip(1) is available on every reasonable portability target. gzip) return 0;; # On Cygwin, as of 9/2/2012, 'compress' is provided by sharutils # and is just a dummy script that is not able to actually compress # (it can only decompress). So, check that the 'compress' program # is actually able to compress input. # Note that, at least on GNU/Linux, 'compress' does (and is # documented to) exit with status 2 if the output is larger than # the input after (attempted) compression; so we need to pass it # an input that it can actually reduce in size when compressing. compress) for x in 1 2 3 4 5 6 7 8; do echo aaaaaaaaaaaaaaaaaaaaa done | compress -c >/dev/null && return 0 return 1 ;; *) case $1 in # Do not use --version, or older versions bzip2 would try to # compress stdin. This would cause binary output in the test # logs, with potential breakage of our testsuite harness. bzip2) o=--help;; # OpenSolaris zip do not support the '--version' option, but # accepts the '-v' one with a similar meaning (if no further # arguments are given). zip) o=-v;; # Assume the other compressors we care about support the # '--version' option. *) o=--version;; esac # Redirect to stderr to avoid polluting the output, in case this # function is used in a command substitution (as it is, below). if $1 $o &2; then return 0 else return 1 fi ;; esac fatal_ "have_compressor(): dead code reached" } all_compression_formats='gzip tarZ lzip xz bzip2 zip shar' all_compressors=$( for x in $all_compression_formats; do setup_vars_for_compression_format $x echo $compressor done | tr "$nl" ' ') echo All compressors: $all_compressors missing_compressors=$( for c in $all_compressors; do have_compressor $c || echo $c done | tr "$nl" ' ') echo Missing compressors: $missing_compressors # Redefine to avoid re-running the already executed checks. have_compressor () { case " $missing_compressors " in *\ $1\ *) false;; *) : ;; esac } have_all_compressors () { test -z "$missing_compressors" } start_subtest () { name=$1; shift test -n "$name" || fatal_ "start_subtest: no subtest name given" if test $# -gt 0; then eval "$@" || fatal_ "start_subtest: evaluating assignments" fi ac_opts=$(echo $ac_opts | tr ',' ' ') am_opts=$(echo $am_opts | tr ',' ' ') mkdir "$name" cd "$name" unindent > configure.ac < Makefile.am # It is imperative that aclocal.m4 is copied after configure.ac has # been created, to avoid a spurious trigger of the automatic remake # rules for configure & co. cp "$ocwd"/aclocal.m4 \ "$am_scriptdir"/missing \ "$am_scriptdir"/install-sh \ . } end_subtest () { unset name; unset ac_opts; unset am_opts; cd "$ocwd" || fatal_ "couldn't chdir back to '$ocwd'" } command_ok_if_have_compressor () { if have_compressor "$compressor"; then command_ok_ "$@" else skip_ -r "'$compressor' not available" "$1" fi } can_compress () { test $# -eq 2 || fatal_ "can_compress: bad number of arguments" tarname=$1 format=$2 setup_vars_for_compression_format "$format" command_ok_ "'dist-$format' target always created" $MAKE -n dist-$format command_ok_if_have_compressor "'make dist-$format' work by default" \ eval ' rm -rf *$tarname* \ && $MAKE dist-$format \ && test -f $tarname-1.0.$suffix \ && ls -l *$tarname* \ && test "$(echo *$tarname*)" = $tarname-1.0.$suffix' unset suffix compressor format tarname } # ---------------------------------------- # # Defaults layout of the dist-* targets. # # ---------------------------------------- # start_subtest defaults command_ok_ "default [automake]" $AUTOMAKE command_ok_ "default [autoconf]" $AUTOCONF command_ok_ "default [configure]" ./configure command_ok_ "default [make distcheck]" $MAKE distcheck command_ok_ "'make dist' only builds *.tar.gz by default" \ test "$(ls *defaults*)" = defaults-1.0.tar.gz rm -rf *defaults* for fmt in $all_compression_formats; do can_compress defaults $fmt done unset fmt end_subtest # ----------------------------------------------------------- # # Check diagnostic for no-dist-gzip without another dist-*. # # ----------------------------------------------------------- # nogzip_stderr () { grep "$1:.*no-dist-gzip" stderr \ && grep "$1:.* at least one archive format must be enabled" stderr } nogzip_automake_failure () { AUTOMAKE_fails -d "no-dist-gzip ($1) without other formats is an error" command_ok_ "no-dist-gzip ($1) without other formats gives diagnostic" \ nogzip_stderr "$2" } start_subtest am-nogz-only am_opts=no-dist-gzip ac_opts= nogzip_automake_failure 'am' 'Makefile\.am:1' end_subtest start_subtest ac-nogz-only am_opts= ac_opts=no-dist-gzip nogzip_automake_failure 'ac' 'configure\.ac:2' end_subtest # ------------------------------------------------- # # Check use of no-dist-gzip with a dist-* option. # # ------------------------------------------------- # append_to_opt () { var=$1_opts val=$2 eval "$var=\${$var:+\"\$$var,\"}\$val" || fatal_ "evaluating \${$var}" unset var val } nogzip () { test $#,$1,$3,$5 = 6,in,and,in \ && case $2,$6 in ac,ac|ac,am|am,ac|am,am) :;; *) false;; esac \ || fatal_ "nogzip: invalid usage" format=$4 where_dist_nogzip=$2 where_dist_format=$6 shift 6 am_opts= ac_opts= append_to_opt $where_dist_format dist-$format append_to_opt $where_dist_nogzip no-dist-gzip setup_vars_for_compression_format "$format" # Do these before the am_opts and ac_opts variable can be munged # by 'start_subtest'. desc= test -n "$am_opts" && desc=${desc:+"$desc "}"am=$am_opts" test -n "$ac_opts" && desc=${desc:+"$desc "}"ac=$ac_opts" start_subtest nogzip-$format am_opts=$am_opts ac_opts=$ac_opts unindent >> Makefile.am < am-init.m4 echo 'AUTOMAKE_OPTIONS =' > Makefile.am # Add half 'dist-*' options to AM_INIT_AUTOMAKE, half to AUTOMAKE_OPTIONS. flip=: for fmt in $all_compression_formats; do test $fmt = gzip && continue if $flip; then echo " dist-$fmt" >> am-init.m4 flip=false else echo "AUTOMAKE_OPTIONS += dist-$fmt" >> Makefile.am flip=: fi done unset flip fmt echo '])' >> am-init.m4 sed 's/AM_INIT_AUTOMAKE.*/m4_include([am-init.m4])/' configure.ac > t mv -f t configure.ac # For debugging. cat Makefile.am cat configure.ac cat am-init.m4 command_ok_ "$desc [aclocal]" $ACLOCAL --force command_ok_ "$desc [automake]" $AUTOMAKE command_ok_ "$desc [autoconf]" $AUTOCONF command_ok_ "$desc [configure]" ./configure if have_all_compressors; then command_ok_ "$desc [make distcheck, real]" $MAKE distcheck else skip_ -r "not all compressors available" "$desc [make distcheck, real]" fi # We fake existence of all the compressors here, so that we don't have # to require any of them to run the further tests. This is especially # important since it's very unlikely that a non-developer has all the # compression tools installed on his machine at the same time. mkdir bin cd bin cat > check-distdir <&2 \ || { echo "== distdir fail =="; exit 1; } END cat > grep-distdir-error <<'END' #!/bin/sh grep 'distdir fail' && exit 1 : END chmod a+x check-distdir grep-distdir-error for prog in tar $all_compressors; do case $prog in tar|shar|zip) cp check-distdir $prog;; *) cp grep-distdir-error $prog;; esac done unset prog ls -l # For debugging. cd .. oPATH=$PATH PATH=$(pwd)/bin$PATH_SEPARATOR$PATH; export PATH command_ok_ \ "$desc ['make dist-all', stubbed]" \ $MAKE dist-all subdesc="$desc ['make dist -j4', stubbed]" if test "$MAKE_j4" = false; then skip_ -r "make concurrency unavailable" "$subdesc" else command_ok_ "$subdesc" $MAKE_j4 dist fi unset subdesc PATH=$oPATH; export PATH end_subtest :