# -*- autoconf -*- AT_BANNER([[Testing config.status. ## ---------------------------------------------------------------- ## ## This section of torture tests is trying to make Autoconf produce ## ## failing `configure' scripts, which must never happen. If one of ## ## these tests ever fails, it is extremely important that you ## ## report the failure to bug-autoconf@gnu.org. ## ## ---------------------------------------------------------------- ##]]) ## ---------------------------------------------- ## ## 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 file link command touch header.in file.in link.in command.in case $what_to_test in header) AC_CONFIG_HEADERS(header:header.in);; file) AC_CONFIG_FILES(file:file.in);; command) AC_CONFIG_COMMANDS(command:command.in, [cp command.in command]);; link) AC_CONFIG_LINKS(link:link.in);; esac AC_OUTPUT ]]) AT_CHECK_AUTOCONF # Create a header AT_CHECK_CONFIGURE([what_to_test=header]) AT_CHECK([ls header file command link], [ignore], [header ], [ignore]) # Create a file AT_CHECK_CONFIGURE([what_to_test=file]) AT_CHECK([ls header file command link], [ignore], [file ], [ignore]) # Execute a command AT_CHECK_CONFIGURE([what_to_test=command]) AT_CHECK([ls header file command link], [ignore], [command ], [ignore]) # Create a link AT_CHECK_CONFIGURE([what_to_test=link]) AT_CHECK([ls header file command link], [ignore], [link ], [ignore]) AT_CLEANUP(header file link command header.in file.in link.in command.in) ## ------------------- ## ## 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(configure config.status config.log config.cache) ## -------------------------------------------- ## ## 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 automatically 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. Note the leading space. AT_DATA([expout], [[-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...'. 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_define([AT_DUMMY_VAR], [ac_Dummy_[]m4_patsubst([000$1], [.*\(...\)$], [\1])]) AT_DATA([dummy.in], [m4_for([AT_Count], 1, 100, 1, [@AT_DUMMY_VAR(AT_Count)@ ])]) # ------------ # # configure.ac # # ------------ # 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, [m4_for(AT_Count, 1, 100, 1, [ /* AT_DESCRIPTION */ [#define] AT_DUMMY_VAR(AT_Count) "AT_BIG_VALUE" ])]) AT_CHECK([sed -n '3,$ 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(dummy) ## -------- ## ## 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(at-dir foo.in foo)