# -*- Autotest -*- # Copyright 2000, 2001, 2002 (C) 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. AT_BANNER([[Testing config.status.]]) ## ---------------------------------------- ## ## AC_CONFIG_COMMANDS with empty commands. ## ## ---------------------------------------- ## AT_CHECK_MACRO([AC_CONFIG_COMMANDS with empty commands], [[AC_CONFIG_COMMANDS([foo], [], [:]) ]]) ## -------------------------- ## ## Multiple AC_CONFIG_FILES. ## ## -------------------------- ## AT_SETUP([Multiple AC_CONFIG_FILES]) AT_CONFIGURE_AC([[AC_CONFIG_FILES([foo foo])]]) AT_CHECK_AUTOCONF([], 1, [], [ignore]) AT_CLEANUP ## ------------ ## ## AC_ARG_VAR. ## ## ------------ ## # AT_CHECK_AC_ARG_VAR(FIRST-VALUE, SECOND-VALUE) # ---------------------------------------------- # Check that AC_ARG_VAR caches the latest values, diagnoses # inconsistances, and arms config.status. m4_define([AT_CHECK_AC_ARG_VAR], [rm -f config.cache # Initial value. m4_ifval([$1], [precious='$1'; export precious], [unset precious]) AT_CHECK_CONFIGURE([--config-cache]) AT_CHECK([cat file], [], [`$1' ]) # Testing --recheck. unset precious AT_CHECK([./config.status --recheck], [], [ignore]) AT_CHECK([./config.status], [], [ignore]) AT_CHECK([cat file], [], [`$1' ]) # Second value. m4_ifval([$2], [precious='$2'; export precious], [unset precious]) AT_CHECK_CONFIGURE([--config-cache], [1], [], [ignore]) ])# AT_CHECK_AC_ARG_VAR AT_SETUP([AC_ARG_VAR]) # We don't want to run this test if this shell doesn't support # `unset'. AT_CHECK([ if (FOO=FOO; unset FOO) >/dev/null 2>&1; then exit 0 else exit 77 fi ]) AT_DATA([configure.ac], [[AC_INIT AC_ARG_VAR([precious], [this variable costs a lot]) AC_OUTPUT(file) ]]) AT_DATA([file.in], [[`@precious@' ]]) AT_CHECK_AUTOCONF # Set a precious variable AT_CHECK_AC_ARG_VAR([], [apple of my eye]) # Unset a precious variable AT_CHECK_AC_ARG_VAR([apple of my eye], []) # Change a precious variable AT_CHECK_AC_ARG_VAR([apple of my eye], [orange of my eye]) AT_CLEANUP ## ---------------------------------------------- ## ## AC_CONFIG_FILES, HEADERS, LINKS and COMMANDS. ## ## ---------------------------------------------- ## AT_SETUP([AC_CONFIG_FILES, HEADERS, LINKS and COMMANDS]) AT_DATA([configure.ac], [[AC_INIT rm -rf header var-header file var-file link var-link command var-command echo 'OK' >input # Be sure to also stress the associated INIT-CMDS. case $what_to_test in header) AC_CONFIG_HEADERS(header:input);; var-header) AC_CONFIG_HEADERS(var-header:$header_in, [], [header_in=input]);; file) AC_CONFIG_FILES(file:input);; var-file) AC_CONFIG_FILES(var-file:$file_in, [], [file_in=input]);; command) AC_CONFIG_COMMANDS(command:input, [cp input command]);; var-command) AC_CONFIG_COMMANDS(var-command:$command_in, [cp $command_in var-command], [command_in=input]);; link) AC_CONFIG_LINKS(link:input);; var-link) AC_CONFIG_LINKS(var-link:$link_in, [], [link_in=input]);; esac AC_OUTPUT ]]) AT_CHECK_AUTOCONF # AT_CHECK_CONFIG_CREATION(THING = (header | link | file | command)) # ------------------------------------------------------------------ # Check that THING and var-THING (which uses variables in AC_CONFIG_THING) # are properly created, with the right content. # Use `grep OK' instead of a simple `cat' to avoid banners such as in # AC_CONFIG_HEADERS. m4_define([AT_CHECK_CONFIG_CREATION], [AT_CHECK_CONFIGURE([what_to_test=$1]) AT_CHECK([ls header var-header file var-file command var-command link var-link 2>/dev/null], [ignore], [$1 ]) AT_CHECK([grep OK $1], [], [OK ]) AT_CHECK_CONFIGURE([what_to_test=var-$1 --no-create]) # config.status might be stupidly expecting data on stdin, if it's # really broken... AT_CHECK([./config.status var-$1 /dev/null], [ignore], [var-$1 ]) AT_CHECK([grep OK var-$1], [], [OK ]) ])# AT_CHECK_CONFIG_CREATION # Create a file AT_CHECK_CONFIG_CREATION(file) # Create a header AT_CHECK_CONFIG_CREATION(header) # Execute a command AT_CHECK_CONFIG_CREATION(command) # Create a link AT_CHECK_CONFIG_CREATION(link) AT_CLEANUP ## ------------------- ## ## Missing templates. ## ## ------------------- ## # Check that config.status detects missing input files AT_SETUP([Missing templates]) AT_DATA([configure.ac], [[AC_INIT AC_CONFIG_FILES([nonexistent]) AC_OUTPUT ]]) AT_CHECK_AUTOCONF AT_CHECK_CONFIGURE([], [1], [], [[config.status: error: cannot find input file: nonexistent.in ]]) # Make sure that the output file doesn't exist AT_CHECK([test -f nonexistent], 1) AT_CLEANUP ## ---------------------- ## ## configure invocation. ## ## ---------------------- ## # Check that `configure' and `config.status' honor their interface. # # We run `./configure one=val1 --enable-two=val2 --with-three=val3' # and verify that (i) `configure' correctly receives the arguments and # (ii) correctly passes them to `config.status', which we check by # running `config.status --recheck'. AT_SETUP([configure invocation]) AT_DATA([configure.ac], [[AC_INIT echo "result=$one$enable_two$with_three" AC_OUTPUT ]]) AT_CHECK_AUTOCONF AT_CHECK_CONFIGURE([one=one --enable-two=two --with-three=three | sed -n -e 's/^result=//p'], 0, [onetwothree ]) AT_CHECK([./config.status --recheck | sed -n 's/^result=//p'], 0, [onetwothree ]) AT_CHECK_CONFIGURE([one="\"'$ " --enable-two="\" ' $" --with-three=" \"'$"| sed -n -e 's/^result=//p'], 0, ["'$ " ' $ "'$ ]) AT_CHECK([./config.status --recheck | sed -n 's/^result=//p'], 0, ["'$ " ' $ "'$ ]) AT_CLEANUP ## -------------------------------------------- ## ## Check that `#define' templates are honored. ## ## -------------------------------------------- ## # Use various forms of `#define' templates, and make sure there are no # problems when a symbol is prefix of another. AT_SETUP([#define header templates]) AT_DATA([configure.ac], [[AC_INIT AC_CONFIG_HEADERS(config.h:config.hin) # I18n of dummy variables: their French translations. AC_DEFINE(foo, toto) AC_DEFINE(bar, tata) AC_DEFINE(baz, titi) AC_DEFINE(fubar, tutu) # Symbols which are prefixes of another. AC_DEFINE(a, A) AC_DEFINE(aaa, AAA) AC_DEFINE(aa, AA) AC_CONFIG_FILES(defs) # Things included in confdefs.h, but which make no sense in # config.h, nor in $DEFS. cat <<\EOF >>confdefs.h /* Hi Mum! Look, I'm doing C++! */ #ifdef __cplusplus void exit (int status); #endif EOF # In addition of config.h output a full DEFS AC_OUTPUT_MAKE_DEFS DEFS_SAVED=$DEFS AC_SUBST(DEFS_SAVED) AC_OUTPUT ]]) AT_DATA([defs.in], [[@DEFS_SAVED@ ]]) AT_DATA([config.hin], [[#define foo 0 # define bar bar # define baz "Archimedes was sinking in his baz" # define fubar tutu #define a B #define aa BB #define aaa BBB #undef a #undef aa #undef aaa ]]) AT_CHECK_AUTOCONF AT_CHECK_CONFIGURE AT_DATA([expout], [[/* config.h. Generated by configure. */ #define foo toto # define bar tata # define baz titi # define fubar tutu #define a A #define aa AA #define aaa AAA #define a A #define aa AA #define aaa AAA ]]) AT_CHECK([cat config.h], 0, expout) # Check the value of DEFS. AT_DATA([expout], [[-DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -Dfoo=toto -Dbar=tata -Dbaz=titi -Dfubar=tutu -Da=A -Daaa=AAA -Daa=AA ]]) # Because we strip trailing spaces in `testsuite' we can't leave one in # expout, hence nuke the one left by AC_OUTPUT_MAKE_DEFS. AT_CHECK([sed -e 's/ $//' defs], 0, expout) AT_CLEANUP ## ------------------------- ## ## Torturing config.status. ## ## ------------------------- ## ## Require 100 AC_DEFINE and AC_SUBST with a significantly big value. ## This is mostly to check that Autoconf produces portable sed scripts ## in config.status. sed is used to skip the first two lines ## `Generated by...'. # We use m4_for many times. m4_pattern_allow([^m4_for$]) AT_SETUP([Torturing config.status]) dnl The value used as a big value for AC_DEFINE. dnl Don't use sh active chars here, below it is also used in a sh dnl assignment. m4_define([AT_BIG_VALUE], [This value should be long enough to torture the various limits of sed and other tools used by Autoconf.]) m4_define([AT_DESCRIPTION], [Define to a long string if your `Autoconf' works properly.]) # AT_DUMMY_VAR(NUMBER) # -------------------- # Build a name used for AC_SUBST and AC_DEFINE. Put ac_ in it # so that the check for user name space invasion does not complain # of the new variables defined. # # Note that you should not use the name ac_dummy, because it will be # turned into ac_uummy during the construction of config.status. Yes, # this is admittedly a bug, but it would be too hard to fix this. # There is really no point in AC_DEFINE a var named ac_d.*. m4_pattern_allow([^m4_bpatsubst$]) m4_define([AT_DUMMY_VAR], [ac_Dummy_[]m4_bpatsubst([000$1], [.*\(...\)$], [\1])]) AT_DATA([dummy.in], [m4_for([AT_Count], 1, 100, 1, [@AT_DUMMY_VAR(AT_Count)@ ])]) # ------------ # # configure.ac # # ------------ # m4_pattern_allow([^m4_(define|defun)$]) AT_DATA([configure.ac], dnl The following lines transfer AT_DUMMY_VAR, AT_DESCRIPTION, and dnl AT_BIG_VALUE into the configure.ac as AC_DUMMY_VAR etc. [[m4_define([AC_DUMMY_VAR],] m4_dquote(m4_defn([AT_DUMMY_VAR]))[)]] [[m4_define([AC_DESCRIPTION],] m4_dquote(m4_defn([AT_DESCRIPTION]))[)]] [[m4_define([AC_BIG_VALUE],] m4_dquote(m4_defn([AT_BIG_VALUE]))[)]] [[# AC_DEFUBST(NAME) # ---------------- # Related VALUE to NAME both with AC_SUBST and AC_DEFINE. This is # used in the torture tests. m4_defun([AC_DEFUBST], [AC_DUMMY_VAR($1)="AC_BIG_VALUE" AC_DEFINE_UNQUOTED(AC_DUMMY_VAR($1), "$AC_DUMMY_VAR($1)", AC_DESCRIPTION) AC_SUBST(AC_DUMMY_VAR($1))]) AC_INIT AC_CONFIG_HEADERS(config.h:config.hin) AC_CONFIG_FILES(dummy) m4_for(AC_Count, 1, 100, 1, [AC_DEFUBST(AC_Count)]) AC_OUTPUT ]])# configure.ac AT_CHECK_AUTOCONF AT_CHECK_AUTOHEADER AT_CHECK_CONFIGURE # Checking that AC_DEFINE worked properly. AT_DATA([expout], [/* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "" /* Define to the full name of this package. */ #define PACKAGE_NAME "" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "" /* Define to the version of this package. */ #define PACKAGE_VERSION "" m4_for(AT_Count, 1, 100, 1, [ /* AT_DESCRIPTION */ [#define] AT_DUMMY_VAR(AT_Count) "AT_BIG_VALUE" ])]) AT_CHECK([sed -n '4,$ p' config.h], 0, expout) # Checking that AC_SUBST worked properly. AT_DATA([expout], [m4_for(AT_Count, 1, 100, 1, [AT_BIG_VALUE ])]) AT_CLEANUP ## -------- ## ## srcdir. ## ## -------- ## AT_SETUP([srcdir]) rm -rf at-dir mkdir at-dir : >at-dir/bar.in : >foo.in AT_DATA([configure.ac], [[AC_INIT AC_CONFIG_FILES([foo at-dir/bar]) AC_CONFIG_COMMANDS([report], [test -f $srcdir/configure.ac || AC_MSG_ERROR([cannot find $srcdir/configure.ac])], [srcdir=$srcdir]) AC_OUTPUT rm -rf foo at-dir/bar ]]) AT_CHECK_AUTOCONF # In place. AT_CHECK([./configure], [], [ignore]) # Relative path. AT_CHECK([cd at-dir && ../configure], [], [ignore]) # Absolute path. at_here=`pwd` AT_CHECK([cd at-dir && $at_here/configure], [], [ignore]) AT_CLEANUP ## ----------------- ## ## Signal handling. ## ## ----------------- ## AT_SETUP([Signal handling]) AT_DATA([configure.ac], [[AC_INIT kill -2 $$ exit 77 ]]) AT_CHECK_AUTOCONF AT_CHECK_CONFIGURE([], 1, ignore, ignore) AT_CLEANUP ## ---------------------------- ## ## Configuring subdirectories. ## ## ---------------------------- ## # . # |-- builddir # | |-- config.log # | |-- config.status # | `-- inner # | |-- config.log # | |-- config.status # | `-- innermost # | `-- config # |-- configure # |-- configure.ac # |-- inner # | |-- configure # | |-- configure.ac # | `-- innermost # | `-- config.in # `-- install-sh # AT_SETUP([Configuring subdirectories]) AT_KEYWORDS(autoreconf) # We use aclocal (via autoreconf). AT_CHECK([aclocal --version || exit 77], [], [ignore], [ignore]) # Move into a fresh testSubDir. But Autotest is not ready for such # tricks, albeit most useful :( It expects to find its files # (at-setup-line and so on) in the original `.', and it will complain # not to find even one. So just run mkdir as if it were a test. This # will create at-setup-line blah blah, and Autotest will leave us in # peace. # # FIXME: The more I think about it, the more I am tempted to *always* # have test groups run in a subdir, a` la Automake. AT_CHECK([AS_MKDIR_P([testSubDir])]) cd testSubDir # The contents of `inner/', and `inner/innermost/'. AS_MKDIR_P([inner/innermost]) # We have to use configure.in, not configure.ac, if we still want to # be compatible with Automake 1.4: aclocal (run by autoreconf) would # die because it can't find configure.in. AT_DATA([inner/configure.in], [AC_INIT(GNU Inner, 1.0) AC_CONFIG_SRCDIR([innermost/config.in]) AC_ARG_VAR([INNER], [an inner variable]) AC_SUBST([INNER], "inner") AC_CONFIG_FILES([innermost/config]) AC_OUTPUT ]) AT_DATA([inner/innermost/config.in], [INNER=@INNER@ srcdir=@srcdir@ top_srcdir=@top_srcdir@ ]) # The contents of `.' AT_DATA([install-sh], []) # nonexistent is allowed not to exist. AT_DATA([configure.in], [AC_INIT(GNU Outer, 1.0) AC_ARG_VAR([OUTER], [an outer variable]) if false; then AC_CONFIG_SUBDIRS([nonexistent]) fi AC_CONFIG_SUBDIRS([inner]) AC_OUTPUT ]) AT_CHECK([autoreconf]) AT_CHECK([test -f inner/configure]) # Running the outer configure recursively should provide the innermost # help strings. AT_CHECK([./configure --help=recursive | grep INNER], 0, [ignore]) # Running the outer configure should trigger the inner. AT_CHECK_CONFIGURE AT_CHECK([cat inner/innermost/config], 0, [INNER=inner srcdir=. top_srcdir=.. ]) # The same, but from a builddir. AS_MKDIR_P([builddir]) AT_CHECK([cd builddir && ../configure], 0, [ignore]) AT_CHECK([cat builddir/inner/innermost/config], 0, [INNER=inner srcdir=../../../inner/innermost top_srcdir=../../../inner ]) AT_CLEANUP