]> git.draconx.ca Git - dxcommon.git/blobdiff - tests/macros.at
Add configure tests for C11-ish _Alignof and _Alignas.
[dxcommon.git] / tests / macros.at
index f746e54522ae8e849d0fab932ff6b044dc1eddf5..6da14b3867dbd325273d1f1632fa0ab82f22f36b 100644 (file)
@@ -1,4 +1,4 @@
-dnl Copyright © 2014-2015, 2018-2019, 2021 Nick Bowler
+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.
@@ -236,6 +236,56 @@ 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 <<EOF
+#!/bin/sh
+:
+EOF
+chmod +x bin/join
+
+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
+
+save_PATH=$PATH
+PATH=`pwd`/bin${PATH:+":$PATH"}
+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_US'; export LINGUAS; TEST_CONFIGURE([JOIN=false])
+
+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
+]])
+
+PATH=$save_PATH
+
+AT_CLEANUP
+
 AT_SETUP([DX_BASENAME])
 AT_KEYWORDS([DX_BASENAME macro])
 
@@ -266,3 +316,471 @@ hello world
 ])
 
 AT_CLEANUP
+
+AT_SETUP([DX_PROG_JOIN distribution])
+AT_KEYWORDS([DX_PROG_JOIN macro])
+
+TEST_CONFIGURE_AC([[AM_INIT_AUTOMAKE([foreign])
+DX_PROG_JOIN
+AC_CONFIG_FILES([Makefile])
+]])
+
+AT_DATA([Makefile.am],
+[[foo: ; printf '%s\n' $(DX_BASEDIR) $(DISTFILES)
+]])
+TEST_AUTORECONF
+
+TEST_CONFIGURE
+AT_CHECK([make -s foo], [0], [stdout])
+AT_CHECK([exec 3<stdout
+read basedir <&3; while read f <&3; do
+  test x"$f" = x"$basedir/scripts/join.awk" && exit
+done
+exit 1])
+
+AT_CLEANUP
+
+m4_define([TEST_SYMFILES_INIT],
+[TEST_CONFIGURE_AC([[AM_INIT_AUTOMAKE([foreign])
+AM_PROG_CC_C_O
+AC_SUBST([GLSRC], [.])
+DX_AUTOMAKE_COMPAT
+DX_GNULIB_SYMFILES([symfiles.lst])
+AC_CONFIG_FILES([Makefile])
+]])
+
+cp "$srcdir/snippet/glconfig.mk" .
+AT_DATA([Makefile.am],
+[[CLEANFILES =
+DISTCLEANFILES =
+
+# automake won't emit this without sources but we expect it to be set
+am__depfiles_maybe = depfiles
+am__maybe_remake_depfiles = depfiles
+
+gnulib_headers =
+gnulib_objects = a.o c.o b.o e.o d.o
+gnulib_all_symfiles = $(gnulib_objects:.o=.glsym)
+gnulib_symfiles = $(gnulib_all_symfiles)
+
+do_test:
+       printf '%s\n' $(gnulib_symfiles) | LC_ALL=C sort; \
+         echo ///; printf '%s\n' $(gnulib_extra_objects) | LC_ALL=C sort
+.PHONY: do_test
+
+include $(top_srcdir)/glconfig.mk
+]])])
+
+AT_SETUP([DX_GNULIB_SYMFILES])
+AT_KEYWORDS([DX_GNULIB_SYMFILES macro])
+
+TEST_SYMFILES_INIT
+AT_DATA([symfiles.lst],
+[[b.foo
+d.bar
+]])
+TEST_AUTORECONF
+
+TEST_CONFIGURE
+AT_CHECK([make -s do_test], [0], [[b.glsym
+d.glsym
+///
+a.o
+c.o
+e.o
+]])
+
+dnl verify rebuild rule insertion
+sed '/^gnulib_objects/s/b[[.]]o//' Makefile.in >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 3<stdout
+read basedir <&3; while read f <&3; do
+  test x"$f" = x"$basedir/symfiles.lst" && exit
+done
+exit 1])
+
+AT_CLEANUP
+
+AT_SETUP([DX_EXPORTED_SH])
+AT_KEYWORDS([DX_EXPORTED_SH exported.sh macro])
+
+AT_DATA([helpopt.nm],
+[[0000000000000000 r .LC0
+000000000000001e r .LC1
+0000000000000025 r .LC2
+                 U __errno_location
+                 U __printf_chk
+                 U __stack_chk_fail
+0000000000000000 T arg_to_int
+0000000000000000 b dummy.0
+                 U help_print_optstring
+0000000000000000 T main
+00000000000000c0 T print_opt
+                 U strchr
+                 U strerror
+                 U strtol
+                 U tap_bail_out
+]])
+
+AT_DATA([helpopt-shared.lo],
+[[pic_object=helpopt.nm
+non_pic_object=none
+]])
+
+AT_DATA([helpopt-static.lo],
+[[non_pic_object=helpopt.nm
+pic_object=none
+]])
+
+AT_DATA([helpopt.lo],
+[[non_pic_object=helpopt.nm
+pic_object=helpopt.nm
+]])
+
+AT_DATA([expout],
+[[arg_to_int
+main
+print_opt
+]])
+
+TEST_CONFIGURE_AC([[AC_PROVIDE([LT_INIT])
+AC_SUBST([NM], [cat])
+lt_cv_sys_global_symbol_pipe="sed -n -e '/ T /p'"
+DX_EXPORTED_SH
+]])
+TEST_AUTORECONF
+TEST_CONFIGURE
+
+AT_CHECK([$SHELL exported.sh helpopt.nm], [0], [expout])
+AT_CHECK([$SHELL exported.sh helpopt-shared.lo], [0], [expout])
+AT_CHECK([$SHELL exported.sh helpopt-static.lo], [0], [expout])
+AT_CHECK([$SHELL exported.sh helpopt.lo], [0], [expout])
+AT_CHECK([$SHELL exported.sh nonexistent], [1], [], [ignore])
+
+AT_CLEANUP
+
+AT_SETUP([DX_W32_GUI])
+
+AT_DATA([test.in], [[@dx_cv_w32_gui@
+@dx_cv_w32_gui_flags@
+]])
+
+TEST_CONFIGURE_AC([[DX_W32_GUI
+AC_SUBST([dx_cv_w32_gui])
+AC_SUBST([dx_cv_w32_gui_flags])
+AC_CONFIG_FILES([test])
+]])
+TEST_AUTORECONF
+
+myconf="cross_compiling=yes --host=none CC=$srcdir/t/ccw32.sh"
+
+TEST_CONFIGURE([TEST_SUBSYS=2 TEST_GUI_FLAG=-mwindows $myconf])
+AT_CHECK([cat test], [0], [none needed
+
+])
+
+TEST_CONFIGURE([TEST_SUBSYS=3 TEST_GUI_FLAG=-mwindows $myconf])
+AT_CHECK([cat test], [0], [-mwindows
+-mwindows
+])
+
+TEST_CONFIGURE([TEST_SUBSYS=4 TEST_GUI_FLAG=xxx $myconf])
+AT_CHECK([cat test], [0], [unknown
+
+])
+
+AT_CLEANUP
+
+AT_SETUP([DX_W32_GUI distribution])
+AT_KEYWORDS([DX_W32_GUI macro])
+
+TEST_CONFIGURE_AC([[AM_INIT_AUTOMAKE([foreign])
+DX_W32_GUI
+AC_CONFIG_FILES([Makefile])
+]])
+
+AT_DATA([Makefile.am],
+[[foo: ; printf '%s\n' $(DX_BASEDIR) $(DISTFILES)
+]])
+TEST_AUTORECONF
+
+TEST_CONFIGURE
+AT_CHECK([make -s foo], [0], [stdout])
+AT_CHECK([exec 3<stdout
+read basedir <&3; while read f <&3; do
+  test x"$f" = x"$basedir/scripts/pe-subsys.awk" && exit
+done
+exit 1])
+
+AT_CLEANUP
+
+# TEST_FIND_AUTOCONF_VER([to-check], [test-action])
+#
+# For each whitespace-separated version token in to-check, check if we can
+# run program autoconf-VER.  The special token 'default' also checks the
+# unversioned autoconf (or, if set in the environment, $AUTOCONF).
+#
+# Then test-action is expanded such that the shell variable $ac refers
+# to the autoconf program, and $acver is the actual version reported by
+# $ac --version. The action should do nothing if the version is acceptable,
+# or "continue" if the version is unacceptable.
+#
+# If an acceptable version is found, the AUTOCONF environment variable is
+# set accordingly.  Otherwise, the test group is skipped.
+m4_define([TEST_FIND_AUTOCONF],
+[have_ac=false
+for ac in $1; do
+  AS_CASE([$ac], [default], [ac=${AUTOCONF-autoconf}], [ac=autoconf-$ac])
+  acver=`$ac --version | sed -n '1s/.* //p'`
+  set x $acver; test x"$[#]" = x"2" || continue
+  $2
+  have_ac=:; break
+done
+AT_CHECK([$have_ac || exit 77])
+AUTOCONF=$ac; export AUTOCONF
+AT_CHECK([$AUTOCONF --version], [0], [ignore])
+])
+
+m4_define([TEST_DX_C_FOR_DECLARATIONS],
+[cat "$srcdir/m4/fordecl.m4" >aclocal.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.69 2.68],
+  [AS_VERSION_COMPARE(["$acver"], [2.70], [], [continue], [continue])])
+TEST_DX_C_FOR_DECLARATIONS([[AC_PROG_CC]])
+TEST_DX_C_FOR_DECLARATIONS([[AC_PROG_CC_C99]])
+AT_CLEANUP
+
+AT_SETUP([DX_C_FOR_DECLARATIONS (=autoconf-2.70)])
+AT_KEYWORDS([DX_C_FOR_DECLARATIONS macro])
+TEST_FIND_AUTOCONF([default 2.70],
+  [AS_VERSION_COMPARE(["$acver"], [2.70], [continue], [], [continue])])
+TEST_DX_C_FOR_DECLARATIONS
+AT_CLEANUP
+
+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.69 2.68],
+  [AS_VERSION_COMPARE(["$acver"], [2.70], [], [continue], [continue])])
+TEST_DX_C_FOR_DECLARATIONS([[AC_PROG_CC]])
+AT_CLEANUP
+
+AT_SETUP([DX_C_ALIGNOF (=autoconf-2.70)])
+AT_KEYWORDS([DX_C_ALIGNOF macro])
+TEST_FIND_AUTOCONF([default 2.70],
+  [AS_VERSION_COMPARE(["$acver"], [2.70], [continue], [], [continue])])
+TEST_DX_C_ALIGNOF
+AT_CLEANUP
+
+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.69 2.68],
+  [AS_VERSION_COMPARE(["$acver"], [2.70], [], [continue], [continue])])
+TEST_DX_C_ALIGNAS([[AC_PROG_CC]])
+AT_CLEANUP
+
+AT_SETUP([DX_C_ALIGNAS (=autoconf-2.70)])
+AT_KEYWORDS([DX_C_ALIGNAS macro])
+TEST_FIND_AUTOCONF([default 2.70],
+  [AS_VERSION_COMPARE(["$acver"], [2.70], [continue], [], [continue])])
+TEST_DX_C_ALIGNAS
+AT_CLEANUP
+
+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