383 lines
9.5 KiB
Bash
383 lines
9.5 KiB
Bash
#! /bin/sh
|
|
# Copyright (C) 2011-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/>.
|
|
|
|
# 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
|
|
. test-init.sh
|
|
|
|
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
|
|
AC_OUTPUT
|
|
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
|
|
compile
|
|
== 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 AC_PROG_CC in configure.ac should be enough.
|
|
# No need to also define, say, xxx_PROGRAMS in Makefile.am.
|
|
AC_PROG_CC
|
|
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_ <<END
|
|
== Name ==
|
|
cfg-$mach
|
|
== Files ==
|
|
config.sub
|
|
config.guess
|
|
== configure.ac ==
|
|
AC_CANONICAL_$MACH
|
|
END
|
|
done
|
|
|
|
check_ <<'END'
|
|
== Name ==
|
|
ylwrap/Lex
|
|
== Files ==
|
|
ylwrap
|
|
compile
|
|
== configure.ac ==
|
|
AC_PROG_CC
|
|
AC_PROG_LEX
|
|
== Makefile.am ==
|
|
AUTOMAKE_OPTIONS = no-dependencies
|
|
bin_PROGRAMS = foo
|
|
foo_SOURCES = foo.l
|
|
END
|
|
|
|
check_ <<'END'
|
|
== Name ==
|
|
ylwrap/Yacc
|
|
== Files ==
|
|
ylwrap
|
|
compile
|
|
== configure.ac ==
|
|
AC_PROG_CC
|
|
AC_PROG_YACC
|
|
== Makefile.am ==
|
|
AUTOMAKE_OPTIONS = no-dependencies
|
|
bin_PROGRAMS = foo
|
|
foo_SOURCES = foo.y
|
|
END
|
|
|
|
echo '@setfilename foo.info' > 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 ==
|
|
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
|
|
|
|
:
|