| #! /bin/sh | |
| # Copyright (C) 2011-2026 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 <https://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 -u > 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 | |
| : |