#! /bin/sh
# Copyright (C) 2011-2012 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 .
# Test that automake complains when required auxiliary files are not
# found, and that 'automake --add-missing' installs the files (and only
# the files) it's supposed to, and that these files are symlinked by
# default, but copied if the '--copy' option is used.
am_create_testdir=empty
. ./defs || exit 1
plan_ "later"
build_aux=build-aux
ocwd=$(pwd) || fatal_ "cannot get current working directory"
# Try to improve readability of displayed diffs.
if diff -u /dev/null /dev/null; then
am_diff='diff -u'
elif diff -c /dev/null /dev/null; then
am_diff='diff -c'
else
am_diff=diff
fi
# MinGW/MSYS lacks real symlinks, so we'll have to skip some checks
# on that system. More details below.
echo dummy > foo
if ln -s foo bar && test -h bar; then
have_true_symlinks=yes
else
have_true_symlinks=no
fi
rm -f foo bar
cat > configure.stub << END
AC_INIT([$me], [1.0])
AC_CONFIG_AUX_DIR([$build_aux])
AM_INIT_AUTOMAKE
AC_CONFIG_FILES([Makefile])
END
# Pre-compute aclocal.m4, in order to save several aclocal invocations.
cat configure.stub - > configure.ac <<'END'
AC_PROG_CC
AC_CANONICAL_BUILD
AC_CANONICAL_HOST
AC_CANONICAL_TARGET
AC_CANONICAL_SYSTEM
AM_PATH_LISPDIR
AM_PATH_PYTHON
END
$ACLOCAL || framework_failure_ "cannot pre-compute aclocal.m4"
rm -rf configure.ac autom4te*.cache
mv aclocal.m4 aclocal.stub
# For debugging.
cat configure.stub
cat aclocal.stub
check_count=0
# This is hacky and ugly and complex, but allow us to organize our tests
# below in a more "declarative fashion". All in all, a good trade-off.
check_ ()
{
set +x # Temporary disable shell traces to remove noise from log files.
check_count=$(($check_count + 1))
echo check count: $check_count
override=no
run_aclocal=no
fetch_file=
while test $# -gt 0; do
case $1 in
--override) override=yes;;
--run-aclocal) run_aclocal=yes;;
--fetch-file) fetch_file=$2; shift;;
*) framework_failure_ "check_: invalid argument '$1'";;
esac
shift
done
mkdir testdir-$check_count
cd testdir-$check_count
# Directory for common data files (specific to the current test, but
# shared by its "subtests").
mkdir generic
cd generic
: > Makefile.am
if test $override = yes; then
: > configure.ac
else
cp "$ocwd"/configure.stub configure.ac
fi
test -z "$fetch_file" || cp "$ocwd/$fetch_file" .
# Read description of "test scenario" from standard input.
what= line= name= files=
while read line; do
case $line in
'== Name ==') what=NAME;;
'== Makefile.am ==') what=Makefile.am;;
'== configure.ac ==') what=configure.ac;;
'== Files ==') what=LIST;;
'==*') framework_failure_ "invalid input line: $line";;
''|'#%'*) : Empty line or ad-hoc comment, ignore. ;;
*)
if test $what = LIST; then
files="$files $line"
elif test $what = NAME; then
name=$line
else
printf '%s\n' "$line" >> "$what"
fi
;;
esac
done
test -n "$name" || fatal_ "name of a test case not specified"
if test $run_aclocal = yes; then
if $ACLOCAL; then
ok_ "[$name] aclocal.m4 rebuilt"
echo == aclocal.m4 ==
cat aclocal.m4
else
not_ok_ "[$name] aclocal failure, aclocal.m4 not rebuilt"
fi
else
cp "$ocwd"/aclocal.stub aclocal.m4
fi
echo == Makefile.am ==
cat Makefile.am
echo == configure.ac ==
cat configure.ac
echo Expected files: $files
mkdir "$build_aux"
cd ..
# End of "test scenario" setup.
set -x # Re-enable shell traces.
pwd
ls -l generic
# Test once with '--copy', once without.
for action in link copy; do
case $action in
link) opts='--add-missing';;
copy) opts='-a --copy';;
*) fatal_ "invalid value '$action' for \$action";;
esac
pfx="[$action $name]"
cp -R generic $action
cd $action
# If the required auxiliary files are missing, and automake is
# not told to install them, it should complain and error out,
# and also give a useful suggestion.
AUTOMAKE_fails -d "$pfx missing files, automake fails"
for f in $files; do
command_ok_ \
"$pfx warn about missing file $f" \
$FGREP "required file '$build_aux/$f' not found" stderr
# Suggest the user to use '--add-missing'.
command_ok_ \
"$pfx suggest --add-missing for $f" \
grep ".*--add-missing.* install .*'$f'" stderr
done
# No files should be automatically installed by automake if it
# is not told to.
if ls "$build_aux" | grep .; then r='not ok'; else r=ok; fi
result_ "$r" "$pfx no extra files installed"
AUTOMAKE_run -d "$pfx automake run successfully" -- $opts
ls -l . $build_aux
# The expected files should get installed correctly (e.g., no
# broken symlinks).
for f in $files; do
command_ok_ \
"$pfx file $f installed" \
test -f $build_aux/$f
done
# Automake should inform about which files it's installing.
for f in $files; do
command_ok_ \
"$pfx report installation of $f" \
$FGREP ": installing '$build_aux/$f'" stderr
done
# Only the expected files should be installed. But automake always
# require 'missing' and 'install-sh', so account for them.
all_files="install-sh missing $files"
for f in $all_files; do echo $f; done | sort | uniq > files.exp
(cd $build_aux && ls) | sort > files.got
cat files.exp
cat files.got
command_ok_ \
"$pfx all and only expected files installed" \
$am_diff files.exp files.got
# The files should be copied by '--copy' and symlinked otherwise.
# But these checks make no sense on systems like MSYS/MinGW where
# there are no true symlinks ('ln -s' behaves like 'cp -p'), so be
# ready to skip the checks in that case. See automake bug#10441.
for f in $files; do
if test $have_true_symlinks = no; then
skip_ -r "system lacks true symlinks" "$pfx $f is a symlink or not"
else
if test -h $build_aux/$f; then
is_symlink=yes
else
is_symlink=no
fi
case $action,$is_symlink in
link,yes) ok_ "$pfx $f has been symlinked" ;;
link,no) not_ok_ "$pfx $f has not been symlinked" ;;
copy,yes) not_ok_ "$pfx $f has been symlinked" ;;
copy,no) ok_ "$pfx $f has not been symlinked" ;;
*) fatal_ "invalid condition in case" ;;
esac
fi
done
# Now that the required auxiliary files have been installed, automake
# should not complain anymore even if the '--add-missing' option is
# not used.
AUTOMAKE_run -d "$pfx automake finds all added files"
cd ..
done # for action in link copy
cd "$ocwd" || fatal_ "cannot chdir back to top-level test directory"
}
# Automake should always and unconditionally require the 'missing'
# and 'install-sh' scripts.
check_ <<'END'
== Name ==
minimal
== Files ==
install-sh missing
END
check_ <<'END'
== Name ==
depcomp/C
== Files ==
depcomp
== configure.ac ==
AC_PROG_CC
== Makefile.am ==
bin_PROGRAMS = foo
END
check_ <<'END'
== Name ==
depcomp/C++
== Files ==
depcomp
== configure.ac ==
AC_PROG_CXX
== Makefile.am ==
bin_PROGRAMS = foo
foo_SOURCES = foo.cc
END
check_ --run-aclocal <<'END'
== Name ==
compile
== Files ==
compile
== configure.ac ==
# Using AM_PROG_CC_C_O in configure.ac should be enough. No need to
# use AC_PROG_CC too, nor to define xxx_PROGRAMS in Makefile.am.
AM_PROG_CC_C_O
END
# For config.guess and config.sub.
for mach in build host target system; do
MACH=$(echo "$mach" | LC_ALL=C tr '[a-z]' '[A-Z]')
check_ < foo.texi
check_ --fetch-file foo.texi <<'END'
== Name ==
Texinfo
== Files ==
texinfo.tex
== Makefile.am ==
info_TEXINFOS = foo.texi
END
echo '@include version.texi' >> foo.texi
check_ --fetch-file foo.texi <<'END'
== Name ==
Texinfo/mdate-sh
== Files ==
mdate-sh
texinfo.tex
== Makefile.am ==
info_TEXINFOS = foo.texi
END
rm -f foo.texi
check_ <<'END'
== Name ==
elisp-comp
== Files ==
elisp-comp
== configure.ac ==
AM_PATH_LISPDIR
== Makefile.am ==
lisp_LISP = foo.el
END
check_ <<'END'
== Name ==
py-compile
== Files ==
py-compile
== configure.ac ==
AM_PATH_PYTHON
== Makefile.am ==
python_PYTHON = foo.py
END
# Try few unrelated auxiliary scripts together.
check_ <<'END'
== Name ==
misc
== Files ==
py-compile
depcomp
ylwrap
config.sub
config.guess
== configure.ac ==
AC_CANONICAL_BUILD
AC_CANONICAL_HOST
AC_PROG_CXX
== Makefile.am ==
PYTHON = python
pythondir = $(prefix)/py
YACC = bison -y
bin_PROGRAMS = foo
foo_SOURCES = bar.yxx baz.c++
python_PYTHON = zardoz.py
END
: