| #! /bin/sh |
| # Copyright (C) 2012-2024 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/>. |
| |
| # Several tests on the use of the m4 macro AC_CONFIG_MACRO_DIRS with |
| # aclocal. See also related test 'aclocal-macrodir.tap'. |
| |
| am_create_testdir=empty |
| . test-init.sh |
| |
| plan_ 15 |
| |
| ocwd=$(pwd) || fatal_ "getting current working directory" |
| unset ACLOCAL_PATH |
| |
| # |
| # General utility functions and variables. |
| # |
| # TODO: These should maybe be refactored, generalized and |
| # moved into 't/ax/tap-functions.sh' ... |
| # |
| |
| tcount=0 |
| r=invalid |
| description='' |
| directive='' |
| |
| test_begin () |
| { |
| if test -n "$description"; then |
| fatal_ "'test_begin' called, but another test seems active already" |
| else |
| r=ok |
| description=$1 |
| directive=${2-} |
| echo "$description" > README.txt |
| shift |
| fi |
| tcount=$(($tcount + 1)) && test $tcount -gt 0 \ |
| || fatal_ "failed to bump the test count" |
| mkdir $tcount.d |
| cd $tcount.d |
| } |
| |
| test_end () |
| { |
| if test -z "$description"; then |
| fatal_ "'test_end' called, but no test seems active" |
| else |
| cd "$ocwd" || fatal_ "cannot chdir back to top-level directory" |
| result_ "$r" -D "$directive" -- "$description" |
| # Don't leave directories for successful subtests hanging around. |
| if test -z "$directive" && test "$r" = ok; then |
| rm -rf "$tcount.d" || fatal_ "removing subdir $tcount.d" |
| fi |
| r=invalid directive= description= |
| fi |
| } |
| |
| #--------------------------------------------------------------------------- |
| |
| test_begin "AC_CONFIG_MACRO_DIRS is honored" |
| |
| cat > configure.ac <<'END' |
| AC_INIT([md], [10.0]) |
| AC_CONFIG_MACRO_DIRS([macro-dir]) |
| MY_FOO |
| END |
| |
| mkdir macro-dir |
| echo 'AC_DEFUN([MY_FOO], [::my::foo::])' > macro-dir/foo.m4 |
| |
| $ACLOCAL \ |
| && $FGREP 'm4_include([macro-dir/foo.m4])' aclocal.m4 \ |
| && $AUTOCONF \ |
| && not $FGREP 'MY_FOO' configure \ |
| && $FGREP '::my::foo::' configure \ |
| || r='not ok' |
| |
| test_end |
| |
| #--------------------------------------------------------------------------- |
| |
| three_dirs_check () |
| { |
| mkdir dir1 dir2 dir3 |
| echo 'AC_DEFUN([MY_FOO], [::my::foo::])' > dir1/foo.m4 |
| echo 'AC_DEFUN([MY_BAR], [!!my!!bar!!])' > dir2/zap.m4 |
| echo 'AC_DEFUN([MY_BAZ], [==my==baz==])' > dir3/0.m4 |
| $ACLOCAL \ |
| && $FGREP 'm4_include([dir1/foo.m4])' aclocal.m4 \ |
| && $FGREP 'm4_include([dir2/zap.m4])' aclocal.m4 \ |
| && $FGREP 'm4_include([dir3/0.m4])' aclocal.m4 \ |
| && $AUTOCONF \ |
| && not $EGREP 'MY_(FOO|BAR|BAZ)' configure \ |
| && $FGREP '::my::foo::' configure \ |
| && $FGREP '!!my!!bar!!' configure \ |
| && $FGREP '==my==baz==' configure \ |
| || r='not ok' |
| } |
| |
| #--------------------------------------------------------------------------- |
| |
| test_begin "AC_CONFIG_MACRO_DIRS several arguments" |
| |
| cat > configure.ac <<'END' |
| AC_INIT([more-args], [0.2]) |
| AC_CONFIG_MACRO_DIRS([dir1 dir2 dir3]) |
| MY_FOO |
| MY_BAR |
| MY_BAZ |
| END |
| |
| three_dirs_check |
| |
| test_end |
| |
| #--------------------------------------------------------------------------- |
| |
| test_begin "AC_CONFIG_MACRO_DIRS several calls" |
| |
| cat > configure.ac <<'END' |
| AC_INIT([more-calls], [2.0]) |
| AC_CONFIG_MACRO_DIRS([dir1]) |
| AC_CONFIG_MACRO_DIRS([dir2 dir3]) |
| MY_FOO |
| MY_BAR |
| MY_BAZ |
| END |
| |
| three_dirs_check |
| |
| test_end |
| |
| #--------------------------------------------------------------------------- |
| |
| test_begin "AC_CONFIG_MACRO_DIRS extra whitespace" |
| |
| bslash=\\ |
| |
| cat > configure.ac <<END |
| AC_INIT([more-args], [0.2]) |
| AC_CONFIG_MACRO_DIRS([ dir1${bslash} |
| ${tab} dir2 ${tab}${tab}dir3 |
| ${bslash} |
| |
| ]) |
| MY_FOO |
| MY_BAR |
| MY_BAZ |
| END |
| |
| three_dirs_check |
| |
| test_end |
| |
| #--------------------------------------------------------------------------- |
| |
| test_begin "AC_CONFIG_MACRO_DIRS precedence" |
| |
| cat > configure.ac <<'END' |
| AC_INIT([more-calls], [2.0]) |
| AC_CONFIG_MACRO_DIRS([dir1]) |
| AC_CONFIG_MACRO_DIRS([dir2 dir3]) |
| MY_FOO |
| MY_BAR |
| MY_BAZ |
| END |
| |
| mkdir dir1 dir2 dir3 |
| echo 'AC_DEFUN([MY_FOO], [OK-Foo])' > dir1/b.m4 |
| echo 'AC_DEFUN([MY_FOO], [KO-Foo])' > dir2/a.m4 |
| echo 'AC_DEFUN([MY_BAR], [OK-Bar])' > dir2/1.m4 |
| echo 'AC_DEFUN([MY_BAR], [KO-Bar])' > dir3/0.m4 |
| echo 'AC_DEFUN([MY_BAZ], [OK-Baz])' > dir3/x.m4 |
| |
| $ACLOCAL \ |
| && $FGREP 'm4_include([dir1/b.m4])' aclocal.m4 \ |
| && $FGREP 'm4_include([dir2/1.m4])' aclocal.m4 \ |
| && $FGREP 'm4_include([dir3/x.m4])' aclocal.m4 \ |
| && test $($FGREP -c 'm4_include([dir1' aclocal.m4) -eq 1 \ |
| && test $($FGREP -c 'm4_include([dir2' aclocal.m4) -eq 1 \ |
| && test $($FGREP -c 'm4_include([dir3' aclocal.m4) -eq 1 \ |
| && $AUTOCONF \ |
| && not $EGREP 'MY_(FOO|BAR|BAZ)' configure \ |
| && $FGREP 'OK-Foo' configure \ |
| && $FGREP 'OK-Bar' configure \ |
| && $FGREP 'OK-Baz' configure \ |
| && not $FGREP 'KO-' configure \ |
| || r='not ok' |
| |
| test_end |
| |
| #--------------------------------------------------------------------------- |
| |
| test_begin "AC_CONFIG_MACRO_DIRS interaction with --install" |
| |
| cat > configure.ac << 'END' |
| AC_INIT([inst], [1.0]) |
| AC_CONFIG_MACRO_DIRS([the-dir]) |
| THE_MACRO |
| END |
| |
| mkdir sys-dir the-dir |
| echo 'AC_DEFUN([THE_MACRO], [:])' > sys-dir/my.m4 |
| |
| test ! -r the-dir/my.m4 \ |
| && $ACLOCAL --install --system-acdir ./sys-dir \ |
| && diff sys-dir/my.m4 the-dir/my.m4 \ |
| || r='not ok' |
| |
| test_end |
| |
| #--------------------------------------------------------------------------- |
| |
| two_dirs_install_check () |
| { |
| mkdir sys-dir dir1 dir2 |
| echo 'AC_DEFUN([THE_MACRO], [:])' > sys-dir/my.m4 |
| echo 'AC_DEFUN([AX_FOO], [:])' > dir2/zap.m4 |
| test ! -r dir1/my.m4 \ |
| && $ACLOCAL --install --system-acdir ./sys-dir \ |
| && diff sys-dir/my.m4 dir1/my.m4 \ |
| && test ! -e dir2/my.m4 \ |
| && $FGREP 'm4_include([dir1/my.m4])' aclocal.m4 \ |
| && $FGREP 'm4_include([dir2/zap.m4])' aclocal.m4 \ |
| || r='not ok' |
| } |
| |
| #--------------------------------------------------------------------------- |
| |
| test_begin "several AC_CONFIG_MACRO_DIRS arguments and --install" |
| |
| cat > configure.ac << 'END' |
| AC_INIT([inst2a], [1.0]) |
| AC_CONFIG_MACRO_DIRS([dir1 dir2]) |
| THE_MACRO |
| AX_FOO |
| END |
| |
| two_dirs_install_check |
| |
| test_end |
| |
| #--------------------------------------------------------------------------- |
| |
| |
| test_begin "several AC_CONFIG_MACRO_DIRS calls and --install" |
| |
| cat > configure.ac << 'END' |
| AC_INIT([inst2b], [1.0]) |
| AC_CONFIG_MACRO_DIRS([dir1]) |
| AC_CONFIG_MACRO_DIRS([dir2]) |
| THE_MACRO |
| AX_FOO |
| END |
| |
| two_dirs_install_check |
| |
| test_end |
| |
| #--------------------------------------------------------------------------- |
| |
| test_begin "'-I' option wins over AC_CONFIG_MACRO_DIRS" |
| |
| cat > configure.ac <<'END' |
| AC_INIT([md], [4.6]) |
| AC_CONFIG_MACRO_DIRS([dir1]) |
| MY_FOO |
| END |
| |
| mkdir dir1 dir2 |
| echo 'AC_DEFUN([MY_FOO], [::ko::ko::])' > dir1/1.m4 |
| echo 'AC_DEFUN([MY_FOO], [::ok::ok::])' > dir2/2.m4 |
| |
| $ACLOCAL -I dir2 \ |
| && $FGREP 'm4_include([dir2/2.m4])' aclocal.m4 \ |
| && not $FGREP 'm4_include([dir1/1.m4])' aclocal.m4 \ |
| && $AUTOCONF \ |
| && not $FGREP '::ko::ko::' configure \ |
| && $FGREP '::ok::ok::' configure \ |
| || r='not ok' |
| |
| test_end |
| |
| #--------------------------------------------------------------------------- |
| |
| test_begin "AC_CONFIG_MACRO_DIRS([foo]) can create directory 'foo'" |
| |
| cat > configure.ac << 'END' |
| AC_INIT([x], [1.0]) |
| AC_CONFIG_MACRO_DIRS([foo]) |
| MY_MACRO |
| END |
| |
| mkdir acdir |
| echo 'AC_DEFUN([MY_MACRO], [:])' > acdir/bar.m4 |
| |
| test ! -d foo \ |
| && $ACLOCAL --install --system-acdir ./acdir \ |
| && diff acdir/bar.m4 foo/bar.m4 \ |
| || r='not ok' |
| |
| test_end |
| |
| #--------------------------------------------------------------------------- |
| |
| test_begin "AC_CONFIG_MACRO_DIRS([non-existent]) warns (1)" |
| |
| cat > configure.ac << 'END' |
| AC_INIT([oops], [1.0]) |
| AC_CONFIG_MACRO_DIRS([non-existent]) |
| AM_INIT_AUTOMAKE |
| END |
| |
| $ACLOCAL -Wno-error 2>stderr \ |
| && cat stderr >&2 \ |
| && grep "couldn't open directory 'non-existent'" stderr \ |
| && test -f aclocal.m4 \ |
| || r='not ok' |
| |
| rm -rf aclocal.m4 autom4te*.cache |
| |
| $ACLOCAL -Werror -Wno-unsupported \ |
| && test -f aclocal.m4 \ |
| || r='not ok' |
| |
| test_end |
| |
| #--------------------------------------------------------------------------- |
| |
| test_begin "AC_CONFIG_MACRO_DIRS([non-existent]) warns (2)" |
| |
| cat > configure.ac << 'END' |
| AC_INIT([oops], [1.0]) |
| AC_CONFIG_MACRO_DIRS([dir-ok]) |
| AC_CONFIG_MACRO_DIRS([dir-ko]) |
| END |
| |
| mkdir dir-ok |
| not $ACLOCAL 2>stderr \ |
| && cat stderr >&2 \ |
| && grep "couldn't open directory 'dir-ko'" stderr \ |
| && not grep "dir-ok" stderr \ |
| && test ! -e aclocal.m4 \ |
| || r='not ok' |
| |
| test_end |
| |
| #--------------------------------------------------------------------------- |
| |
| test_begin "AC_CONFIG_MACRO_DIRS([existent non-existent]) errors out" |
| |
| cat > configure.ac << 'END' |
| AC_INIT([oops], [1.0]) |
| AC_CONFIG_MACRO_DIRS([dir-ok]) |
| AC_CONFIG_MACRO_DIRS([dir-ko]) |
| END |
| |
| mkdir dir-ok |
| |
| not $ACLOCAL -Wnone --install 2>stderr \ |
| && cat stderr >&2 \ |
| && grep "couldn't open directory 'dir-ko'" stderr \ |
| && test ! -e dir-ko \ |
| || r='not ok' |
| |
| test_end |
| |
| #--------------------------------------------------------------------------- |
| |
| test_begin "AC_CONFIG_MACRO_DIRS([not-exist]) and ACLOCAL_AMFLAGS = -I not-exist" |
| |
| cat > configure.ac << 'END' |
| AC_INIT([oops], [1.0]) |
| AC_CONFIG_MACRO_DIRS([not-exist]) |
| END |
| |
| cat > Makefile.am << 'END' |
| ACLOCAL_AMFLAGS = -I not-exist |
| END |
| |
| $ACLOCAL -Wno-error 2>stderr \ |
| && cat stderr >&2 \ |
| && test $(grep -c "couldn't open directory 'not-exist'" stderr) -eq 1 \ |
| || r='not ok' |
| |
| test_end |
| |
| #--------------------------------------------------------------------------- |
| |
| # Avoid spurious failures with pre-2.70 autoconf. |
| # FIXME: remove this in automake 2.0, once we require Autoconf 2.70. |
| if echo 'AC_INIT AC_CONFIG_MACRO_DIRS' | $AUTOCONF -o/dev/null -; then |
| |
| test_begin "AC_CONFIG_MACRO_DIRS interaction with AC_REQUIRE" |
| |
| unindent > configure.ac <<'END' |
| AC_INIT([req], [1.0]) |
| AC_CONFIG_MACRO_DIRS([m1 m2]) |
| AC_DEFUN([MY_FOO], [ |
| AC_REQUIRE([MY_BAR]) |
| AC_REQUIRE([MY_BAZ]) |
| ]) |
| MY_FOO |
| END |
| |
| mkdir m1 m2 |
| echo 'AC_DEFUN([MY_BAR], [^^my^^bar^^])' > m1/x.m4 |
| echo 'AC_DEFUN([MY_BAZ], [~~my~~baz~~])' > m2/x.m4 |
| |
| st=0; $ACLOCAL 2>stderr || st=$? |
| cat stderr >&2 |
| |
| test $st -eq 0 \ |
| && test ! -s stderr \ |
| && $FGREP 'm4_include([m1/x.m4])' aclocal.m4 \ |
| && $FGREP 'm4_include([m2/x.m4])' aclocal.m4 \ |
| && $AUTOCONF \ |
| && not $EGREP 'MY_(FOO|BAR|BAZ)' configure \ |
| && $FGREP '^^my^^bar^^' configure \ |
| && $FGREP '~~my~~baz~~' configure \ |
| || r='not ok' |
| |
| test_end |
| |
| else |
| |
| skip_ -r "autoconf is too old (AC_CONFIG_MACRO_DIRS not defined)" |
| |
| fi |
| |
| : |