build: Refactor GNU .init_array support check into a new m4 function
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
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])
+])