]> git.draconx.ca Git - dxcommon.git/commitdiff
DX_C_ALIGNAS: Work around bash-5 parsing bug. master
authorNick Bowler <nbowler@draconx.ca>
Thu, 11 Apr 2024 00:57:36 +0000 (20:57 -0400)
committerNick Bowler <nbowler@draconx.ca>
Thu, 11 Apr 2024 00:57:36 +0000 (20:57 -0400)
Apparently bash-5 and later versions fail to parse for loops with
a newline before the 'in' keyword, if that loop itself is in a case.
statement.

Previous versions of bash have no such problem, nor does any other
shell I've tried, but the workaround is simple enough.

m4/align.m4
m4/base.m4
m4/lt-patches.m4 [new file with mode: 0644]

index 03e18a81028a52451cbce2e69577e22f68513690..a69e640d94fdd345df22a38eca9104884ab6f5a7 100644 (file)
@@ -8,10 +8,14 @@
 #
 # Probe whether the C compiler understands _Alignof(T).
 #
+# Some implementations (e.g., FreeBSD 9) define a usable _Alignof macro
+# in <stddef.h> (and other headers), so we can use that if available.
+#
 # If not supported, _Alignof(T) is defined as a function-like macro which
 # uses offsetof to guess the alignment of T, which must be a type such that
-# T x; is a valid declaration of x as an object of type T.  It is therefore
-# necessary that the caller includes <stddef.h> before using _Alignof.
+# T x; is a valid declaration of x as an object of type T.
+#
+# For these reasons, callers should #include <stddef.h> before using _Alignof.
 #
 # We skip the test if Autoconf has previously determined that the C compiler
 # supports C11 or a newer standard, since the C11 test program checks this.
@@ -22,7 +26,8 @@ AC_DEFUN([DX_C_ALIGNOF],
 [AS_CASE([${ac_cv_prog_cc_c11-no}/${ac_prog_cc_stdc-no}],
   [no/no|*/c89|*/c99],
     [AC_CACHE_CHECK([if $CC supports _Alignof], [dx_cv_have_alignof],
-      [AC_COMPUTE_INT([_dx_tmp], [_Alignof(char)], [@&t@], [_dx_tmp=0])
+      [AC_COMPUTE_INT([_dx_tmp], [_Alignof(char)], [#include <stddef.h>
+], [_dx_tmp=0])
 AS_CASE([$_dx_tmp], [1], [dx_cv_have_alignof=yes], [dx_cv_have_alignof=no])])],
   [dx_cv_have_alignof=yes])
 AS_CASE([$dx_cv_have_alignof], [no], [AC_DEFINE([_Alignof(T)],
@@ -33,6 +38,10 @@ AS_CASE([$dx_cv_have_alignof], [no], [AC_DEFINE([_Alignof(T)],
 #
 # Probe whether the C compiler understands _Alignas(X).
 #
+# Some implementations (e.g., FreeBSD 9) define a usable _Alignas macro
+# in <stddef.h> (and other headers), so we can use that if available.  For
+# this reason, callers should #include <stddef.h> before using _Alignas.
+#
 # If not supported, but the compiler supports the GNU __attribute__ or
 # Microsoft __declspec methods to set alignment, _Alignas(X) is defined
 # as a function-like macro which expands to such syntax.  These only
@@ -50,12 +59,13 @@ AC_DEFUN([DX_C_ALIGNAS],
   [no/no|*/c89|*/c99],
     [AC_CACHE_CHECK([if $CC supports _Alignas], [dx_cv_have_alignas],
 [dx_cv_have_alignas=no
-for _dx_alignas
+for _dx_alignas dnl Eat newline to work around bash-5 parsing bug.
 in '_Alignas(X)' '__attribute__((__aligned__(X)))' '__declspec(align(X))'
 do
 AC_COMPUTE_INT([_dx_tmp],
   [sizeof (struct { char a; char ALIGNAS_TEST(4) b; }) >= 8],
-  [#define ALIGNAS_TEST(X) $_dx_alignas
+  [#include <stddef.h>
+#define ALIGNAS_TEST(X) $_dx_alignas
 ],[_dx_tmp=0])
 AS_CASE([$_dx_tmp/$_dx_alignas],
   [1/_Alignas*], [dx_cv_have_alignas=yes; break],
index c14ba68d21fcdf15ffb74e930ee8e0d51680e087..4dc0d146520ddc86b1ddf8c2f354b8da39eb007a 100644 (file)
@@ -1,10 +1,10 @@
-dnl Copyright © 2012, 2014, 2021, 2023 Nick Bowler
-dnl
-dnl Basic macros for dxcommon.
-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.
+# Copyright © 2012, 2014, 2021, 2023-2024 Nick Bowler
+#
+# Basic macros for dxcommon.
+#
+# License WTFPL2: Do What The Fuck You Want To Public License, version 2.
+# This is free software: you are free to do what the fuck you want to.
+# There is NO WARRANTY, to the extent permitted by law.
 
 AC_PREREQ([2.64])
 
@@ -68,14 +68,20 @@ dnl
 dnl This macro expands to the dxcommon base directory, as a quoted string.
 AC_DEFUN([DX_BASEDIR], [m4_ignore(DX_INIT())m4_defn([_DX_BASEDIR])])
 
-dnl DX_RUN_LOG(command)
-dnl
-dnl Run a command, logging all of the command, its output, and overall
-dnl exit status to config.log.  The expansion of this macro is a single
-dnl complex shell command suitable for use in shell conditionals.
-AC_DEFUN([DX_RUN_LOG], [{ (set -x; $1;) >&AS_MESSAGE_LOG_FD 2>&1
-  dx_status=$?; AS_ECHO(["\$? = $dx_status"]) >&AS_MESSAGE_LOG_FD 2>&1
-  test $dx_status = 0; }])
+# DX_RUN_LOG(command)
+#
+# Run a command, logging all of the command, its output, and overall
+# exit status to config.log.  The expansion of this macro is a single
+# complex shell command suitable for use in shell conditionals.
+AC_DEFUN([DX_RUN_LOG],
+[{ _dx_shopt=$-
+( set -x
+$1
+) >&AS_MESSAGE_LOG_FD 2>&1
+_dx_status=$?
+test x"$-" = x"$_dx_shopt" || set +x # work around DJGPP subshell bug
+AS_ECHO(["\$? = $_dx_status"]) >&AS_MESSAGE_LOG_FD
+test $_dx_status = 0; } 2>/dev/null])
 
 # DX_PATCH_MACRO([macro-name], [regexp], [replacement])
 #
diff --git a/m4/lt-patches.m4 b/m4/lt-patches.m4
new file mode 100644 (file)
index 0000000..735633f
--- /dev/null
@@ -0,0 +1,36 @@
+# Copyright © 2024 Nick Bowler
+#
+# Monkey patches for libtool.
+#
+# License WTFPL2: Do What The Fuck You Want To Public License, version 2.
+# This is free software: you are free to do what the fuck you want to.
+# There is NO WARRANTY, to the extent permitted by law.
+
+# DX_PATCH_LIBTOOL
+#
+# Apply all the patches described below.  Should be expanded before LT_INIT.
+AC_DEFUN([DX_PATCH_LIBTOOL],
+[AC_BEFORE([$0], [LT_INIT])dnl
+m4_foreach_w([patch], m4_defn([_DX_LT_PATCHES]),
+  [m4_indir([_DX_LT_PATCH(]m4_defn([patch])[)])])])
+
+m4_define([_DX_LT_PATCHES])
+m4_define([_DX_LT_PATCH],
+  [m4_define([_DX_LT_PATCH($1)], [$2])m4_define([_DX_LT_PATCHES],
+    m4_defn([_DX_LT_PATCHES])[ $1])])
+
+# Avoid "const" on VAX C for libtool's dynamic symbol bits, like with OSF and
+# Windows platforms, as there seem to be some problems with relocations of
+# function pointer values in readonly memory.
+#
+# We patch it in ltmain.sh (via config.status) and in configure directly.
+# This code is also duplicated in libltdl so further fixes might be needed
+# for packages using bindled libltdl (not done here... yet?).
+_DX_LT_PATCH([ltmain-sh-vax-c],
+  [DX_PATCH_MACRO([_LT_CONFIG], [^\( *\)[$]SED '[$]q' "[$]ltmain"],
+  [\1# Use this opportunity also to work around a VAX C bug in upstream libtool
+\1$SED 's/^# *elif.*__osf__$/& || (defined vaxc \\&\\& defined VAXC)/' "$ltmain"])])
+
+_DX_LT_PATCH([libtool-m4-vax-c],
+  [DX_PATCH_MACRO([_LT_CMD_GLOBAL_SYMBOLS], [^# *elif.*__osf__$],
+    [\& || (defined vaxc && defined VAXC)])])