commit 4d2fa143e6ec87c345fd1337e5de63bf96c303eb
parent 684f8f56dbde888790abaff779b27608f050e487
Author: Evgeny Grin (Karlson2k) <k2k@drgrin.dev>
Date: Wed, 18 Mar 2026 22:34:10 +0100
Added support for POSIX.1-2024 in configure
Changed strategy for visibility macros definition. Previously, configure
tried to always define _XOPEN_SOURCE if it is supported by headers and
not defined already.
However, some platforms are hiding everything not mentioned explicitly
by POSIX for "compatibility" if _XOPEN_SOURCE is defined.
On the other hand, some platforms require _XOPEN_SOURCE to expose modern
interfaces (otherwise historical interfaces are used).
The new approach has shortcuts for known platforms, which require
_XOPEN_SOURCE, and shortcuts for known platforms, which do not require
_XOPEN_SOURCE. Fallback path with detection is sed for unknown
platforms.
Also, greatly simplified detection of supported _XOPEN_SOURCE values
with (almost) universal test with fallback path (of course).
Additionally, added direct support for more platforms and simplified
on optimised shell (configure) scripts for better efficiency.
In overall: new macros are faster, better, have improved compatibility
and work better with unknown systems.
Sidenote: the code is already using POSIX.1-2024 features, like memmem
(POST parsing), pipe2 (Intr-Thread Communication), SOCK_CLOEXEC and
SOCK_NONBLOCK (sockets). Previously the code worked only as non-standard
extension. Now codes detects and uses these features as part of standard
features, enabled automatically by visibility precompiler macros.
Diffstat:
1 file changed, 490 insertions(+), 201 deletions(-)
diff --git a/m4/mhd_sys_extentions.m4 b/m4/mhd_sys_extentions.m4
@@ -59,10 +59,378 @@ m4_ifdef([_AC_UNDECLARED_BUILTIN],
[_AC_UNDECLARED_BUILTIN])]dnl
[AC_REQUIRE([_AC_UNDECLARED_BUILTIN_]_AC_LANG_ABBREV)]dnl
)dnl m4_ifdef _AC_UNDECLARED_BUILTIN
+ AC_REQUIRE([_MHD_SET_BASIC_INCLUDES])
mhd_mse_sys_ext_defines=""
mhd_mse_sys_ext_flags=""
- dnl Check platform-specific extensions.
+
+ AC_CACHE_CHECK([[whether _XOPEN_SOURCE is already defined]],
+ [[mhd_cv_macro__xopen_source_defined]], [
+ _MHD_CHECK_DEFINED([[_XOPEN_SOURCE]], [[${mhd_mse_sys_ext_defines}]],
+ [[mhd_cv_macro__xopen_source_defined="yes"]],
+ [[mhd_cv_macro__xopen_source_defined="no"]]
+ )
+ ]
+ )
+
+ AS_VAR_IF([mhd_cv_macro__xopen_source_defined],["no"],
+ [
+ _MHD_SYS_EXT_CHECK_XOPEN_SOURCE_NEEDED([_MHD_SYS_EXT_CHECK_XOPEN_VAL_MAPPED])
+ ]
+ )
+
+ _MHD_SYS_EXT_PLATFORM_VISIBILITY
+
+ mhd_mse_xopen_features=""
+ mhd_mse_xopen_defines=""
+ mhd_mse_xopen_flags=""
+
+ AS_IF([[test "X${mhd_cv_macro__xopen_source_defined}" = "Xno" && test "X${mhd_cv_hdrs_need__xopen_source}" != "Xno"]],
+ [
+ AS_CASE([${mhd_cv__xopen_source_mapped}],
+ [?00],
+ [
+ _MHD_SYS_EXT_VAR_ADD_FLAG([mhd_mse_xopen_defines],[mhd_mse_xopen_flags],[_XOPEN_SOURCE],[${mhd_cv__xopen_source_mapped}])
+ ],
+
+ [
+ # Some platforms (NetBSD, illumos, Solaris) use '==' checks instead of '>='
+ # for _XOPEN_SOURCE, resulting that unknown for the platform values are
+ # interpreted as the oldest and the platform exposes reduced number of
+ # interfaces. Next checks will ensure that the platform recognises
+ # requested mode instead of blindly defining high number that can
+ # be simply ignored by the platform.
+ _MHD_CHECK_POSIX2024([[mhd_mse_xopen_defines]],
+ [[mhd_mse_xopen_flags]],
+ [[${mhd_mse_sys_ext_defines}]],
+ [mhd_mse_xopen_features="${mhd_cv_headers_posix2024}"],
+ [
+ _MHD_CHECK_POSIX2008([[mhd_mse_xopen_defines]],
+ [[mhd_mse_xopen_flags]],
+ [[${mhd_mse_sys_ext_defines}]],
+ [mhd_mse_xopen_features="${mhd_cv_headers_posix2008}"],
+ [
+ _MHD_CHECK_POSIX2001([[mhd_mse_xopen_defines]],
+ [[mhd_mse_xopen_flags]],
+ [[${mhd_mse_sys_ext_defines}]],
+ [mhd_mse_xopen_features="${mhd_cv_headers_posix2001}"],
+ [
+ _MHD_CHECK_SUSV2([[mhd_mse_xopen_defines]],
+ [[mhd_mse_xopen_flags]],
+ [[${mhd_mse_sys_ext_defines}]],
+ [mhd_mse_xopen_features="${mhd_cv_headers_susv2}"],
+ [
+ mhd_mse_xopen_features="${mhd_cv_headers_susv2}"
+ # Try basic fallback values
+ _MHD_XOPEN_VAR_ADD([mhd_mse_xopen_defines], [mhd_mse_xopen_flags], [${mhd_mse_sys_ext_defines}])
+ ]
+ )
+ ]
+ )
+ ]
+ )
+ ]
+ )
+ ]
+ )
+ ]
+ )
+
+ dnl Discard temporal source variables
+ AS_UNSET([[mhd_mse_sys_features_src]])
+ AS_UNSET([[mhd_mse_xopen_defines]])
+ AS_UNSET([[mhd_mse_sys_ext_defines]])
+
+ dnl Determined all required defines.
+ AC_MSG_CHECKING([[for the final set of defined symbols]])
+ m4_ifblank([$1], [dnl
+ AH_TEMPLATE([[_XOPEN_SOURCE]], [Define to maximum value supported by system headers])dnl
+ AH_TEMPLATE([[_XOPEN_SOURCE_EXTENDED]], [Define to 1 if _XOPEN_SOURCE is defined to value less than 500 ]dnl
+ [and system headers require this symbol])dnl
+ AH_TEMPLATE([[_XOPEN_VERSION]], [Define to maximum value supported by system headers if _XOPEN_SOURCE ]dnl
+ [is defined to value less than 500 and headers do not support _XOPEN_SOURCE_EXTENDED])dnl
+ AH_TEMPLATE([[_GNU_SOURCE]], [Define to 1 to enable GNU-related header features])dnl
+ AH_TEMPLATE([[__BSD_VISIBLE]], [Define to 1 if it is required by headers to expose additional symbols])dnl
+ AH_TEMPLATE([[_DARWIN_C_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl
+ AH_TEMPLATE([[__EXTENSIONS__]], [Define to 1 if it is required by headers to expose additional symbols])dnl
+ AH_TEMPLATE([[_NETBSD_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl
+ AH_TEMPLATE([[_BSD_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl
+ AH_TEMPLATE([[_TANDEM_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl
+ AH_TEMPLATE([[_ALL_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl
+ AH_TEMPLATE([[_QNX_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl
+ ])
+ mhd_mse_result=""
+ for mhd_mse_Flag in ${mhd_mse_sys_ext_flags} ${mhd_mse_xopen_flags}
+ do
+ mhd_mse_result="${mhd_mse_result}${mhd_mse_Flag} "
+ m4_ifnblank([$1], [dnl
+ AS_VAR_APPEND([$1],[[" -D$mhd_mse_Flag"]])
+ ], [dnl
+ AS_CASE([[$mhd_mse_Flag]], [[*=*]],
+ [dnl
+ AC_DEFINE_UNQUOTED([[`expr "X$mhd_mse_Flag" : 'X\([^=]*\)'`]],
+ [[`expr "X$mhd_mse_Flag" : 'X[^=]*=\(.*\)'`]])
+ ], [dnl
+ AC_DEFINE_UNQUOTED([[$mhd_mse_Flag]])
+ ])
+ ])
+ done
+ AS_UNSET([[mhd_mse_Flag]])
+ AC_MSG_RESULT([[${mhd_mse_result}]])
+ AS_UNSET([[mhd_mse_result]])
+ AS_UNSET([[mhd_mse_xopen_flags]])
+ AS_UNSET([[mhd_mse_sys_ext_flags]])
+])
+
+# _MHD_SYS_EXT_CHECK_XOPEN_SOURCE_NEEDED([ACTION_IF_YES],
+# [ACTION_IF_NO])
+#
+# Set mhd_cv_hdrs_need__xopen_source to "yes", "no" or "unknown, assuming yes"
+#
+m4_define([_MHD_SYS_EXT_CHECK_XOPEN_SOURCE_NEEDED], [dnl
+ AC_CACHE_CHECK([[whether the proper platform API/ABI is switched by _XOPEN_SOURCE]],
+ [[mhd_cv_hdrs_need__xopen_source]],
+ [
+ mhd_cv_hdrs_need__xopen_source=""
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+/* Warning: test with inverted logic! */
+#ifdef __NetBSD__
+#error NetBSD reqires _XOPEN_SOURCE or _POSIX_C_SOURCE for modern API
+fail test here %%%@<:@-1@:>@
+#endif
+
+#ifdef __illumos__
+#error illumos reqires _XOPEN_SOURCE or _POSIX_C_SOURCE to switch to POSIX API
+fail test here %%%@<:@-1@:>@
+#elif defined(__sun)
+#error Solaris reqires _XOPEN_SOURCE or _POSIX_C_SOURCE to switch to POSIX API
+fail test here %%%@<:@-1@:>@
+#endif
+
+void dummy_func(void);
+void dummy_func(void) {return;}
+ ]])
+ ],[],[mhd_cv_hdrs_need__xopen_source="yes"]
+ )
+ AS_IF([test -z "$mhd_cv_hdrs_need__xopen_source"],
+ [
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+${mhd_basic_headers_includes}
+/* Warning: test with inverted logic! */
+#ifdef __linux__
+#if defined(__GNU_LIBRARY__) || defined(__GLIBC__)
+#ifndef __UCLIBC__
+#error GNU libc does not require _XOPEN_SOURCE
+fail test here %%%@<:@-1@:>@
+#else
+#error uClibc does not require _XOPEN_SOURCE
+fail test here %%%@<:@-1@:>@
+#endif
+/* Note: musl is undetectable by design */
+#endif
+#endif
+
+#ifdef __BIONIC__
+#error Bionic libc does not require _XOPEN_SOURCE
+fail test here %%%@<:@-1@:>@
+#endif
+
+void dummy_func(void);
+void dummy_func(void) {return;}
+ ]])
+ ],[],[mhd_cv_hdrs_need__xopen_source="no"]
+ )
+ ]
+ )
+ AS_IF([test -z "$mhd_cv_hdrs_need__xopen_source"],
+ [
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+/* Warning: test with inverted logic! */
+#ifdef __FreeBSD__
+#error FreeBSD does not require _XOPEN_SOURCE
+fail test here %%%@<:@-1@:>@
+#endif
+
+#ifdef __OpenBSD__
+#error OpenBSD does not require _XOPEN_SOURCE
+fail test here %%%@<:@-1@:>@
+#endif
+
+#ifdef __APPLE__
+#error Darwin does not require _XOPEN_SOURCE
+fail test here %%%@<:@-1@:>@
+#endif
+
+#ifdef __HAIKU__
+#error Haiku does not require _XOPEN_SOURCE
+fail test here %%%@<:@-1@:>@
+#endif
+
+#ifdef __DragonFly__
+#error DragonFlyBSD does not require _XOPEN_SOURCE
+fail test here %%%@<:@-1@:>@
+#endif /* __DragonFly__ */
+
+#ifdef __CYGWIN__
+#error Cygwin's newlib does not require _XOPEN_SOURCE
+fail test here %%%@<:@-1@:>@
+#endif /* __CYGWIN__ */
+
+#if defined(__QNX__) || defined(__QNXNTO__)
+#error QNX RTOS does not require _XOPEN_SOURCE
+fail test here %%%@<:@-1@:>@
+#endif /* __QNX__ || __QNXNTO__ */
+
+void dummy_func(void);
+void dummy_func(void) {return;}
+ ]])
+ ],[],[mhd_cv_hdrs_need__xopen_source="no"]
+ )
+ ]
+ )
+ AS_IF([test -z "$mhd_cv_hdrs_need__xopen_source"],
+ [mhd_cv_hdrs_need__xopen_source="unknown, assuming yes"]
+ )
+ ]
+ )
+ m4_ifnblank([$1$2],[AS_VAR_IF([mhd_cv_hdrs_need__xopen_source],["no"],[$2],[$1])])
+])dnl m4_define _MHD_SYS_EXT_CHECK_XOPEN_SOURCE_NEEDED
+
+#
+# Set mhd_cv__xopen_source_mapped to 800, 700, 600, 500 or none
+
+m4_define([_MHD_SYS_EXT_CHECK_XOPEN_VAL_MAPPED], [dnl
+ AC_REQUIRE([_MHD_SET_BASIC_INCLUDES])
+ # Note: _XOPEN_SOURCE cannot be blindy set to some high or the latest value.
+ # Some platforms (NetBSD, illumos, Solaris) use '==' when checking its
+ # value; mismatched value is interpreted as lowest value and results
+ # in symbols hiding.
+ AC_CACHE_CHECK([fo][r correctly mapped _XOPEN_SOURCE value],
+ [mhd_cv__xopen_source_mapped],
+ [
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([
+_MHD_UNDEF_ALL_EXT[
+#define _XOPEN_SOURCE 800
+${mhd_basic_headers_includes}
+
+#ifndef _POSIX_C_SOURCE
+#error _POSIX_C_SOURCE is not defined by headers
+fail test here %%%@<:@-1@:>@
+#elif (_POSIX_C_SOURCE + 0) < 202405
+#error _POSIX_C_SOURCE is defined to value lower than expected
+fail test here %%%@<:@-1@:>@
+#elif (_POSIX_C_SOURCE + 0) > 202405
+#error _POSIX_C_SOURCE is defined to value higher than expected
+fail test here %%%@<:@-1@:>@
+#elif (_POSIX_C_SOURCE + 0) == 202405
+#else
+#error weird preprocessor math
+fail test here %%%@<:@-1@:>@
+#endif
+void dummy_func(void);
+void dummy_func(void) {return;}
+ ]])
+ ],[mhd_cv__xopen_source_mapped="800"]
+ )
+
+ AS_IF([test -z "$mhd_cv__xopen_source_mapped"],
+ [
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([
+_MHD_UNDEF_ALL_EXT[
+#define _XOPEN_SOURCE 700
+${mhd_basic_headers_includes}
+
+#ifndef _POSIX_C_SOURCE
+#error _POSIX_C_SOURCE is not defined by headers
+fail test here %%%@<:@-1@:>@
+#elif (_POSIX_C_SOURCE + 0) < 200809
+#error _POSIX_C_SOURCE is defined to value lower than expected
+fail test here %%%@<:@-1@:>@
+#elif (_POSIX_C_SOURCE + 0) > 200809
+#error _POSIX_C_SOURCE is defined to value higher than expected
+fail test here %%%@<:@-1@:>@
+#elif (_POSIX_C_SOURCE + 0) == 200809
+#else
+#error weird preprocessor math
+fail test here %%%@<:@-1@:>@
+#endif
+void dummy_func(void);
+void dummy_func(void) {return;}
+ ]])
+ ],[mhd_cv__xopen_source_mapped="700"]
+ )
+ ]
+ )
+
+ AS_IF([test -z "$mhd_cv__xopen_source_mapped"],
+ [
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([
+_MHD_UNDEF_ALL_EXT[
+#define _XOPEN_SOURCE 600
+${mhd_basic_headers_includes}
+
+#ifndef _POSIX_C_SOURCE
+#error _POSIX_C_SOURCE is not defined by headers
+fail test here %%%@<:@-1@:>@
+#elif (_POSIX_C_SOURCE + 0) < 200112
+#error _POSIX_C_SOURCE is defined to value lower than expected
+fail test here %%%@<:@-1@:>@
+#elif (_POSIX_C_SOURCE + 0) > 200112
+#error _POSIX_C_SOURCE is defined to value higher than expected
+fail test here %%%@<:@-1@:>@
+#elif (_POSIX_C_SOURCE + 0) == 200112
+#else
+#error weird preprocessor math
+fail test here %%%@<:@-1@:>@
+#endif
+void dummy_func(void);
+void dummy_func(void) {return;}
+ ]])
+ ],[mhd_cv__xopen_source_mapped="600"]
+ )
+ ]
+ )
+
+ AS_IF([test -z "$mhd_cv__xopen_source_mapped"],
+ [
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([
+_MHD_UNDEF_ALL_EXT[
+#define _XOPEN_SOURCE 500
+${mhd_basic_headers_includes}
+
+#ifndef _POSIX_C_SOURCE
+#error _POSIX_C_SOURCE is not defined by headers
+fail test here %%%@<:@-1@:>@
+#elif (_POSIX_C_SOURCE + 0) > 199506
+#error _POSIX_C_SOURCE is defined to value higher than expected
+fail test here %%%@<:@-1@:>@
+#elif (_POSIX_C_SOURCE + 0) == 0
+#error _POSIX_C_SOURCE is defined to zero value
+fail test here %%%@<:@-1@:>@
+#elif (_POSIX_C_SOURCE + 0) <= 199506
+#else
+#error weird preprocessor math
+fail test here %%%@<:@-1@:>@
+#endif
+void dummy_func(void);
+void dummy_func(void) {return;}
+ ]])
+ ],[mhd_cv__xopen_source_mapped="500"]
+ )
+ ]
+ )
+
+ test -n "${mhd_cv__xopen_source_mapped}" || mhd_cv__xopen_source_mapped="none"
+ ]
+ )
+])dnl m4_define _MHD_SYS_EXT_CHECK_XOPEN_MAPPED
+
+
+#
+# Set mhd_mse_sys_ext_defines and mhd_mse_sys_ext_flags
+#
+m4_define([_MHD_SYS_EXT_PLATFORM_VISIBILITY], [dnl
+ dnl Check platform-specific visibility macros.
dnl Use compiler-based test for determinig target.
dnl Always add _GNU_SOURCE if headers allow.
@@ -133,7 +501,6 @@ fail test here %%%@<:@-1@:>@
])
])
-
dnl _DARWIN_C_SOURCE enables additional functionality on Darwin.
MHD_CHECK_DEFINED_MSG([[__APPLE__]], [[${mhd_mse_sys_ext_defines}]],
[[whether to try _DARWIN_C_SOURCE macro]],
@@ -219,170 +586,30 @@ fail test here %%%@<:@-1@:>@
)dnl
])
- mhd_mse_xopen_features=""
- mhd_mse_xopen_defines=""
- mhd_mse_xopen_flags=""
-
- AC_CACHE_CHECK([[whether _XOPEN_SOURCE is already defined]],
- [[mhd_cv_macro__xopen_source_defined]], [
- _MHD_CHECK_DEFINED([[_XOPEN_SOURCE]], [[${mhd_mse_sys_ext_defines}]],
- [[mhd_cv_macro__xopen_source_defined="yes"]],
- [[mhd_cv_macro__xopen_source_defined="no"]]
- )
- ]
- )
- AS_VAR_IF([[mhd_cv_macro__xopen_source_defined]], [["no"]],
- [
- dnl Some platforms (namely: Solaris) use '==' checks instead of '>='
- dnl for _XOPEN_SOURCE, resulting that unknown for platform values are
- dnl interpreted as oldest and platform expose reduced number of
- dnl interfaces. Next checks will ensure that platform recognise
- dnl requested mode instead of blindly define high number that can
- dnl be simply ignored by platform.
- _MHD_CHECK_POSIX2008([[mhd_mse_xopen_defines]],
- [[mhd_mse_xopen_flags]],
- [[${mhd_mse_sys_ext_defines}]],
- [mhd_mse_xopen_features="${mhd_cv_headers_posix2008}"],
- [
- _MHD_CHECK_POSIX2001([[mhd_mse_xopen_defines]],
- [[mhd_mse_xopen_flags]],
- [[${mhd_mse_sys_ext_defines}]],
- [mhd_mse_xopen_features="${mhd_cv_headers_posix2001}"],
- [
- _MHD_CHECK_SUSV2([[mhd_mse_xopen_defines]],
- [[mhd_mse_xopen_flags]],
- [[${mhd_mse_sys_ext_defines}]],
- [mhd_mse_xopen_features="${mhd_cv_headers_susv2}"],
- [mhd_mse_xopen_features="${mhd_cv_headers_susv2}"]
- )
- ]
- )
- ]
- )
- ]
- )
-
- AS_IF([[test "x${mhd_cv_macro__xopen_source_defined}" = "xno" && \
- test "x${mhd_cv_macro__xopen_source_def_fiveh}" = "xno" || \
- test "x${mhd_mse_xopen_features}" = "xnot available" ]],
- [
- _MHD_XOPEN_VAR_ADD([mhd_mse_xopen_defines], [mhd_mse_xopen_flags], [${mhd_mse_sys_ext_defines}])
- ]
- )
-
- mhd_mse_sys_features_src="
-#ifdef __APPLE__
-#include <sys/socket.h>
-#else
-#error No useful system features.
+ dnl _QNX_SOURCE enabled all available symbols in QNX RTOS.
+ AC_CACHE_CHECK([[whether to try _QNX_SOURCE macro]],
+ [[mhd_cv_macro_try__qnx_source]], [dnl
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#if !defined(__QNX__) && !defined (__QNXNTO__)
+#error Target is not QNX RTOS
fail test here %%%@<:@-1@:>@
#endif
-
-int main()
-{
-#ifdef __APPLE__
-#ifndef sendfile
- (void) sendfile;
-#endif
-#endif
- return 0;
-}
-"
- AC_CACHE_CHECK([[for useful system-specific features]],
- [[mhd_cv_headers_useful_features_present]], [
- mhd_SYS_EXT_SAVE_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS $ac_[]_AC_LANG_ABBREV[]_undeclared_builtin_options"
- AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
-${mhd_mse_sys_ext_defines}
-${mhd_mse_sys_features_src}
- ]])],
- [[mhd_cv_headers_useful_features_present="yes"]],
- [[mhd_cv_headers_useful_features_present="no"]]
+ ]],[])],
+ [[mhd_cv_macro_try__qnx_source="yes"]],
+ [[mhd_cv_macro_try__qnx_source="no"]]
+ )
+ ])
+ AS_VAR_IF([[mhd_cv_macro_try__qnx_source]], [["yes"]],
+ [dnl
+ MHD_CHECK_DEF_AND_ACCEPT(
+ [[_QNX_SOURCE]], [], [[${mhd_mse_sys_ext_defines}]], [],
+ [
+ _MHD_SYS_EXT_VAR_ADD_FLAG([[mhd_mse_sys_ext_defines]], [[mhd_mse_sys_ext_flags]], [[_QNX_SOURCE]])
+ ]
)dnl
])
- AS_VAR_IF([[mhd_cv_headers_useful_features_present]], [["yes"]],
- [
- AS_IF([[test "x${mhd_mse_xopen_flags}" = "x"]], [[:]],
- [
- AC_CACHE_CHECK([[whether useful system-specific features works with ${mhd_mse_xopen_flags}]],
- [[mhd_cv_headers_useful_features_works_xopen]], [dnl
- AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
-${mhd_mse_sys_ext_defines}
-${mhd_mse_xopen_defines}
-${mhd_mse_sys_features_src}
- ]])],
- [[mhd_cv_headers_useful_features_works_xopen="yes"]],
- [[mhd_cv_headers_useful_features_works_xopen="no"]]
- )dnl
- ])dnl
- ]
- )
- CFLAGS="$mhd_SYS_EXT_SAVE_CFLAGS"
- AS_UNSET([mhd_SYS_EXT_SAVE_CFLAGS])
- ]
- )
-
- AS_IF([[test "x${mhd_cv_headers_useful_features_present}" = "xyes" && \
- test "x${mhd_cv_headers_useful_features_works_xopen}" = "xno" && \
- test "x${mhd_mse_xopen_flags}" != "x"]],
- [
- _MHD_VAR_CONTAIN([[mhd_mse_xopen_features]], [[, activated by _XOPEN_SOURCE]],
- [
- AC_MSG_WARN([[_XOPEN_SOURCE macro is required to activate all headers symbols, however some useful system-specific features does not work with _XOPEN_SOURCE. ]dnl
- [_XOPEN_SOURCE macro will not be used.]])
- ]
- )
- AS_UNSET([[mhd_mse_xopen_defines]])
- AS_UNSET([[mhd_mse_xopen_flags]])
- AS_UNSET([[mhd_mse_xopen_values]])
- ]
- )
-
- dnl Discard temporal source variables
- AS_UNSET([[mhd_mse_sys_features_src]])
- AS_UNSET([[mhd_mse_xopen_defines]])
- AS_UNSET([[mhd_mse_sys_ext_defines]])
-
- dnl Determined all required defines.
- AC_MSG_CHECKING([[for final set of defined symbols]])
- m4_ifblank([$1], [dnl
- AH_TEMPLATE([[_XOPEN_SOURCE]], [Define to maximum value supported by system headers])dnl
- AH_TEMPLATE([[_XOPEN_SOURCE_EXTENDED]], [Define to 1 if _XOPEN_SOURCE is defined to value less than 500 ]dnl
- [and system headers require this symbol])dnl
- AH_TEMPLATE([[_XOPEN_VERSION]], [Define to maximum value supported by system headers if _XOPEN_SOURCE ]dnl
- [is defined to value less than 500 and headers do not support _XOPEN_SOURCE_EXTENDED])dnl
- AH_TEMPLATE([[_GNU_SOURCE]], [Define to 1 to enable GNU-related header features])dnl
- AH_TEMPLATE([[__BSD_VISIBLE]], [Define to 1 if it is required by headers to expose additional symbols])dnl
- AH_TEMPLATE([[_DARWIN_C_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl
- AH_TEMPLATE([[__EXTENSIONS__]], [Define to 1 if it is required by headers to expose additional symbols])dnl
- AH_TEMPLATE([[_NETBSD_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl
- AH_TEMPLATE([[_BSD_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl
- AH_TEMPLATE([[_TANDEM_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl
- AH_TEMPLATE([[_ALL_SOURCE]], [Define to 1 if it is required by headers to expose additional symbols])dnl
- ])
- for mhd_mse_Flag in ${mhd_mse_sys_ext_flags} ${mhd_mse_xopen_flags}
- do
- m4_ifnblank([$1], [dnl
- AS_VAR_APPEND([$1],[[" -D$mhd_mse_Flag"]])
- ], [dnl
- AS_CASE([[$mhd_mse_Flag]], [[*=*]],
- [dnl
- AC_DEFINE_UNQUOTED([[`echo $mhd_mse_Flag | cut -f 1 -d =`]],
- [[`echo $mhd_mse_Flag | cut -f 2 -d = -s`]])
- ], [dnl
- AC_DEFINE_UNQUOTED([[$mhd_mse_Flag]])
- ])
- ])
- done
- AS_UNSET([[mhd_mse_Flag]])
- dnl Trim whitespaces
- mhd_mse_result=`echo ${mhd_mse_sys_ext_flags} ${mhd_mse_xopen_flags}`
- AC_MSG_RESULT([[${mhd_mse_result}]])
- AS_UNSET([[mhd_mse_result]])
- AS_UNSET([[mhd_mse_xopen_flags]])
- AS_UNSET([[mhd_mse_sys_ext_flags]])
-])
+])dnl m4_define _MHD_SYS_EXT_PLATFORM_VISIBILITY
#
@@ -419,24 +646,83 @@ m4_define([_MHD_VAR_IF],[dnl
m4_ifnblank([$3$4],[dnl
AS_VAR_IF([$1],[$2],[$3],[$4])])])
+
+# SYNOPSIS
+#
+# _MHD_CHECK_POSIX2024(DEFINES_VAR, FLAGS_VAR,
+# [EXT_DEFINES],
+# [ACTION-IF-AVAILABLE],
+# [ACTION-IF-NOT-AVAILABLE])
#
-# _MHD_STRING_CONTAIN(VAR, MATCH, [IF-MATCH], [IF-NOT-MATCH])
#
+AC_DEFUN([_MHD_CHECK_POSIX2024], [dnl
+ AC_CACHE_CHECK([headers for POSIX.1-2024/SUSv5 features],
+ [[mhd_cv_headers_posix2024]], [dnl
+ _MHD_CHECK_POSIX_FEATURES_SINGLE([
+_MHD_BASIC_INCLUDES
+[
+/* Check will be passed if ALL features are available
+ * and failed if ANY feature is not available. */
+int main()
+{
-AC_DEFUN([_MHD_VAR_CONTAIN],[dnl
-AC_REQUIRE([AC_PROG_FGREP])dnl
-AS_IF([[`echo "${]$1[}" | $FGREP ']$2[' >/dev/null 2>&1`]], [$3], [$4])
-])
+#if !defined(__linux__) && !defined(__apple__) && !defined(__CYGWIN__)
+#ifndef FD_CLOFORK
+#error FD_CLOFORK must be defined with POSIX.1-2024
+fail test here %%%@<:@-1@:>@
+#endif
+#endif
-#
-# _MHD_STRING_CONTAIN_BRE(VAR, BRE, [IF-MATCH], [IF-NOT-MATCH])
-#
+#ifndef memmem
+ (void) memmem;
+#endif
+
+#ifndef strlcpy
+ (void) strlcpy;
+#endif
+
+#ifndef strlcat
+ (void) strlcat;
+#endif
-AC_DEFUN([_MHD_VAR_CONTAIN_BRE],[dnl
-AC_REQUIRE([AC_PROG_GREP])dnl
-AS_IF([[`echo "${]$1[}" | $GREP ']$2[' >/dev/null 2>&1`]], [$3], [$4])
+#if !defined(__applce__)
+#ifndef pipe2
+ (void) pipe2;
+#endif
+#endif
+
+#if !defined(__applce__)
+#ifndef getentropy
+ (void) getentropy;
+#endif
+#endif
+
+/* gmtime_r() becomes mandatory in POSIX.1-2008. */
+#ifndef gmtime_r
+ (void) gmtime_r;
+#endif
+
+ return 0;
+}
+ ]],
+ [$3], [[800]],
+ [[mhd_cv_headers_posix2024]]dnl
+ )
+ ]
+ )
+ AS_CASE([${mhd_cv_headers_posix2024}],
+ [[available*]],
+ [
+ AS_CASE([[${mhd_cv_headers_posix2024}]], [[*"does not work with _XOPEN_SOURCE"*]], [[:]],
+ [_MHD_SYS_EXT_VAR_ADD_FLAG([$1],[$2],[[_XOPEN_SOURCE]],[[800]])]
+ )
+ $4
+ ],
+ [$5]
+ )
])
+
# SYNOPSIS
#
# _MHD_CHECK_POSIX2008(DEFINES_VAR, FLAGS_VAR,
@@ -507,9 +793,10 @@ int main()
)
]
)
- _MHD_VAR_CONTAIN_BRE([[mhd_cv_headers_posix2008]], [[^available]],
+ AS_CASE([${mhd_cv_headers_posix2008}],
+ [[available*]],
[
- _MHD_VAR_CONTAIN([[mhd_cv_headers_posix2008]], [[does not work with _XOPEN_SOURCE]], [[:]],
+ AS_CASE([[${mhd_cv_headers_posix2008}]], [[*"does not work with _XOPEN_SOURCE"*]], [[:]],
[_MHD_SYS_EXT_VAR_ADD_FLAG([$1],[$2],[[_XOPEN_SOURCE]],[[700]])]
)
$4
@@ -579,9 +866,10 @@ fail test here %%%@<:@-1@:>@
)
]
)
- _MHD_VAR_CONTAIN_BRE([[mhd_cv_headers_posix2001]], [[^available]],
+ AS_CASE([${mhd_cv_headers_posix2001}],
+ [[available*]],
[
- _MHD_VAR_CONTAIN([[mhd_cv_headers_posix2001]], [[does not work with _XOPEN_SOURCE]], [[:]],
+ AS_CASE([[${mhd_cv_headers_posix2001}]], [[*"does not work with _XOPEN_SOURCE"*]], [[:]],
[_MHD_SYS_EXT_VAR_ADD_FLAG([$1],[$2],[[_XOPEN_SOURCE]],[[600]])]
)
$4
@@ -648,9 +936,10 @@ int main()
)
]
)
- _MHD_VAR_CONTAIN_BRE([[mhd_cv_headers_susv2]], [[^available]],
+ AS_CASE([${mhd_cv_headers_susv2}],
+ [[available*]],
[
- _MHD_VAR_CONTAIN([[mhd_cv_headers_susv2]], [[does not work with _XOPEN_SOURCE]], [[:]],
+ AS_CASE([[${mhd_cv_headers_susv2}]], [[*"does not work with _XOPEN_SOURCE"*]], [[:]],
[_MHD_SYS_EXT_VAR_ADD_FLAG([$1],[$2],[[_XOPEN_SOURCE]],[[500]])]
)
$4
@@ -1015,7 +1304,7 @@ AC_DEFUN([MHD_CHECK_HEADERS_PRESENCE], [dnl
# Check basic headers for presence.
AC_DEFUN([MHD_CHECK_BASIC_HEADERS_PRESENCE], [dnl
- MHD_CHECK_HEADERS_PRESENCE([stdio.h wchar.h stdlib.h string.h strings.h stdint.h fcntl.h sys/types.h time.h unistd.h])
+ MHD_CHECK_HEADERS_PRESENCE([sys/types.h stdint.h stdio.h stdlib.h wchar.h string.h strings.h time.h fcntl.h unistd.h])
])
@@ -1027,53 +1316,53 @@ AC_DEFUN([MHD_CHECK_BASIC_HEADERS_PRESENCE], [dnl
AC_DEFUN([_MHD_SET_BASIC_INCLUDES], [dnl
AC_REQUIRE([MHD_CHECK_BASIC_HEADERS_PRESENCE])dnl
AS_IF([[test -z "$mhd_basic_headers_includes"]], [dnl
- AS_VAR_IF([mhd_cv_header_stdio_h_present], [["yes"]],
- [[mhd_basic_headers_includes="\
-#include <stdio.h>
-" ]],[[mhd_basic_headers_includes=""]]
- )
AS_VAR_IF([mhd_cv_header_sys_types_h_present], [["yes"]],
- [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\
+ [[mhd_basic_headers_includes="${mhd_basic_headers_includes}
#include <sys/types.h>
" ]]
)
- AS_VAR_IF([mhd_cv_header_wchar_h_present], [["yes"]],
- [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\
-#include <wchar.h>
+ AS_VAR_IF([mhd_cv_header_stdint_h_present], [["yes"]],
+ [[mhd_basic_headers_includes="${mhd_basic_headers_includes}
+#include <stdint.h>
" ]]
)
+ AS_VAR_IF([mhd_cv_header_stdio_h_present], [["yes"]],
+ [[mhd_basic_headers_includes="
+#include <stdio.h>
+" ]],[[mhd_basic_headers_includes=""]]
+ )
AS_VAR_IF([mhd_cv_header_stdlib_h_present], [["yes"]],
- [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\
+ [[mhd_basic_headers_includes="${mhd_basic_headers_includes}
#include <stdlib.h>
" ]]
)
+ AS_VAR_IF([mhd_cv_header_wchar_h_present], [["yes"]],
+ [[mhd_basic_headers_includes="${mhd_basic_headers_includes}
+#include <wchar.h>
+" ]]
+ )
AS_VAR_IF([mhd_cv_header_string_h_present], [["yes"]],
- [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\
+ [[mhd_basic_headers_includes="${mhd_basic_headers_includes}
#include <string.h>
" ]]
)
AS_VAR_IF([mhd_cv_header_strings_h_present], [["yes"]],
- [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\
+ [[mhd_basic_headers_includes="${mhd_basic_headers_includes}
#include <strings.h>
" ]]
)
- AS_VAR_IF([mhd_cv_header_stdint_h_present], [["yes"]],
- [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\
-#include <stdint.h>
+ AS_VAR_IF([mhd_cv_header_time_h_present], [["yes"]],
+ [[mhd_basic_headers_includes="${mhd_basic_headers_includes}
+#include <time.h>
" ]]
)
AS_VAR_IF([mhd_cv_header_fcntl_h_present], [["yes"]],
- [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\
+ [[mhd_basic_headers_includes="${mhd_basic_headers_includes}
#include <fcntl.h>
" ]]
)
- AS_VAR_IF([mhd_cv_header_time_h_present], [["yes"]],
- [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\
-#include <time.h>
-" ]]
- )
AS_VAR_IF([mhd_cv_header_unistd_h_present], [["yes"]],
- [[mhd_basic_headers_includes="${mhd_basic_headers_includes}\
+ [[mhd_basic_headers_includes="${mhd_basic_headers_includes}
#include <unistd.h>
" ]]
)