| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469 | #! /bin/sh# Copyright (C) 2012-2017 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 <http://www.gnu.org/licenses/>.# Check support for different compression formats used by distribution# archives.am_create_testdir=empty. test-init.shplan_ 66# ---------------------------------------------------- ##  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     ;;    lzip) suffix=tar.lz  compressor=lzip     ;;      xz) suffix=tar.xz  compressor=xz       ;;   bzip2) suffix=tar.bz2 compressor=bzip2    ;;     zip) suffix=zip     compressor=zip      ;;       *) fatal_ "invalid compression format '$1'";;  esac}have_compressor (){  test $# -eq 1 || fatal_ "have_compressor(): bad usage"  if test $1 = gzip; then    # Assume gzip(1) is available on every reasonable portability target.    return 0  fi  needed_programs=$1  # Assume by default the other compressors we care about support the  # '--version' option.  We'll special-case the one which don't.  checker_option=--version  case $1 in    bzip2)      # 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.      checker_option=--help      ;;    zip)      # OpenSolaris zip do not support the '--version' option, but      # accepts the '-v' one with a similar meaning (if no further      # arguments are given).      checker_option=-v      # Also, we need 'unzip' to decompress the created zipped archives      # (bug#15181).      needed_programs='zip unzip'      ;;  esac  # Redirect to stderr to avoid polluting the output, in case this  # function is used in a command substitution (as it is, later in  # this script).  for p in $needed_programs; do    $p $checker_option </dev/null >&2 || return 1  done  return 0}all_compression_formats='gzip lzip xz bzip2 zip'all_compressors=$(  for x in $all_compression_formats; do    setup_vars_for_compression_format $x    echo $compressor  done | tr "$nl" ' ')echo All compressors: $all_compressorsmissing_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 <<END    AC_INIT([$name], [1.0])    AM_INIT_AUTOMAKE([$ac_opts])    AC_CONFIG_FILES([Makefile])    AC_OUTPUTEND  echo "AUTOMAKE_OPTIONS = $am_opts" > 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 defaultscommand_ok_ "default [automake]"        $AUTOMAKEcommand_ok_ "default [autoconf]"        $AUTOCONFcommand_ok_ "default [configure]"       ./configurecommand_ok_ "default [make distcheck]"  $MAKE distcheckcommand_ok_ "'make dist' only builds *.tar.gz by default" \            test "$(ls *defaults*)" = defaults-1.0.tar.gzrm -rf *defaults*for fmt in $all_compression_formats; do  can_compress defaults $fmtdoneunset fmtend_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_subteststart_subtest ac-nogz-only am_opts= ac_opts=no-dist-gzipnogzip_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 <<END    check-ark-name:	test \$(DIST_ARCHIVES) = \$(distdir).$suffix    check-ark-exists:	test -f \$(distdir).$suffix    check-no-tar-gz:	test ! -f \$(distdir).tar.gzEND  command_ok_ "$desc [automake]" $AUTOMAKE  command_ok_ "$desc [autoconf]" $AUTOCONF  command_ok_ "$desc [configure]" ./configure  command_ok_ "$desc [ark-name]" $MAKE check-ark-name  command_ok_if_have_compressor "$desc [distcheck]" $MAKE distcheck  command_ok_if_have_compressor "$desc [ark-exists]" $MAKE check-ark-exists  command_ok_ "$desc [no .tar.gz]"  $MAKE check-no-tar-gz  unset desc  end_subtest}#      $1 $2  $3   $4     $5  $6nogzip in am  and  bzip2  in  amnogzip in ac  and  xz     in  amnogzip in am  and  lzip   in  acnogzip in ac  and  zip    in  ac# ----------------------------------------------------------- ##  The 'dist-gzip' target is created also with no-dist-gzip.  ## ----------------------------------------------------------- #start_subtest dist-gzip-persistence am_opts=no-dist-gzip,dist-xzcommand_ok_ "dist-gzip persistence [automake]"  $AUTOMAKEcommand_ok_ "dist-gzip persistence [autoconf]"  $AUTOCONFcommand_ok_ "dist-gzip persistence [configure]" ./configurecan_compress dist-gzip-persistence gzipend_subtest# ----------------------- ##  Parallel compression.  ## ----------------------- ## We only use formats requiring 'gzip', 'bzip2' and 'xz' programs,# since there are the most likely to be all found on the majority# of systems.start_subtest parallel-compression ac_opts=dist-bzip2 am_opts=dist-xzdesc=gzip+bzip2+xztarname=parallel-compression-1.0check_tarball (){  format=$1  setup_vars_for_compression_format $format  (    tarball=$tarname.$suffix \      && test -f $tarball \      && mkdir check-$format \      && cp $tarball check-$format \      && cd check-$format \      && $compressor -d $tarball \      && tar xvf $tarname.tar \      && diff ../Makefile.in $tarname/Makefile.in \      && cd .. \      && rm -rf check-$format   )}command_ok_ "$desc [automake]" $AUTOMAKEif ! have_compressor xz && ! have_compressor bzip2; then  skip_reason="both 'bzip2' and 'xz' are unavailable"elif ! have_compressor xz; then  skip_reason="'xz' not available"elif ! have_compressor bzip2; then  skip_reason="'bzip2' not available"else  skip_reason=fiif test "$MAKE_j4" = false; then  test -z "$skip_reason" || skip_reason="$skip_reason, and "  skip_reason="${skip_reason}make concurrency unavailable"fiif test -n "$skip_reason"; then  skip_row_ 6 -r "$skip_reason" "$desc"else  command_ok_ "$desc [autoconf]" $AUTOCONF  command_ok_ "$desc [configure]" ./configure  command_ok_ "$desc [make -j4 dist-all]"  $MAKE_j4 dist  ls -l # For debugging.  command_ok_ "$desc [check .tar.gz tarball]"  check_tarball gzip  command_ok_ "$desc [check .tar.bz2 tarball]" check_tarball bzip2  command_ok_ "$desc [check .tar.xz tarball]"  check_tarball xzfiunset tarname desc skip_reasonend_subtest# --------------------------------------------------------- ##  The various 'dist-*' targets can happily work together.  ## --------------------------------------------------------- #start_subtest all-togetherdesc='all compressors together'tarname=all-together-1.0echo 'AM_INIT_AUTOMAKE([' > am-init.m4echo '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=:  fidoneunset flip fmtecho '])' >> am-init.m4sed 's/AM_INIT_AUTOMAKE.*/m4_include([am-init.m4])/' configure.ac > tmv -f t configure.ac# For debugging.cat Makefile.amcat configure.accat am-init.m4command_ok_ "$desc [aclocal]" $ACLOCAL --forcecommand_ok_ "$desc [automake]" $AUTOMAKEcommand_ok_ "$desc [autoconf]" $AUTOCONFcommand_ok_ "$desc [configure]" ./configureif have_all_compressors; then  command_ok_ "$desc [make distcheck, real]" $MAKE distcheckelse  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 bincd bincat > check-distdir <<END#!/bin/sh{ ls -l '$tarname' && diff Makefile.am '$tarname'/Makefile.am; } >&2 \  || { echo "== distdir fail =="; exit 1; }ENDcat > grep-distdir-error <<'END'#!/bin/shgrep 'distdir fail' && exit 1:ENDchmod a+x check-distdir grep-distdir-errorfor prog in tar $all_compressors; do  case $prog in    tar|zip) cp check-distdir $prog;;          *) cp grep-distdir-error $prog;;  esacdoneunset progls -l # For debugging.cd ..oPATH=$PATHPATH=$(pwd)/bin$PATH_SEPARATOR$PATH; export PATHcommand_ok_ \  "$desc ['make dist-all', stubbed]" \  $MAKE dist-allsubdesc="$desc ['make dist -j4', stubbed]"if test "$MAKE_j4" = false; then  skip_ -r "make concurrency unavailable" "$subdesc"else  command_ok_ "$subdesc" $MAKE_j4 distfiunset subdescPATH=$oPATH; export PATHend_subtest:
 |