dnl Copyright © 2014-2015, 2018-2019, 2021-2024 Nick Bowler dnl dnl License WTFPL2: Do What The Fuck You Want To Public License, version 2. dnl This is free software: you are free to do what the fuck you want to. dnl There is NO WARRANTY, to the extent permitted by law. AT_BANNER([Autoconf macros]) dnl Verify that the DX_BASEDIR macro expands correctly during argument dnl collection. Crucially, the output must not contain any other text. AT_SETUP([DX_BASEDIR during argument collection]) AT_KEYWORDS([DX_BASEDIR macro]) AT_DATA([test.in], [[@TEST@ ]]) TEST_CONFIGURE_AC( [[AC_SUBST([TEST], 'm4@&t@_dquote(DX_BASEDIR)') AC_CONFIG_FILES([test]) ]]) TEST_AUTORECONF TEST_CONFIGURE printf '%s\n' "$srcdir" | sed -e 's:/\./:/:g' -e 's:/\.$::g' \ -e 's:\(.\)//*:\1/:g' >expout AT_CHECK([cat test], [0], [expout]) AT_CLEANUP dnl Verify that DX_BASEDIR is correctly AC_SUBSTed AT_SETUP([DX_BASEDIR output substitution]) AT_KEYWORDS([DX_BASEDIR macro]) AT_DATA([test.in], [[@DX_BASEDIR@ ]]) TEST_CONFIGURE_AC( [[DX_INIT AC_CONFIG_FILES([test]) ]]) TEST_AUTORECONF TEST_CONFIGURE printf '${top_srcdir}/%s\n' "$srcdir" | sed -e 's:/\./:/:g' -e 's:/\.$::g' \ -e 's:\(.\)//*:\1/:g' >expout AT_CHECK([cat test], [0], [expout]) AT_CLEANUP dnl Verify that DX_BASEDIR is set correctly implicitly AT_SETUP([DX_BASEDIR implicit definition]) AT_KEYWORDS([DX_BASEDIR macro]) AT_DATA([test.in], [[@DX_BASEDIR@ ]]) TEST_CONFIGURE_AC( [[DX_EXPORTED_SH AC_CONFIG_FILES([test]) ]]) TEST_AUTORECONF TEST_CONFIGURE AT_CLEANUP AT_SETUP([DX_COMMAND_OUTPUT]) AT_KEYWORDS([DX_COMMAND_OUTPUT macro]) AT_DATA([expout], [[ leading whitespace trailing whitespace @&t@ embedded\ backslashes @&t@ backslash\ newline ]]) TEST_CONFIGURE_AC( [[DX_COMMAND_OUTPUT([var], [cat expout]) AS@&t@_ECHO(["$var"]) >test.out ]]) TEST_AUTORECONF TEST_CONFIGURE AT_CHECK([cat test.out], [0], [expout]) AT_CLEANUP AT_SETUP([DX_DO quoting]) AT_KEYWORDS([DX_DO macro]) TEST_CONFIGURE_AC( [[m4@&t@_define([FOO]) :; { DX_DO([AS@&t@_ECHO_N(["[FOO]"])], [AS@&t@_ECHO_N(["[FOO]"])], [AS@&t@_ECHO(["[FOO]"])]) } >test.out ]]) dnl TEST_CONFIGURE_AC( dnl [[DX_DO([AS@&t@_ECHO_N([hello,world])],[AS@&t@_ECHO_N([goodbye,world])]) dnl ]]) TEST_AUTORECONF TEST_CONFIGURE AT_CHECK([cat test.out], [0], [[FOOFOOFOO ]]) AT_CLEANUP AT_SETUP([DX_LINGUAS unused country variants]) AT_KEYWORDS([DX_LINGUAS macro]) echo : >config.rpath chmod +x config.rpath mkdir po AT_DATA([po/LINGUAS], [[en ]]) AT_DATA([test.in], [[POFILES = @POFILES@ MOFILES = @MOFILES@ ]]) TEST_CONFIGURE_AC( [[m4@&t@_traceoff([AM_GNU_GETTEXT]) AM_GNU_GETTEXT([external]) DX_LINGUAS AC_CONFIG_FILES([test]) ]]) TEST_AUTORECONF LINGUAS='en_CA en'; export LINGUAS; TEST_CONFIGURE AT_CHECK([cat test], [0], [[POFILES = po/en.po MOFILES = po/en.mo ]]) AT_CLEANUP AT_SETUP([DX_LINGUAS default install all]) AT_KEYWORDS([DX_LINGUAS macro]) AS_UNSET([LINGUAS]) AT_SKIP_IF([test ${LINGUAS+y}]) echo : >config.rpath chmod +x config.rpath mkdir po AT_DATA([po/LINGUAS], [[en ja # a comment ko zh ]]) AT_DATA([test.in], [[POFILES = @POFILES@ MOFILES = @MOFILES@ ]]) TEST_CONFIGURE_AC( [[m4@&t@_traceoff([AM_GNU_GETTEXT]) AM_GNU_GETTEXT([external]) DX_LINGUAS AC_CONFIG_FILES([test]) ]]) TEST_AUTORECONF TEST_CONFIGURE AT_CHECK([cat test], [0], [[POFILES = po/en.po po/ja.po po/zh.po MOFILES = po/en.mo po/ja.mo po/zh.mo ]]) AT_CLEANUP AT_SETUP([DX_LINGUAS selections]) AT_KEYWORDS([DX_LINGUAS macro]) echo : >config.rpath chmod +x config.rpath mkdir po AT_DATA([po/LINGUAS], [[en ja # a comment ko zh en_US ]]) AT_DATA([test.in], [[POFILES = @POFILES@ MOFILES = @MOFILES@ ]]) TEST_CONFIGURE_AC( [[m4@&t@_traceoff([AM_GNU_GETTEXT]) AM_GNU_GETTEXT([external]) DX_LINGUAS AC_CONFIG_FILES([test]) ]]) TEST_AUTORECONF LINGUAS='en'; export LINGUAS; TEST_CONFIGURE AT_CHECK([cat test], [0], [[POFILES = po/en.po po/en_US.po po/ja.po po/zh.po MOFILES = po/en.mo ]]) LINGUAS='en_US'; export LINGUAS; TEST_CONFIGURE AT_CHECK([cat test], [0], [[POFILES = po/en.po po/en_US.po po/ja.po po/zh.po MOFILES = po/en.mo po/en_US.mo ]]) LINGUAS='en_CA'; export LINGUAS; TEST_CONFIGURE AT_CHECK([cat test], [0], [[POFILES = po/en.po po/en_US.po po/ja.po po/zh.po MOFILES = po/en.mo ]]) LINGUAS='ja ko'; export LINGUAS; TEST_CONFIGURE AT_CHECK([cat test], [0], [[POFILES = po/en.po po/en_US.po po/ja.po po/zh.po MOFILES = po/ja.mo ]]) LINGUAS='ja_JP ko_KR'; export LINGUAS; TEST_CONFIGURE AT_CHECK([cat test], [0], [[POFILES = po/en.po po/en_US.po po/ja.po po/zh.po MOFILES = po/ja.mo ]]) LINGUAS=''; export LINGUAS; TEST_CONFIGURE AT_CHECK([cat test], [0], [[POFILES = po/en.po po/en_US.po po/ja.po po/zh.po MOFILES = @&t@ ]]) AT_CLEANUP AT_SETUP([DX_LINGUAS with broken "join" utility]) AT_KEYWORDS([DX_LINGUAS macro]) echo : >config.rpath chmod +x config.rpath mkdir bin cat >bin/join <tmp mv -f tmp Makefile.in AT_CHECK([make -s do_test >rebuild.out && sed '/^config.status:/,$!d' rebuild.out], [0], [[config.status: creating Makefile config.status: executing depfiles commands config.status: executing gnulib-symfiles commands d.glsym /// a.o c.o e.o ]]) AT_CLEANUP AT_SETUP([DX_GNULIB_SYMFILES separate srcdir]) AT_KEYWORDS([DX_GNULIB_SYMFILES macro vpath]) TEST_SYMFILES_INIT AT_DATA([symfiles.lst]) TEST_AUTORECONF mkdir build && cd build TEST_CONFIGURE([], [../configure]) AT_CHECK([make -s do_test], [0], [[ /// a.o b.o c.o d.o e.o ]]) cd .. AT_CLEANUP AT_SETUP([DX_GNULIB_SYMFILES shortname]) AT_KEYWORDS([DX_GNULIB_SYMFILES macro]) TEST_SYMFILES_INIT sed '/GNULIB_SYMFILES/c\ [DX_GNULIB_SYMFILES([symfiles.lst], [x])]' configure.ac >configure.tmp sed '/gnulib_objects/s|$| a/b.o a/b/c.o|' Makefile.am >Makefile.tmp mv -f configure.tmp configure.ac mv -f Makefile.tmp Makefile.am AT_DATA([symfiles.lst], [[b.c c.c d.c e.c ]]) TEST_AUTORECONF TEST_CONFIGURE AT_CHECK([make -s do_test], [0], [[b.glsym c.glsym d.glsym e.glsym /// a/b/x-c.o a/x-b.o x-a.o ]]) AT_CLEANUP AT_SETUP([DX_GNULIB_SYMFILES distribution]) AT_KEYWORDS([DX_GNULIB_SYMFILES macro]) TEST_CONFIGURE_AC([[AM_INIT_AUTOMAKE([foreign]) DX_GNULIB_SYMFILES([symfiles.lst]) AC_CONFIG_FILES([Makefile]) ]]) AT_DATA([symfiles.lst]) AT_DATA([Makefile.am], [[foo: ; printf '%s\n' $(top_srcdir) $(DISTFILES) ]]) TEST_AUTORECONF TEST_CONFIGURE AT_CHECK([make -s foo], [0], [stdout]) AT_CHECK([exec 3aclocal.m4 AT_DATA([config.h.in], [[#undef HAVE_FOR_DECLS ]]) TEST_CONFIGURE_AC([m4_ifnblank([$1], [$1]) [AC_CONFIG_HEADERS([config.h]) DX_C_FOR_DECLARATIONS ]]) AT_CHECK([$AUTOCONF], [0], [], [stderr]) AT_DATA([test.c], [[#if __STDC_VERSION__ < 199901 #error nope char nope[-1]; #endif char yup; ]]) AT_CHECK([$CC -c -std=gnu99 test.c || exit 77], [0], [ignore], [ignore]) TEST_CONFIGURE([CC="$CC" CFLAGS="-std=gnu89"]) AT_CHECK([grep HAVE_FOR_DECLS config.h], [0], [[/* #undef HAVE_FOR_DECLS */ ]]) TEST_CONFIGURE([CC="$CC -std=gnu99"]) AT_CHECK([grep HAVE_FOR_DECLS config.h], [0], [[#define HAVE_FOR_DECLS 1 ]])]) AT_SETUP([DX_C_FOR_DECLARATIONS (autoconf-2.70)]) AT_KEYWORDS([DX_C_FOR_DECLARATIONS macro]) TEST_FIND_AUTOCONF([default 2.71 2.72 2.73 2.74], [AS_VERSION_COMPARE(["$acver"], [2.70], [continue], [continue], [])]) TEST_DX_C_FOR_DECLARATIONS AT_CLEANUP m4_define([TEST_DX_C_ALIGNOF], [cat "$srcdir/m4/align.m4" >aclocal.m4 AT_DATA([config.h.in], [[#undef _Alignof #undef _Alignas ]]) TEST_CONFIGURE_AC([m4_ifnblank([$1], [$1]) [AC_CONFIG_HEADERS([config.h]) DX_C_ALIGNOF ]]) AT_CHECK([$AUTOCONF], [0], [], [stderr]) AT_DATA([test.c], [[#if __STDC_VERSION__ < 201112 #error nope char nope[-1]; #endif char yup; ]]) AT_CHECK([$CC -c -std=gnu11 -pedantic-errors test.c || exit 77], [0], [ignore], [ignore]) TEST_CONFIGURE([CC="$CC" CFLAGS="-std=gnu89 -pedantic-errors"]) AT_CHECK([grep _Align config.h], [0], [[#define _Alignof(T) offsetof(struct { char a; T b; }, b) /* #undef _Alignas */ ]]) TEST_CONFIGURE([CC="$CC -std=gnu11"]) AT_CHECK([grep _Align config.h], [0], [[/* #undef _Alignof */ /* #undef _Alignas */ ]])]) AT_SETUP([DX_C_ALIGNOF (autoconf-2.70)]) AT_KEYWORDS([DX_C_ALIGNOF macro]) TEST_FIND_AUTOCONF([default 2.71 2.72 2.73 2.74], [AS_VERSION_COMPARE(["$acver"], [2.70], [continue], [continue], [])]) TEST_DX_C_ALIGNOF([[AC_PROG_CC]]) AT_CLEANUP m4_define([TEST_DX_C_ALIGNAS], [cat "$srcdir/m4/align.m4" >aclocal.m4 AT_DATA([config.h.in], [[#undef _Alignas #undef _Alignof ]]) TEST_CONFIGURE_AC([m4_ifnblank([$1], [$1]) [AC_CONFIG_HEADERS([config.h]) AC_COMPUTE_INT([dummy], [0], [@&t@], [dummy=0]) # ensure main CC probes finish AC_ARG_ENABLE([break-cc], [], [CC=false]) # before we force everything to fail DX_C_ALIGNAS ]]) AT_CHECK([$AUTOCONF], [0], [], [stderr]) AT_DATA([test.c], [[#if __STDC_VERSION__ < 201112 #error nope char nope[-1]; #endif char yup; ]]) AT_CHECK([$CC -c -std=gnu11 -pedantic-errors test.c || exit 77], [0], [ignore], [ignore]) TEST_CONFIGURE([CC="$CC" CFLAGS="-std=gnu89 -pedantic-errors"]) AT_CHECK([grep _Align config.h], [0], [[#define _Alignas(X) __attribute__((__aligned__(X))) /* #undef _Alignof */ ]]) TEST_CONFIGURE([CC="$CC -std=gnu11"]) AT_CHECK([grep _Align config.h], [0], [[/* #undef _Alignas */ /* #undef _Alignof */ ]]) TEST_CONFIGURE([CC="$CC" CFLAGS="-std=gnu89 -pedantic-errors" --enable-break-cc]) AT_CHECK([grep _Align config.h], [0], [[#define _Alignas(X) /**/ /* #undef _Alignof */ ]])]) AT_SETUP([DX_C_ALIGNAS (autoconf-2.70)]) AT_KEYWORDS([DX_C_ALIGNAS macro]) TEST_FIND_AUTOCONF([default 2.71 2.72 2.73 2.74], [AS_VERSION_COMPARE(["$acver"], [2.70], [continue], [continue], [])]) TEST_DX_C_ALIGNAS([[AC_PROG_CC]]) AT_CLEANUP