Commit f41d6c12aacabc3dae5fdd45c50de6a967af8a88

Guillem Jover 2023-05-26T23:55:40

build: Refactor GNU .init_array support check into a new m4 function

diff --git a/configure.ac b/configure.ac
index 40d25b9..8ff2bef 100644
--- a/configure.ac
+++ b/configure.ac
@@ -184,49 +184,7 @@ AC_CHECK_DECLS([environ], [], [], [[
 #include <unistd.h>
 ]])
 
-AC_CACHE_CHECK([for GNU .init_array section support],
-  [libbsd_cv_gnu_init_array_support], [
-  AC_RUN_IFELSE([
-    AC_LANG_SOURCE([[
-static int rc = 1;
-static void init(int argc) { if (argc == 1) rc = 0; }
-void (*init_func)(int argc) __attribute__((__section__(".init_array"), __used__)) = init;
-int main() { return rc; }
-    ]])
-  ], [
-    libbsd_cv_gnu_init_array_support=yes
-  ], [
-    libbsd_cv_gnu_init_array_support=no
-  ], [
-    AC_PREPROC_IFELSE([
-      AC_LANG_SOURCE([[
-/* Look for a known libc that supports .init_array with the GNU extension
- * to pass main() arguments to the init functions. */
-#include <stdlib.h>
-#if defined __GLIBC_PREREQ
-#  if __GLIBC_PREREQ(2, 4)
-/* glibc supports GNU .init_array since 2.4. */
-#  else
-#    error glibc does not support GNU .init_array
-#  endif
-#else
-/*
- * Basic SysV ABI .init_array support, init functions do not get arguments:
- * - Bionic since its inception.
- * - uClibc since 0.9.29.
- */
-#  error unknown whether libc supports GNU .init_array
-#endif
-      ]])
-    ], [
-      libbsd_cv_gnu_init_array_support=yes
-    ], [
-      libbsd_cv_gnu_init_array_support=no
-    ])
-  ])
-])
-AM_CONDITIONAL([BUILD_LIBBSD_CTOR],
-  [test "$libbsd_cv_gnu_init_array_support" = yes])
+LIBBSD_HAS_GNU_INIT_ARRAY
 
 # Checks for library functions.
 AC_MSG_CHECKING([for program_invocation_short_name])
diff --git a/m4/libbsd-compiler.m4 b/m4/libbsd-compiler.m4
index b655b83..dd8fbeb 100644
--- a/m4/libbsd-compiler.m4
+++ b/m4/libbsd-compiler.m4
@@ -22,3 +22,51 @@ AC_DEFUN([LIBBSD_CHECK_COMPILER_FLAG], [
   ])
   AS_VAR_POPDEF([libbsd_varname_cache])
 ])
+
+# LIBBSD_HAS_GNU_INIT_ARRAY
+# -------------------------
+AC_DEFUN([LIBBSD_HAS_GNU_INIT_ARRAY], [
+  AC_CACHE_CHECK([for GNU .init_array section support],
+    [libbsd_cv_gnu_init_array_support], [
+    AC_RUN_IFELSE([
+      AC_LANG_SOURCE([[
+static int rc = 1;
+static void init(int argc) { if (argc == 1) rc = 0; }
+void (*init_func)(int argc) __attribute__((__section__(".init_array"), __used__)) = init;
+int main() { return rc; }
+      ]])
+    ], [
+      libbsd_cv_gnu_init_array_support=yes
+    ], [
+      libbsd_cv_gnu_init_array_support=no
+    ], [
+      AC_PREPROC_IFELSE([
+        AC_LANG_SOURCE([[
+/* Look for a known libc that supports .init_array with the GNU extension
+ * to pass main() arguments to the init functions. */
+#include <stdlib.h>
+#if defined __GLIBC_PREREQ
+#  if __GLIBC_PREREQ(2, 4)
+/* glibc supports GNU .init_array since 2.4. */
+#  else
+#    error glibc does not support GNU .init_array
+#  endif
+#else
+/*
+ * Basic SysV ABI .init_array support, init functions do not get arguments:
+ * - Bionic since its inception.
+ * - uClibc since 0.9.29.
+ */
+#  error unknown whether libc supports GNU .init_array
+#endif
+        ]])
+      ], [
+        libbsd_cv_gnu_init_array_support=yes
+      ], [
+        libbsd_cv_gnu_init_array_support=no
+      ])
+    ])
+  ])
+  AM_CONDITIONAL([BUILD_LIBBSD_CTOR],
+    [test "$libbsd_cv_gnu_init_array_support" = yes])
+])