commit 9b1865f6918057e6600ff6b455bb8486a016fce1
parent fff6d80c4bfa70a1d3368c9135b67eae2716a4b5
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
Date: Wed, 13 Apr 2022 20:53:21 +0300
configure: added --enable-build-type=TYPE
Useful to quickly define settings combination. Individual settings still
could be overridden by individual parameters.
Added autoconf macros for compiler and linker flags
Diffstat:
10 files changed, 785 insertions(+), 283 deletions(-)
diff --git a/configure.ac b/configure.ac
@@ -28,6 +28,7 @@ AC_CONFIG_AUX_DIR([build-aux])
AM_INIT_AUTOMAKE([gnu] [check-news] [filename-length-max=99] [tar-v7] [silent-rules] [subdir-objects])
AC_CONFIG_HEADERS([MHD_config.h])
AC_CONFIG_MACRO_DIR([m4])
+m4_pattern_forbid([^_?MHD_[A-Z_]+_CC_])dnl
LIB_VERSION_CURRENT=72
LIB_VERSION_REVISION=0
@@ -71,6 +72,33 @@ AS_IF([test -z "$CC" && test -z "$CPP"], [
)
])
+
+AC_MSG_CHECKING([for build type])
+AC_ARG_ENABLE([build-type],
+ [AS_HELP_STRING([[--enable-build-type=TYPE]],
+ [enable build TYPE, a set of configuration parameters; individual settings ]
+ [(asserts, sanitizers, compiler and linker flags) can be overriden by ]
+ [additional configure parameters (debug, neutral, release, release-compact, ]
+ [release-hardened) [neutral]])],
+ [], [enable_build_type=neutral])
+AS_IF([test "x${enable_build_type}" = "x"], [enable_build_type="neutral"])
+AS_VAR_IF([enable_build_type], ["no"], [enable_build_type="neutral"])
+AS_VAR_IF([enable_build_type], ["yes"], [AC_MSG_ERROR([[Missing TYPE for --enable-build-type=]])])
+AS_CASE([${enable_build_type}],
+ [debug], [AC_MSG_RESULT([debug: enable asserts, sanitizers (if any supported), debug information, compiler optimisation for debugging])],
+ [neutral], [AC_MSG_RESULT([neutral: use only user-specified compiler and linker flags])],
+ [release], [AC_MSG_RESULT([release: disable asserts, enable compiler optimisations])],
+ [release-compact], [AC_MSG_RESULT([release-compact: disable asserts, enable compiler optimisations for size, enable compact code])],
+ [release-hardened], [AC_MSG_RESULT([release-hardened: disable asserts, enable compiler optimisations, enable linker and compiler hardening])],
+ [AC_MSG_ERROR([[Unknown build type: ${enable_build_type}]])]
+)
+AS_VAR_IF([enable_build_type], ["neutral"], [:],
+ [
+ # For all non-neutreal build types do not use automatic "-g -O2" for CFLAGS
+ AS_IF([test -z "${CFLAGS}"], [CFLAGS=""])
+ ]
+)
+
# Checks for programs.
AC_PROG_AWK
AC_PROG_GREP
@@ -109,6 +137,86 @@ CPPFLAGS="${CPPFLAGS_ac} ${user_CPPFLAGS}"
LT_INIT([win32-dll])
LT_LANG([Windows Resource])
+
+CFLAGS="${user_CFLAGS}"
+# Compiler options to always enable (if supported)
+MHD_CHECK_ADD_CC_CFLAG([-fno-strict-aliasing], [CFLAGS_ac])
+
+AS_VAR_IF([enable_build_type],["neutral"],[],
+ [ # Any non-neutral build types
+ MHD_CHECK_ADD_CC_CFLAGS([-Wall -Wnull-dereference -Wdeclaration-after-statement], [CFLAGS_ac])
+ MHD_CHECK_ADD_CC_CFLAGS([-Wredundant-decls -Wtrampolines -Wunsafe-loop-optimizations], [CFLAGS_ac])
+ CFLAGS="${CFLAGS_ac} ${user_CFLAGS}"
+ LDFLAGS="${user_LDFLAGS}"
+ MHD_CHECK_ADD_CC_LDFLAG([-Wl,--warn-common], [LDFLAGS_ac])
+ LDFLAGS="${LDFLAGS_ac} ${user_LDFLAGS}"
+ ]
+)
+AS_VAR_IF([enable_build_type],["debug"],
+ [ # Debug build
+ CFLAGS="${user_CFLAGS}"
+ MHD_FIND_ADD_CC_CFLAG([CFLAGS_ac], [-Og], [-O0])
+ MHD_FIND_ADD_CC_CFLAG([CFLAGS_ac], [-ggdb3], [-g3], [-ggdb], [-g])
+ MHD_CHECK_ADD_CC_CFLAGS([-Wextra -Wdouble-promotion -Wformat=2 -Wformat-overflow=2 -Wformat-truncation=2], [CFLAGS_ac])
+ MHD_CHECK_ADD_CC_CFLAGS([-Wmissing-include-dirs -Wshift-overflow=2 -Wstringop-overflow=4 -Walloc-zero], [CFLAGS_ac])
+ MHD_CHECK_ADD_CC_CFLAGS([-Wduplicated-branches -Wduplicated-cond -Wfloat-equal -Wshadow -Wpointer-arith], [CFLAGS_ac])
+ MHD_CHECK_ADD_CC_CFLAGS([-Wbad-function-cast -Wcast-qual -Wcast-align=strict -Wwrite-strings -Wconversion], [CFLAGS_ac])
+ MHD_CHECK_ADD_CC_CFLAGS([-Wjump-misses-init -Wlogical-op -Waggregate-return -Wstrict-prototypes], [CFLAGS_ac])
+ MHD_CHECK_ADD_CC_CFLAGS([-Wold-style-definition -Wmissing-prototypes -Wformat-security -Wshift-negative-value], [CFLAGS_ac])
+ CFLAGS="${CFLAGS_ac} ${user_CFLAGS}"
+ LDFLAGS="${user_LDFLAGS}"
+ MHD_CHECK_ADD_CC_LDFLAG([-Wl,--enable-long-section-names], [LDFLAGS_ac])
+ LDFLAGS="${LDFLAGS_ac} ${user_LDFLAGS}"
+ ]
+)
+AS_CASE([${enable_build_type}],[release|release-*],
+ [ # All release types
+ CFLAGS="${user_CFLAGS}"
+ AS_VAR_IF([enable_build_type],
+ [release-compact],
+ [
+ AC_CHECK_DECL([MHD_FAVOR_SMALL_CODE],[],
+ [AC_CHECK_DECL([MHD_FAVOR_FAST_CODE],[],
+ [MHD_APPEND_FLAG_TO_VAR([CPPFLAGS_ac],[-DMHD_FAVOR_SMALL_CODE=1])],
+ [/* no includes */])],[/* no includes */])
+ CPPFLAGS="${CPPFLAGS_ac} ${user_CPPFLAGS}"
+ MHD_FIND_ADD_CC_CFLAG([CFLAGS_ac], [-Oz], [-Os], [-O])
+ ],
+ [ # All non-compact release types
+ AC_CHECK_DECL([MHD_FAVOR_SMALL_CODE],[],
+ [AC_CHECK_DECL([MHD_FAVOR_FAST_CODE],[],
+ [MHD_APPEND_FLAG_TO_VAR([CPPFLAGS_ac],[-DMHD_FAVOR_FAST_CODE=1])],
+ [/* no includes */])],[/* no includes */])
+ CPPFLAGS="${CPPFLAGS_ac} ${user_CPPFLAGS}"
+ MHD_FIND_ADD_CC_CFLAG([CFLAGS_ac], [-O2], [-O])
+ MHD_CHECK_ADD_CC_CFLAGS([-fsched-pressure -fira-loop-pressure -fmerge-all-constants], [CFLAGS_ac]) # These flags may improve size, recheck with LTO and linker garbage collection
+ MHD_CHECK_ADD_CC_CFLAGS([-ftree-partial-pre -fgcse-after-reload -fipa-pta], [CFLAGS_ac])
+ MHD_CHECK_ADD_CC_CFLAGS([-fisolate-erroneous-paths-attribute -ffinite-loops -floop-nest-optimize], [CFLAGS_ac])
+ MHD_CHECK_ADD_CC_CFLAGS([-fpredictive-commoning -frename-registers], [CFLAGS_ac])
+ MHD_CHECK_ADD_CC_CFLAGS([-ftree-loop-distribute-patterns -fpeel-loops -fsplit-loops -ftree-vectorize], [CFLAGS_ac])
+ ]
+ )
+
+ AS_VAR_IF([enable_build_type],
+ [release-hardened],
+ [
+ MHD_CHECK_ADD_CC_CFLAGS([-Wformat-security -Wstack-protector], [CFLAGS_ac])
+ ]
+ )
+ AS_VAR_IF([enable_build_type],
+ [ # Flags are not suitable for 'compact' and for 'hardened'
+ MHD_CHECK_ADD_CC_CFLAGS([-ffast-math -fno-trapping-math], [CFLAGS_ac])
+ ]
+ )
+ CFLAGS="${CFLAGS_ac} ${user_CFLAGS}"
+ # W32-specific
+ LDFLAGS="${user_LDFLAGS}"
+ MHD_CHECK_ADD_CC_LDFLAG([-Wl,--disable-long-section-names], [LDFLAGS_ac])
+ LDFLAGS="${LDFLAGS_ac} ${user_LDFLAGS}"
+ ]
+)
+CFLAGS="${CFLAGS_ac} ${user_CFLAGS}"
+
# Check for headers that are ALWAYS required
AC_CHECK_HEADERS_ONCE([stdio.h string.h stdint.h errno.h limits.h fcntl.h], [],
[AC_MSG_ERROR([Compiling libmicrohttpd requires standard POSIX headers files])], [AC_INCLUDES_DEFAULT])
@@ -189,26 +297,80 @@ AC_CHECK_HEADERS([sys/sysctl.h netinet/ip_icmp.h netinet/icmp_var.h], [], [],
]]
)
-# Adam shostack suggests the following for Windows:
-# -D_FORTIFY_SOURCE=2 -fstack-protector-all
-AC_ARG_ENABLE([gcc-hardening],
- [AS_HELP_STRING([--enable-gcc-hardening], [enable compiler security checks])],
-[AS_IF([test x$enableval = xyes],[
- CFLAGS_ac="${CFLAGS_ac} -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-all"
- CFLAGS_ac="${CFLAGS_ac} -fwrapv -fPIE -Wstack-protector"
- CFLAGS_ac="${CFLAGS_ac} --param ssp-buffer-size=1"
+AC_ARG_ENABLE([compiler-hardening],
+ [AS_HELP_STRING([--enable-compiler-hardening], [enable compiler security checks])],
+ [],
+ [AS_CASE([${enable_build_type}],[*-hardened],
+ [enable_compiler_hardening='yes'],[enable_compiler_hardening='no'])]
+)
+AS_VAR_IF([enable_compiler_hardening],["yes"],
+ [
+ CPPFLAGS="${CPPFLAGS_ac} ${user_CPPFLAGS}"
+ AC_CHECK_DECL([_FORTIFY_SOURCE],
+ [MHD_APPEND_FLAG_TO_VAR([CPPFLAGS_ac],[-U_FORTIFY_SOURCE])],
+ [],[/* no includes */])
+ MHD_APPEND_FLAG_TO_VAR([CPPFLAGS_ac],[-D_FORTIFY_SOURCE=2])
+ CPPFLAGS="${CPPFLAGS_ac} ${user_CPPFLAGS}"
+ CFLAGS="${user_CFLAGS}"
+ MHD_FIND_ADD_CC_CFLAG([CFLAGS_ac],[-fstack-protector-strong],[-fstack-protector-all],[-fstack-protector])
+ MHD_CHECK_ADD_CC_CFLAGS([-fstack-clash-protection -ftrivial-auto-var-init=pattern],[CFLAGS_ac])
+ CFLAGS="${CFLAGS_ac} ${user_CFLAGS}"
+ AS_VAR_IF([pic_mode],["no"],[],
+ [
+ AS_VAR_IF([enable_shared],["yes"],[],
+ [
+ # PIE cannot be used for shared lib
+ # PIE static lib can be used within non-PIE application, but
+ # PIE static lib cannot be used in non-PIE shared lib. Let's assume
+ # that static lib will not be used in shared lib
+ CFLAGS="${user_CFLAGS}"
+ # Perform tests with "-pie" enabled
+ LDFLAGS="${LDFLAGS_ac} -pie ${user_LDFLAGS}"
+ MHD_CHECK_ADD_CC_CFLAG([-fPIE],[CFLAGS_ac],
+ [
+ MHD_APPEND_FLAG_TO_VAR([LDFLAGS_ac],[-pie])
+ ],
+ [
+ MHD_CHECK_CC_CFLAG([-fpie],[CFLAGS_ac],
+ [
+ MHD_APPEND_FLAG_TO_VAR([LDFLAGS_ac],[-pie])
+ ]
+ )
+ ]
+ )
+ CFLAGS="${CFLAGS_ac} ${user_CFLAGS}"
+ LDFLAGS="${LDFLAGS_ac} ${user_LDFLAGS}"
+ ]
+ )
+ ]
+ )
CFLAGS="${CFLAGS_ac} ${user_CFLAGS}"
- LDFLAGS_ac="${LDFLAGS_ac} -pie"
LDFLAGS="${LDFLAGS_ac} ${user_LDFLAGS}"
- ])])
+ ]
+)
# Linker hardening options
-# Currently these options are ELF specific - you can't use this with MacOSX
+# Currently these options are ELF specific, they don't work on Darwin and W32
AC_ARG_ENABLE([linker-hardening],
[AS_HELP_STRING([--enable-linker-hardening], [enable linker security fixups])],
-[AS_IF([test x$enableval = xyes],
- [LDFLAGS_ac="${LDFLAGS_ac} -z relro -z now"])])
-LDFLAGS="${LDFLAGS_ac} ${user_LDFLAGS}"
+ [],
+ [AS_CASE([${enable_build_type}],[*-hardened],
+ [enable_linker_hardening='yes'],[enable_linker_hardening='no'])]
+)
+AS_VAR_IF([enable_linker_hardening],["yes"],
+ [
+ CFLAGS="${CFLAGS_ac} ${user_CFLAGS}"
+ LDFLAGS="${user_LDFLAGS}"
+ MHD_CHECK_ADD_CC_LDFLAG([-Wl,-z,relro],[LDFLAGS_ac],
+ [MHD_CHECK_ADD_CC_LDFLAG([-Wl,-z,now],[LDFLAGS_ac])])
+ # Actually should be "noexec" by default, but let's try to enforce it.
+ MHD_CHECK_ADD_CC_LDFLAG([-Wl,-z,noexecstack],[LDFLAGS_ac])
+ # W32-specific. Some are enabled by default, but they will be enfored to be sure.
+ MHD_CHECK_ADD_CC_LDFLAGS([-Wl,--large-address-aware -Wl,--enable-auto-image-base],[LDFLAGS_ac])
+ MHD_CHECK_ADD_CC_LDFLAGS([-Wl,--dynamicbase -Wl,--nxcompat -Wl,--high-entropy-va],[LDFLAGS_ac])
+ LDFLAGS="${LDFLAGS_ac} ${user_LDFLAGS}"
+ ]
+)
AH_TEMPLATE([[HAVE_STDBOOL_H]], [Define to 1 i][f you have the <stdbool.h> header file and <stdbool.h> defines 'bool' type.])
@@ -1059,13 +1221,6 @@ AM_CONDITIONAL([HAVE_LISTEN_SHUTDOWN], [test "x$mhd_cv_host_shtdwn_trgr_select"
AC_SEARCH_LIBS([sendmsg], [socket], [AC_DEFINE([HAVE_SENDMSG],[1],[Define if your platform supports sendmsg])])
AC_CHECK_FUNCS([writev])
-# set GCC options
-# use '-fno-strict-aliasing', but only if the compiler
-# and linker can take it
-AX_CHECK_LINK_FLAG([-fno-strict-aliasing],
- [AX_APPEND_COMPILE_FLAGS([-fno-strict-aliasing], [CFLAGS_ac])])
-CFLAGS="${CFLAGS_ac} ${user_CFLAGS}"
-
AC_C_BIGENDIAN
AC_C_VARARRAYS
@@ -1971,7 +2126,7 @@ MHD_CHECK_FUNC([[nanosleep]], [[#include <time.h>]], [[struct timespec ts2, ts1
HIDDEN_VISIBILITY_CFLAGS=""
AH_TEMPLATE([_MHD_EXTERN],[defines how to decorate public symbols w][hile building the library])
CFLAGS="${user_CFLAGS}"
-MHD_CHECK_CC_FLAG([-fvisibility=hidden],[CFLAGS_ac],
+MHD_CHECK_CC_CFLAG([-fvisibility=hidden],[CFLAGS_ac],
[
# NOTE: require setting of errattr_CFLAGS above
CFLAGS="${CFLAGS_ac} -fvisibility=hidden ${user_CFLAGS} ${errattr_CFLAGS}"
@@ -2893,9 +3048,12 @@ AC_MSG_RESULT([$CPU_COUNT])
AC_MSG_CHECKING([[whether to enable debug asserts]])
AC_ARG_ENABLE([[asserts]],
- AS_HELP_STRING([[--enable-asserts]],
- [enable test build with debug asserts]),
- [], [[enable_asserts='no']])
+ [AS_HELP_STRING([[--enable-asserts]],
+ [enable test build with debug asserts])],
+ [],
+ [AS_CASE([${enable_build_type}],[*-hardened],
+ [enable_compiler_hardening='yes'],[enable_compiler_hardening='no'])]
+)
AS_CASE([[$enable_asserts]], [[yes]], [[:]], [[no]], [[:]], [[enable_asserts='no']])
AC_MSG_RESULT([[$enable_asserts]])
@@ -2956,10 +3114,25 @@ AS_IF([test "x${enable_sanitizers}" = "xno"],
],
[test "x${enable_sanitizers}" = "xauto" || test "x${enable_sanitizers}" = "xauto-optional"],
[
- enable_san_address="auto"
- enable_san_undef="auto"
- enable_san_leak="auto"
- enable_san_upoison="auto"
+ AS_VAR_IF([enable_compiler_hardening],["yes"],
+ [
+ AS_VAR_IF([enable_sanitizers],["auto"],
+ [AC_MSG_ERROR([sanitizers cannot be enabled with compiler hardnening])],
+ [AC_MSG_WARN([sanitizers cannot be enabled with compiler hardnening])]
+ )
+ enable_sanitizers="no"
+ enable_san_address="no"
+ enable_san_undef="no"
+ enable_san_leak="no"
+ enable_san_upoison="no"
+ ],
+ [
+ enable_san_address="auto"
+ enable_san_undef="auto"
+ enable_san_leak="auto"
+ enable_san_upoison="auto"
+ ]
+ )
],
[test "x${enable_sanitizers}" = "xauto-fallback"],
[
diff --git a/m4/mhd_check_add_cc_cflag.m4 b/m4/mhd_check_add_cc_cflag.m4
@@ -0,0 +1,63 @@
+# SYNOPSIS
+#
+# MHD_CHECK_ADD_CC_CFLAG([FLAG-TO-TEST], [VARIABLE-TO-EXTEND],
+# [ACTION-IF-SUPPORTED], [ACTION-IF-NOT-SUPPORTED])
+#
+# DESCRIPTION
+#
+# This macro checks whether the specific compiler flag is supported.
+# The check is performing by appending FLAG-TO-TEST to the value of
+# VARIABLE-TO-EXTEND (CFLAGS if not specified), then prepending result to
+# CFLAGS (unless VARIABLE-TO-EXTEND is CFLAGS), and then performing compile
+# and link test. If test succeed without warnings, then the flag is added to
+# VARIABLE-TO-EXTEND. Otherwise, if compile and link without test flag cannot
+# be done without any warning, the flag is considered to be unsuppoted.
+#
+# Example usage:
+#
+# MHD_CHECK_ADD_CC_CFLAG([-Wshadow], [additional_CFLAGS])
+#
+#
+# LICENSE
+#
+# Copyright (c) 2022 Karlson2k (Evgeny Grin) <k2k@narod.ru>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 1
+
+AC_DEFUN([MHD_CHECK_ADD_CC_CFLAG],[dnl
+_MHD_CHECK_ADD_CC_XFLAG([$1],[$2],[$3],[$4],[[CFLAGS]])dnl
+])
+
+
+# SYNOPSIS
+#
+# _MHD_CHECK_ADD_CC_XFLAG([FLAG-TO-TEST], [VARIABLE-TO-EXTEND],
+# [ACTION-IF-SUPPORTED], [ACTION-IF-NOT-SUPPORTED],
+# [CFLAGS|LDFLAGS])
+#
+AC_DEFUN([_MHD_CHECK_ADD_CC_XFLAG],[dnl
+ AC_PREREQ([2.64])dnl for AS_VAR_IF, m4_ifnblank, m4_default
+ AC_LANG_ASSERT([C])dnl
+ m4_ifblank([$1], [m4_fatal([First macro argument must not be empty])])dnl
+ m4_bmatch(_mhd_norm_expd([$1]), [\s],dnl
+ [m4_fatal([First macro argument must not contain whitespaces])])dnl
+ m4_bmatch(_mhd_norm_expd([$2]), [\s],dnl
+ [m4_fatal([Second macro argument must not contain whitespaces])])dnl
+ m4_bmatch([$1], [\$], [m4_fatal([$0: First macro argument must not contain '$'])])dnl
+ m4_bmatch([$2], [\$], [m4_fatal([$0: Second macro argument must not contain '$'])])dnl
+ m4_bmatch(_mhd_norm_expd([$5]), [^\(CFLAGS\|LDFLAGS\)$],[],dnl
+ [m4_fatal([$0: Fifth macro argument must be either 'CFLAGS' or 'LDFLAGS; ']_mhd_norm_expd([$5])[' is not supported])])dnl
+ m4_ifnblank([$2],
+ [_MHD_CHECK_CC_XFLAG([$1], [$2],
+ [MHD_APPEND_FLAG_TO_VAR(_mhd_norm_expd([$2]),_mhd_norm_expd([$1]))
+ $3],[$4],[$5])],
+ [_MHD_CHECK_CC_XFLAG([$1],_mhd_norm_expd([$5]),
+ [MHD_APPEND_FLAG_TO_VAR(_mhd_norm_expd([$5]),_mhd_norm_expd([$1]))
+ $3],[$4],[$5])]
+ )
+])
diff --git a/m4/mhd_check_add_cc_cflags.m4 b/m4/mhd_check_add_cc_cflags.m4
@@ -0,0 +1,39 @@
+# SYNOPSIS
+#
+# MHD_CHECK_ADD_CC_CFLAGS([FLAGS-TO-TEST], [VARIABLE-TO-EXTEND])
+#
+# DESCRIPTION
+#
+# This macro checks whether the specific compiler flags are supported.
+# The FLAGS-TO-TEST parameter is whitespace-separated flagto to test.
+# The flags are tested one-by-one, all supported flags are added to the
+# VARIABLE-TO-EXTEND.
+# Every flag check is performing by appending one flag to the value of
+# VARIABLE-TO-EXTEND (CFLAGS if not specified), then prepending result to
+# CFLAGS (unless VARIABLE-TO-EXTEND is CFLAGS), and then performing compile
+# and link test. If test succeed without warnings, then the flag is added to
+# VARIABLE-TO-EXTEND. Otherwise, if compile and link without test flag cannot
+# be done without any warning, the flag is considered to be unsuppoted.
+#
+# Example usage:
+#
+# MHD_CHECK_ADD_CC_CFLAGS([-Wshadow -Walloc-zero -Winit-self],
+# [additional_CFLAGS])
+#
+#
+# LICENSE
+#
+# Copyright (c) 2022 Karlson2k (Evgeny Grin) <k2k@narod.ru>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 1
+
+AC_DEFUN([MHD_CHECK_ADD_CC_CFLAGS],[dnl
+m4_foreach_w([test_flag],[$1],
+[MHD_CHECK_ADD_CC_CFLAG([test_flag],[$2])
+])dnl
+])
diff --git a/m4/mhd_check_add_cc_ldflag.m4 b/m4/mhd_check_add_cc_ldflag.m4
@@ -0,0 +1,34 @@
+# SYNOPSIS
+#
+# MHD_CHECK_ADD_CC_LDFLAG([FLAG-TO-TEST], [VARIABLE-TO-EXTEND],
+# [ACTION-IF-SUPPORTED], [ACTION-IF-NOT-SUPPORTED])
+#
+# DESCRIPTION
+#
+# This macro checks whether the specific compiler flag is supported.
+# The check is performing by appending FLAG-TO-TEST to the value of
+# VARIABLE-TO-EXTEND (LDFLAGS if not specified), then prepending result to
+# LDFLAGS (unless VARIABLE-TO-EXTEND is LDFLAGS), and then performing compile
+# and link test. If test succeed without warnings, then the flag is added to
+# VARIABLE-TO-EXTEND. Otherwise, if compile and link without test flag cannot
+# be done without any warning, the flag is considered to be unsuppoted.
+#
+# Example usage:
+#
+# MHD_CHECK_ADD_CC_LDFLAG([-pie], [additional_LDFLAGS])
+#
+#
+# LICENSE
+#
+# Copyright (c) 2022 Karlson2k (Evgeny Grin) <k2k@narod.ru>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 1
+
+AC_DEFUN([MHD_CHECK_ADD_CC_LDFLAG],[dnl
+_MHD_CHECK_ADD_CC_XFLAG([$1],[$2],[$3],[$4],[[LDFLAGS]])dnl
+])
diff --git a/m4/mhd_check_add_cc_ldflags.m4 b/m4/mhd_check_add_cc_ldflags.m4
@@ -0,0 +1,39 @@
+# SYNOPSIS
+#
+# MHD_CHECK_ADD_CC_LDFLAGS([FLAGS-TO-TEST], [VARIABLE-TO-EXTEND])
+#
+# DESCRIPTION
+#
+# This macro checks whether the specific compiler flags are supported.
+# The FLAGS-TO-TEST parameter is whitespace-separated flagto to test.
+# The flags are tested one-by-one, all supported flags are added to the
+# VARIABLE-TO-EXTEND.
+# Every flag check is performing by appending one flag to the value of
+# VARIABLE-TO-EXTEND (LDFLAGS if not specified), then prepending result to
+# LDFLAGS (unless VARIABLE-TO-EXTEND is LDFLAGS), and then performing compile
+# and link test. If test succeed without warnings, then the flag is added to
+# VARIABLE-TO-EXTEND. Otherwise, if compile and link without test flag cannot
+# be done without any warning, the flag is considered to be unsuppoted.
+#
+# Example usage:
+#
+# MHD_CHECK_ADD_CC_LDFLAGS([-W,--strip-all -Wl,--fatal-warnings],
+# [additional_LDFLAGS])
+#
+#
+# LICENSE
+#
+# Copyright (c) 2022 Karlson2k (Evgeny Grin) <k2k@narod.ru>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 1
+
+AC_DEFUN([MHD_CHECK_ADD_CC_LDFLAGS],[dnl
+m4_foreach_w([test_flag],[$1],
+[MHD_CHECK_ADD_CC_LDFLAG([test_flag],[$2])
+])dnl
+])
diff --git a/m4/mhd_check_cc_cflag.m4 b/m4/mhd_check_cc_cflag.m4
@@ -0,0 +1,256 @@
+# SYNOPSIS
+#
+# MHD_CHECK_CC_CFLAG([FLAG-TO-TEST], [VARIABLE-TO-PREPEND-CFLAGS],
+# [ACTION-IF-SUPPORTED], [ACTION-IF-NOT-SUPPORTED])
+#
+# DESCRIPTION
+#
+# This macro checks whether the specific compiler flag is supported.
+# The check is performing by prepending FLAG-TO-TEST to CFLAGS, then
+# prepending value of VARIABLE-TO-PREPEND-CFLAGS (if any) to CFLAGS, and
+# then performing compile and link test. If test succeed without warnings,
+# then the flag is considered to be suppoted. Otherwise, if compile and link
+# without test flag can be done without any warning, the flag is considered
+# to be unsuppoted.
+#
+# Example usage:
+#
+# MHD_CHECK_CC_CFLAG([-Wshadow], [additional_CFLAGS],
+# [additional_CFLAGS="${additional_CFLAGS} -Wshadow"])
+#
+# Defined cache variable used in check so if any test will not work
+# correctly on some platform, user may simply fix it by giving cache
+# variable in configure parameters, for example:
+#
+# ./configure mhd_cv_cc_fl_supp__Wshadow=no
+#
+# This simplify building from source on exotic platforms as patching
+# of configure.ac is not required to change results of tests.
+#
+# LICENSE
+#
+# Copyright (c) 2022 Karlson2k (Evgeny Grin) <k2k@narod.ru>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 2
+
+AC_DEFUN([MHD_CHECK_CC_CFLAG],[dnl
+_MHD_CHECK_CC_XFLAG([$1],[$2],[$3],[$4],[[CFLAGS]])dnl
+])
+
+# SYNOPSIS
+#
+# _MHD_CHECK_CC_XFLAG([FLAG-TO-TEST], [VARIABLE-TO-PREPEND-CFLAGS],
+# [ACTION-IF-SUPPORTED], [ACTION-IF-NOT-SUPPORTED],
+# [CFLAGS|LDFLAGS])
+#
+AC_DEFUN([_MHD_CHECK_CC_XFLAG],[dnl
+ AC_PREREQ([2.64])dnl for AS_VAR_IF, m4_ifnblank
+ AC_LANG_ASSERT([C])dnl
+ AC_REQUIRE([AC_PROG_CC])dnl
+ m4_ifblank([$1], [m4_fatal([$0: First macro argument must not be empty])])dnl
+ m4_bmatch(m4_normalize([$1]), [\s],dnl
+ [m4_fatal([$0: First macro argument must not contain whitespaces])])dnl
+ m4_bmatch(_mhd_norm_expd([$2]), [\s],dnl
+ [m4_fatal([$0: Second macro argument must not contain whitespaces])])dnl
+ m4_bmatch([$1], [\$], [m4_fatal([$0: First macro argument must not contain '$'])])dnl
+ m4_bmatch([$2], [\$], [m4_fatal([$0: Second macro argument must not contain '$'])])dnl
+ AC_REQUIRE([MHD_FIND_CC_XFLAG_WARNPARAMS])dnl sets 'mhd_xFLAGS_params_warn' variable
+ m4_bmatch(_mhd_norm_expd([$5]), [^\(CFLAGS\|LDFLAGS\)$],[],dnl
+ [m4_fatal([$0: Fifth macro argument must be either 'CFLAGS' or 'LDFLAGS; ']_mhd_norm_expd([$5])[' is not supported])])dnl
+ _MHD_CHECK_CC_XFLAG_BODY([$1],[$2],[$3],[$4],[mhd_xFLAGS_params_warn],[$5])dnl
+])
+
+
+# SYNOPSIS
+#
+# _MHD_CHECK_CC_XFLAG_BODY([FLAG-TO-TEST], [VARIABLE-TO-PREPEND-CFLAGS],
+# [ACTION-IF-SUPPORTED], [ACTION-IF-NOT-SUPPORTED],
+# [VARIABLE-TO-ENABLE-WARNS], [CFLAGS|LDFLAGS])
+#
+AC_DEFUN([_MHD_CHECK_CC_XFLAG_BODY],[dnl
+ AC_LANG_ASSERT([C])dnl
+ m4_ifblank([$1], [m4_fatal([$0: First macro argument must not be empty])])dnl
+ m4_bmatch(_mhd_norm_expd([$1]), [\s],dnl
+ [m4_fatal([$0: First macro argument must not contain whitespaces])])dnl
+ m4_bmatch(_mhd_norm_expd([$2]), [\s],dnl
+ [m4_fatal([$0: Second macro argument must not contain whitespaces])])dnl
+ m4_bmatch([$1], [\$], [m4_fatal([$0: First macro argument must not contain '$'])])dnl
+ m4_bmatch([$2], [\$], [m4_fatal([$0: Second macro argument must not contain '$'])])dnl
+ m4_ifblank([$5], [m4_fatal([$0: Fifth macro argument must not be empty])])dnl
+ m4_bmatch([$5], [\$], [m4_fatal([$0: Fifth macro argument must not contain '$'])])dnl
+ m4_bmatch(_mhd_norm_expd([$6]), [^\(CFLAGS\|LDFLAGS\)$],[],dnl
+ [m4_fatal([$0: Sixth macro argument must be either 'CFLAGS' or 'LDFLAGS; ']_mhd_norm_expd([$6])[' is not supported])])dnl
+ m4_pushdef([XFLAGS],_mhd_norm_expd([$6]))dnl
+ dnl Keep uppercase letters to avoid clashes for parameters like -fPIE and -fpie
+ AS_VAR_PUSHDEF([cv_Var],[mhd_cv_cc_]m4_tolower(m4_substr(_mhd_norm_expd([$6]),0,1))[fl_supp_]m4_bpatsubst(_mhd_norm_expd([$1]),[[^a-zA-Z0-9]],[_]))dnl
+
+ AC_CACHE_CHECK([whether $[]CC supports _mhd_norm_expd([$1]) flag], cv_Var,
+ [dnl
+ AS_VAR_PUSHDEF([save_xFLAGS_Var], [mhd_check_cc_flag_save_]XFLAGS)dnl
+ AS_VAR_SET([save_xFLAGS_Var],["${XFLAGS}"])
+ m4_ifnblank([$2],[dnl
+ m4_if(_mhd_norm_expd([$2]),[XFLAGS],
+ [XFLAGS="${save_xFLAGS_Var} _mhd_norm_expd([$1]) $[]{_mhd_norm_expd([$5])}"],
+ [XFLAGS="$[]{_mhd_norm_expd([$2])} _mhd_norm_expd([$1]) ${save_xFLAGS_Var} $[]{_mhd_norm_expd([$5])}"])
+ ],[dnl
+ XFLAGS="_mhd_norm_expd([$1]) $[]XFLAGS $[]{_mhd_norm_expd([$5])}"
+ ])dnl
+ mhd_check_cc_flag_save_c_werror_flag="$ac_c_werror_flag"
+ ac_c_werror_flag=yes
+ [#] Reuse the same source for all the checks here
+ AC_LANG_CONFTEST([AC_LANG_SOURCE([[
+int main(void)
+{
+ return 0;
+}
+ ]])])
+ AC_LINK_IFELSE([],
+ [AS_VAR_SET([cv_Var],["yes"])],
+ [ [#] Compile and link failed with test flag added
+ m4_ifnblank([$2],[dnl
+ m4_if(_mhd_norm_expd([$2]),[XFLAGS],
+ [XFLAGS="${save_xFLAGS_Var} $[]{_mhd_norm_expd([$5])}"],
+ [XFLAGS="$[]{_mhd_norm_expd([$2])} ${save_xFLAGS_Var} $[]{_mhd_norm_expd([$5])}"])
+ ],[dnl
+ XFLAGS="${save_xFLAGS_Var} $[]{_mhd_norm_expd([$5])}"
+ ])dnl
+ AC_LINK_IFELSE([],
+ [AS_VAR_SET([cv_Var],["no"])],
+ [ [#] Compile and link failed with test flag removed as well
+ m4_ifnblank([$2],[dnl
+ m4_if(_mhd_norm_expd([$2]),[XFLAGS],
+ [XFLAGS="${save_xFLAGS_Var} _mhd_norm_expd([$1])"],
+ [XFLAGS="$[]{_mhd_norm_expd([$2])} _mhd_norm_expd([$1]) ${save_xFLAGS_Var}"])
+ ],[dnl
+ XFLAGS="_mhd_norm_expd([$1]) ${save_xFLAGS_Var}"
+ ])dnl
+ ac_c_werror_flag="$mhd_check_cc_flag_save_c_werror_flag"
+ AC_LINK_IFELSE([],
+ [AS_VAR_SET([cv_Var],["yes"])],
+ [AS_VAR_SET([cv_Var],["no"])],
+ )
+ ]
+ )
+ ]
+ )
+ ac_c_werror_flag="$mhd_check_cc_flag_save_c_werror_flag"
+ AS_VAR_SET([XFLAGS],["${save_xFLAGS_Var}"])
+ AS_UNSET(save_xFLAGS_Var)
+ AS_VAR_POPDEF([save_xFLAGS_Var])dnl
+ ]
+ )
+ m4_ifnblank([$3$4],[dnl
+ AS_VAR_IF([cv_Var], ["yes"], [$3], m4_default_nblank([$4]))
+ ])dnl
+ AS_VAR_POPDEF([cv_Var])dnl
+ m4_popdef([XFLAGS])dnl
+])
+
+
+#
+# SYNOPSIS
+#
+# MHD_FIND_CC_XFLAG_WARNPARAMS()
+#
+AC_DEFUN([MHD_FIND_CC_XFLAG_WARNPARAMS],[dnl
+ AC_LANG_ASSERT([C])dnl
+ AC_REQUIRE([MHD_FIND_CC_CFLAG_WWARN])dnl
+ mhd_xFLAGS_params_warn=''
+ _MHD_CHECK_CC_XFLAG_BODY([-Wunused-command-line-argument],[],
+ [
+ MHD_APPEND_FLAG_TO_VAR([mhd_xFLAGS_params_warn],[-Wunused-command-line-argument])
+ ],[],[mhd_cv_cc_flag_Wwarn],[[CFLAGS]]
+ )
+ _MHD_CHECK_CC_XFLAG_BODY([-Wignored-optimization-argument],[],
+ [
+ MHD_APPEND_FLAG_TO_VAR([mhd_xFLAGS_params_warn],[-Wignored-optimization-argument])
+ ],[],[mhd_cv_cc_flag_Wwarn],[[CFLAGS]]
+ )
+ _MHD_CHECK_CC_XFLAG_BODY([-Winvalid-command-line-argument],[],
+ [
+ MHD_APPEND_FLAG_TO_VAR([mhd_xFLAGS_params_warn],[-Winvalid-command-line-argument])
+ ],[],[mhd_cv_cc_flag_Wwarn],[[CFLAGS]]
+ )
+ _MHD_CHECK_CC_XFLAG_BODY([-Wunknown-argument],[],
+ [
+ MHD_APPEND_FLAG_TO_VAR([mhd_xFLAGS_params_warn],[-Wunknown-argument])
+ ],[],[mhd_cv_cc_flag_Wwarn],[[CFLAGS]]
+ )
+ MHD_PREPEND_FLAG_TO_VAR([mhd_xFLAGS_params_warn],[$mhd_cv_cc_flag_Wwarn])
+])
+
+
+#
+# SYNOPSIS
+#
+# MHD_FIND_CC_CFLAG_WWARN()
+#
+AC_DEFUN([MHD_FIND_CC_CFLAG_WWARN],[dnl
+ AC_PREREQ([2.64])dnl for AS_VAR_IF, m4_ifnblank
+ AC_REQUIRE([AC_PROG_CC])dnl
+ AC_LANG_ASSERT([C])dnl
+ AC_MSG_CHECKING([for $[]CC flag to warn on unknown -W parameters])
+ AC_CACHE_VAL([mhd_cv_cc_flag_Wwarn],
+ [
+ mhd_check_cc_flagwarn_save_c_werror_flag="$ac_c_werror_flag"
+ ac_c_werror_flag=yes
+ mhd_find_cc_Wwarn_save_CFLAGS="$CFLAGS"
+ AS_UNSET([mhd_cv_cc_flag_Wwarn])
+ for mhd_cv_cc_flag_Wwarn in '' '-Wunknown-warning-option' '-Werror=unknown-warning-option' ; do
+ AS_VAR_IF([mhd_cv_cc_flag_Wwarn], ["unknown"], [break])
+ [#] Reuse the same source for all the checks here
+ AC_LANG_CONFTEST([AC_LANG_SOURCE([[
+int main(void)
+{
+ return 0;
+}
+ ]])])
+ CFLAGS="-Wmhd-noexist-flag $mhd_find_cc_Wwarn_save_CFLAGS $mhd_cv_cc_flag_Wwarn"
+ AC_LINK_IFELSE([],
+ [],
+ [ [#] Compile and link failed if test flag and non-existing flag added
+ CFLAGS="$mhd_find_cc_Wwarn_save_CFLAGS $mhd_cv_cc_flag_Wwarn"
+ AC_LINK_IFELSE([],
+ [ [#] Compile and link succeed if only test flag added
+ break
+ ]
+ )
+ ]
+ )
+ done
+ CFLAGS="$mhd_find_cc_Wwarn_save_CFLAGS"
+ AS_VAR_IF([mhd_cv_cc_flag_Wwarn], ["unknown"],
+ [
+ _AS_ECHO_LOG([No suitable flags detected. Check whether default flags are correct.])
+ AC_LINK_IFELSE([AC_LANG_SOURCE([[
+int main(void)
+{
+ return 0;
+}
+ ]])],
+ [:],
+ [ [#] Compile and link fails (or warns) with default flags
+ AC_MSG_WARN([Compiler warns (of fails) with default flags!])
+ AC_MSG_WARN([Check whether compiler and compiler flags are correct.])
+ ]
+ )
+ ]
+ )
+ CFLAGS="$mhd_find_cc_Wwarn_save_CFLAGS"
+ AS_UNSET([mhd_find_cc_Wwarn_save_CFLAGS])
+ ac_c_werror_flag="$mhd_check_cc_flagwarn_save_c_werror_flag"
+ AS_UNSET([mhd_check_cc_flagwarn_save_c_werror_flag])
+ ]
+ )
+ AS_IF([test -z "$mhd_cv_cc_flag_Wwarn"],
+ [AC_MSG_RESULT([none needed])],
+ [AC_MSG_RESULT([$mhd_cv_cc_flag_Wwarn])])
+ AS_VAR_IF([mhd_cv_cc_flag_Wwarn], ["unknown"],
+ [AC_MSG_WARN([Unable to find compiler flags to warn on unsupported -W options. Final compiler options may be suboptimal.])])
+
+])
diff --git a/m4/mhd_check_cc_flag.m4 b/m4/mhd_check_cc_flag.m4
@@ -1,254 +0,0 @@
-# SYNOPSIS
-#
-# MHD_CHECK_CC_FLAG([FLAG-TO-TEST], [VARIABLE-TO-PREPEND-CFLAGS],
-# [ACTION-IF-SUPPORTED], [ACTION-IF-NOT-SUPPORTED])
-#
-# DESCRIPTION
-#
-# This macro checks whether the specific compiler flag is supported.
-# The check is performing by prepending FLAG-TO-TEST to CFLAGS, then
-# prepending value of VARIABLE-TO-PREPEND-CFLAGS (if any) to CFLAGS, and
-# then performing compile and link test. If test succeed without warnings,
-# then the flag is considered to be suppoted. Otherwise, if compile and link
-# without test flag can be done without any warning, the flag is considered
-# to be unsuppoted.
-#
-# Example usage:
-#
-# MHD_CHECK_CC_FLAG([-Wshadow], [additional_CFLAGS],
-# [additional_CFLAGS="${additional_CFLAGS} -Wshadow"])
-#
-# Defined cache variable used in check so if any test will not work
-# correctly on some platform, user may simply fix it by giving cache
-# variable in configure parameters, for example:
-#
-# ./configure mhd_cv_cc_fl_supp__wshadow=no
-#
-# This simplify building from source on exotic platforms as patching
-# of configure.ac is not required to change results of tests.
-#
-# LICENSE
-#
-# Copyright (c) 2022 Karlson2k (Evgeny Grin) <k2k@narod.ru>
-#
-# Copying and distribution of this file, with or without modification, are
-# permitted in any medium without royalty provided the copyright notice
-# and this notice are preserved. This file is offered as-is, without any
-# warranty.
-
-#serial 1
-
-AC_DEFUN([MHD_CHECK_CC_FLAG],[dnl
- AC_PREREQ([2.64])dnl for AS_VAR_IF, m4_ifnblank
- AC_LANG_ASSERT([C])dnl
- AC_REQUIRE([AC_PROG_CC])dnl
- m4_ifblank([$1], [m4_fatal([$0: First macro argument must not be empty])])dnl
- m4_bmatch(m4_normalize([$1]), [\s],dnl
- [m4_fatal([$0: First macro argument must not contain whitespaces])])dnl
- m4_bmatch(_mhd_norm_expd([$2]), [\s],dnl
- [m4_fatal([$0: Second macro argument must not contain whitespaces])])dnl
- m4_bmatch([$1], [\$], [m4_fatal([$0: First macro argument must not contain '$'])])dnl
- m4_bmatch([$2], [\$], [m4_fatal([$0: Second macro argument must not contain '$'])])dnl
- AC_REQUIRE([MHD_FIND_CC_FLAG_WARNPARAMS])dnl sets 'mhd_CFLAGS_params_warn' variable
- _MHD_CHECK_CC_FLAG_BODY([$1],[$2],[$3],[$4],[mhd_CFLAGS_params_warn])dnl
-])
-
-
-# SYNOPSIS
-#
-# _MHD_CHECK_CC_FLAG_BODY([FLAG-TO-TEST], [VARIABLE-TO-PREPEND-CFLAGS],
-# [ACTION-IF-SUPPORTED], [ACTION-IF-NOT-SUPPORTED],
-# [VARIABLE-TO-ENABLE-WARNS])
-#
-AC_DEFUN([_MHD_CHECK_CC_FLAG_BODY],[dnl
- AC_LANG_ASSERT([C])dnl
- m4_ifblank([$1], [m4_fatal([$0: First macro argument must not be empty])])dnl
- m4_bmatch(_mhd_norm_expd([$1]), [\s],dnl
- [m4_fatal([$0: First macro argument must not contain whitespaces])])dnl
- m4_bmatch(_mhd_norm_expd([$2]), [\s],dnl
- [m4_fatal([$0: Second macro argument must not contain whitespaces])])dnl
- m4_bmatch([$1], [\$], [m4_fatal([$0: First macro argument must not contain '$'])])dnl
- m4_bmatch([$2], [\$], [m4_fatal([$0: Second macro argument must not contain '$'])])dnl
- m4_ifblank([$5], [m4_fatal([$0: Fifth macro argument must not be empty])])dnl
- m4_bmatch([$5], [\$], [m4_fatal([$0: Fifth macro argument must not contain '$'])])dnl
- AS_VAR_PUSHDEF([cv_Var], [mhd_cv_cc_fl_supp_]m4_bpatsubst(m4_tolower(_mhd_norm_expd([$1])),[[^a-z0-9]],[_]))dnl
- dnl
- AC_CACHE_CHECK([whether $[]CC supports _mhd_norm_expd([$1]) flag], cv_Var,
- [dnl
- AS_VAR_PUSHDEF([save_CFLAGS_Var], [mhd_check_cc_flag_save_CFLAGS])dnl
- AS_VAR_SET([save_CFLAGS_Var],["${CFLAGS}"])
- m4_ifnblank([$2],[dnl
- m4_if(_mhd_norm_expd([$2]),[CFLAGS],
- [CFLAGS="${save_CFLAGS_Var} _mhd_norm_expd([$1]) $[]{_mhd_norm_expd([$5])}"],
- [CFLAGS="$[]{_mhd_norm_expd([$2])} _mhd_norm_expd([$1]) ${save_CFLAGS_Var} $[]{_mhd_norm_expd([$5])}"])
- ],[dnl
- CFLAGS="_mhd_norm_expd([$1]) $[]CFLAGS $[]{_mhd_norm_expd([$5])}"
- ])dnl
- mhd_check_cc_flag_save_c_werror_flag="$ac_c_werror_flag"
- ac_c_werror_flag=yes
- [#] Reuse the same source for all the checks here
- AC_LANG_CONFTEST([AC_LANG_SOURCE([[
-int main(void)
-{
- return 0;
-}
- ]])])
- AC_LINK_IFELSE([],
- [AS_VAR_SET([cv_Var],["yes"])],
- [ [#] Compile and link failed if test flag added
- m4_ifnblank([$2],[dnl
- m4_if(_mhd_norm_expd([$2]),[CFLAGS],
- [CFLAGS="${save_CFLAGS_Var} $[]{_mhd_norm_expd([$5])}"],
- [CFLAGS="$[]{_mhd_norm_expd([$2])} ${save_CFLAGS_Var} $[]{_mhd_norm_expd([$5])}"])
- ],[dnl
- CFLAGS="${save_CFLAGS_Var} $[]{_mhd_norm_expd([$5])}"
- ])dnl
- AC_LINK_IFELSE([],
- [AS_VAR_SET([cv_Var],["no"])],
- [ [#] Compile and link failed if test flag removed as well
- m4_ifnblank([$2],[dnl
- m4_if(_mhd_norm_expd([$2]),[CFLAGS],
- [CFLAGS="${save_CFLAGS_Var} _mhd_norm_expd([$1])"],
- [CFLAGS="$[]{_mhd_norm_expd([$2])} _mhd_norm_expd([$1]) ${save_CFLAGS_Var}"])
- ],[dnl
- CFLAGS="_mhd_norm_expd([$1]) ${save_CFLAGS_Var}"
- ])dnl
- ac_c_werror_flag="$mhd_check_cc_flag_save_c_werror_flag"
- AC_LINK_IFELSE([],
- [AS_VAR_SET([cv_Var],["yes"])],
- [AS_VAR_SET([cv_Var],["no"])],
- )
- ]
- )
- ]
- )
- ac_c_werror_flag="$mhd_check_cc_flag_save_c_werror_flag"
- AS_VAR_SET([CFLAGS],["${save_CFLAGS_Var}"])
- AS_UNSET(save_CFLAGS_Var)
- AS_VAR_POPDEF([save_CFLAGS_Var])dnl
- ]
- )
- m4_ifnblank([$3$4],[dnl
- AS_VAR_IF([cv_Var], ["yes"], [$3], m4_default_nblank([$4]))
- ])dnl
- AS_VAR_POPDEF([cv_Var])dnl
-])
-
-
-#
-# SYNOPSIS
-#
-# MHD_FIND_CC_FLAG_WARNPARAMS()
-#
-AC_DEFUN([MHD_FIND_CC_FLAG_WARNPARAMS],[dnl
- AC_LANG_ASSERT([C])dnl
- AC_REQUIRE([MHD_FIND_CC_FLAG_WWARN])dnl
- mhd_CFLAGS_params_warn=''
- _MHD_CHECK_CC_FLAG_BODY([-Wunused-command-line-argument],[],
- [
- AS_IF([test -z "$mhd_CFLAGS_params_warn"],
- [mhd_CFLAGS_params_warn='-Wunused-command-line-argument'],
- [mhd_CFLAGS_params_warn="$mhd_CFLAGS_params_warn -Wunused-command-line-argument"]
- )
- ],[],[mhd_cv_cc_flag_Wwarn]
- )
- _MHD_CHECK_CC_FLAG_BODY([-Wignored-optimization-argument],[],
- [
- AS_IF([test -z "$mhd_CFLAGS_params_warn"],
- [mhd_CFLAGS_params_warn='-Wignored-optimization-argument'],
- [mhd_CFLAGS_params_warn="$mhd_CFLAGS_params_warn -Wignored-optimization-argument"]
- )
- ],[],[mhd_cv_cc_flag_Wwarn]
- )
- _MHD_CHECK_CC_FLAG_BODY([-Winvalid-command-line-argument],[],
- [
- AS_IF([test -z "$mhd_CFLAGS_params_warn"],
- [mhd_CFLAGS_params_warn='-Winvalid-command-line-argument'],
- [mhd_CFLAGS_params_warn="$mhd_CFLAGS_params_warn -Winvalid-command-line-argument"]
- )
- ],[],[mhd_cv_cc_flag_Wwarn]
- )
- _MHD_CHECK_CC_FLAG_BODY([-Wunknown-argument],[],
- [
- AS_IF([test -z "$mhd_CFLAGS_params_warn"],
- [mhd_CFLAGS_params_warn='-Wunknown-argument'],
- [mhd_CFLAGS_params_warn="$mhd_CFLAGS_params_warn -Wunknown-argument"]
- )
- ],[],[mhd_cv_cc_flag_Wwarn]
- )
- AS_IF([test -z "$mhd_CFLAGS_params_warn"],
- [mhd_CFLAGS_params_warn="$mhd_cv_cc_flag_Wwarn"],
- [mhd_CFLAGS_params_warn="$mhd_cv_cc_flag_Wwarn $mhd_CFLAGS_params_warn"]
- )
-])
-
-
-#
-# SYNOPSIS
-#
-# MHD_FIND_CC_FLAG_WWARN()
-#
-AC_DEFUN([MHD_FIND_CC_FLAG_WWARN],[dnl
- AC_PREREQ([2.64])dnl for AS_VAR_IF, m4_ifnblank
- AC_REQUIRE([AC_PROG_CC])dnl
- AC_LANG_ASSERT([C])dnl
- AC_MSG_CHECKING([for $[]CC flag to warn on unknown -W parameters])
- AC_CACHE_VAL([mhd_cv_cc_flag_Wwarn],
- [
- mhd_check_cc_flagwarn_save_c_werror_flag="$ac_c_werror_flag"
- ac_c_werror_flag=yes
- mhd_find_cc_Wwarn_save_CFLAGS="$CFLAGS"
- AS_UNSET([mhd_cv_cc_flag_Wwarn])
- for mhd_cv_cc_flag_Wwarn in '' '-Wunknown-warning-option' '-Werror=unknown-warning-option' ; do
- AS_VAR_IF([mhd_cv_cc_flag_Wwarn], ["unknown"], [break])
- [#] Reuse the same source for all the checks here
- AC_LANG_CONFTEST([AC_LANG_SOURCE([[
-int main(void)
-{
- return 0;
-}
- ]])])
- CFLAGS="-Wmhd-noexist-flag $mhd_find_cc_Wwarn_save_CFLAGS $mhd_cv_cc_flag_Wwarn"
- AC_LINK_IFELSE([],
- [],
- [ [#] Compile and link failed if test flag and non-existing flag added
- CFLAGS="$mhd_find_cc_Wwarn_save_CFLAGS $mhd_cv_cc_flag_Wwarn"
- AC_LINK_IFELSE([],
- [ [#] Compile and link succeed if only test flag added
- break
- ]
- )
- ]
- )
- done
- CFLAGS="$mhd_find_cc_Wwarn_save_CFLAGS"
- AS_VAR_IF([mhd_cv_cc_flag_Wwarn], ["unknown"],
- [
- _AS_ECHO_LOG([No suitable flags detected. Check whether default flags are correct.])
- AC_LINK_IFELSE([AC_LANG_SOURCE([[
-int main(void)
-{
- return 0;
-}
- ]])],
- [:],
- [ [#] Compile and link fails (or warns) with default flags
- AC_MSG_WARN([Compiler warns (of fails) with default flags!])
- AC_MSG_WARN([Check whether compiler and compiler flags are correct.])
- ]
- )
- ]
- )
- CFLAGS="$mhd_find_cc_Wwarn_save_CFLAGS"
- AS_UNSET([mhd_find_cc_Wwarn_save_CFLAGS])
- ac_c_werror_flag="$mhd_check_cc_flagwarn_save_c_werror_flag"
- AS_UNSET([mhd_check_cc_flagwarn_save_c_werror_flag])
- ]
- )
- AS_IF([test -z "$mhd_cv_cc_flag_Wwarn"],
- [AC_MSG_RESULT([none needed])],
- [AC_MSG_RESULT([$mhd_cv_cc_flag_Wwarn])])
- AS_VAR_IF([mhd_cv_cc_flag_Wwarn], ["unknown"],
- [AC_MSG_WARN([Unable to find compiler flags to warn on unsupported -W options. Final compiler options may be suboptimal.])])
-
-])
diff --git a/m4/mhd_check_cc_ldflag.m4 b/m4/mhd_check_cc_ldflag.m4
@@ -0,0 +1,43 @@
+# SYNOPSIS
+#
+# MHD_CHECK_CC_LDFLAG([FLAG-TO-TEST], [VARIABLE-TO-PREPEND-LDFLAGS],
+# [ACTION-IF-SUPPORTED], [ACTION-IF-NOT-SUPPORTED])
+#
+# DESCRIPTION
+#
+# This macro checks whether the specific compiler flag is supported.
+# The check is performing by prepending FLAG-TO-TEST to LDFLAGS, then
+# prepending value of VARIABLE-TO-PREPEND-LDFLAGS (if any) to LDFLAGS, and
+# then performing compile and link test. If test succeed without warnings,
+# then the flag is considered to be suppoted. Otherwise, if compile and link
+# without test flag can be done without any warning, the flag is considered
+# to be unsuppoted.
+#
+# Example usage:
+#
+# MHD_CHECK_CC_LDFLAG([-pie], [additional_LDFLAGS],
+# [additional_LDFLAGS="${additional_LDFLAGS} -pie"])
+#
+# Defined cache variable used in check so if any test will not work
+# correctly on some platform, user may simply fix it by giving cache
+# variable in configure parameters, for example:
+#
+# ./configure mhd_cv_cc_fl_supp__wshadow=no
+#
+# This simplify building from source on exotic platforms as patching
+# of configure.ac is not required to change results of tests.
+#
+# LICENSE
+#
+# Copyright (c) 2022 Karlson2k (Evgeny Grin) <k2k@narod.ru>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 1
+
+AC_DEFUN([MHD_CHECK_CC_LDFLAG],[dnl
+_MHD_CHECK_CC_XFLAG([$1],[$2],[$3],[$4],[[LDFLAGS]])dnl
+])
diff --git a/m4/mhd_find_add_cc_cflag.m4 b/m4/mhd_find_add_cc_cflag.m4
@@ -0,0 +1,70 @@
+# SYNOPSIS
+#
+# MHD_FIND_ADD_CC_CFLAG([VARIABLE-TO-EXTEND],
+# [FLAG1-TO-TEST], [FLAG2-TO-TEST], ...)
+#
+# DESCRIPTION
+#
+# This macro checks whether the specific compiler flags are supported.
+# The flags are checked one-by-one. The checking is stopped when the first
+# supported flag found.
+# The checks are performing by appending FLAGx-TO-TEST to the value of
+# VARIABLE-TO-EXTEND (CFLAGS if not specified), then prepending result to
+# CFLAGS (unless VARIABLE-TO-EXTEND is CFLAGS), and then performing compile
+# and link test. If test succeed without warnings, then the flag is added to
+# VARIABLE-TO-EXTEND and next flags are not checked. If compile-link cycle
+# cannot be performed without warning with all tested flags, no flag is
+# added to the VARIABLE-TO-EXTEND.
+#
+# Example usage:
+#
+# MHD_CHECK_CC_CFLAG([additional_CFLAGS],
+# [-ggdb3], [-g3], [-ggdb], [-g])
+#
+# Note: Unlike others MHD_CHECK_*CC_CFLAG* macro, this macro uses another
+# order of parameters.
+#
+# LICENSE
+#
+# Copyright (c) 2022 Karlson2k (Evgeny Grin) <k2k@narod.ru>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 1
+
+AC_DEFUN([MHD_FIND_ADD_CC_CFLAG],[dnl
+_MHD_FIND_ADD_CC_XFLAG([[CFLAGS]],$@)])
+
+
+# SYNOPSIS
+#
+# _MHD_FIND_ADD_CC_XFLAG([CFLAGS|LDFLAGS],
+# [VARIABLE-TO-EXTEND],
+# [FLAG1-TO-TEST], [FLAG2-TO-TEST], ...)
+#
+AC_DEFUN([_MHD_FIND_ADD_CC_XFLAG],[dnl
+ AC_PREREQ([2.64])dnl for m4_ifnblank
+ AC_LANG_ASSERT([C])dnl
+ m4_if(m4_eval([$# >= 3]), [0], [m4_fatal([$0: Macro must have at least three parameters])])dnl
+ m4_ifblank([$3],[m4_fatal([$0: Third macro argument must not be empty])])dnl
+ m4_bmatch(_mhd_norm_expd([$1]), [^\(CFLAGS\|LDFLAGS\)$],[],dnl
+ [m4_fatal([$0: First macro argument must be either 'CFLAGS' or 'LDFLAGS; ']_mhd_norm_expd([$5])[' is not supported])])dnl
+ m4_ifnblank([$2],[_MHD_FIND_ADD_CC_XFLAG_BODY($@)],dnl
+ [_MHD_FIND_ADD_CC_XFLAG_BODY([$1],[$1],m4_shift2($@))])dnl
+])
+
+
+m4_define([_MHD_FIND_ADD_CC_XFLAG_BODY],[dnl
+m4_version_prereq([2.64])dnl for m4_ifnblank
+m4_if([$#],[0],[m4_fatal([$0: no parameters])])dnl
+m4_bmatch(_mhd_norm_expd([$1]),[^\(CFLAGS\|LDFLAGS\)$],[],dnl
+[m4_fatal([$0: First macro argument must be either 'CFLAGS' or 'LDFLAGS; ']_mhd_norm_expd([$5])[' is not supported])])dnl
+m4_if([$#],[1],[m4_fatal([$0: not enough parameters])])dnl
+m4_if([$#],[2],[m4_fatal([$0: not enough parameters])])dnl
+m4_if([$#],[3],[m4_ifnblank([$3],[_MHD_CHECK_ADD_CC_XFLAG([$3],[$2],[],[],[$1])])],
+[m4_ifnblank([$3],[_MHD_CHECK_ADD_CC_XFLAG([$3],[$2],[],[$0([$1],[$2],m4_shift3($@))],[$1])],
+[$0([$1],[$2],m4_shift3($@))])])dnl
+])
diff --git a/m4/mhd_find_add_cc_ldflag.m4 b/m4/mhd_find_add_cc_ldflag.m4
@@ -0,0 +1,39 @@
+# SYNOPSIS
+#
+# MHD_FIND_ADD_CC_LDFLAG([VARIABLE-TO-EXTEND],
+# [FLAG1-TO-TEST], [FLAG2-TO-TEST], ...)
+#
+# DESCRIPTION
+#
+# This macro checks whether the specific compiler flags are supported.
+# The flags are checked one-by-one. The checking is stopped when the first
+# supported flag found.
+# The checks are performing by appending FLAGx-TO-TEST to the value of
+# VARIABLE-TO-EXTEND (LDFLAGS if not specified), then prepending result to
+# LDFLAGS (unless VARIABLE-TO-EXTEND is LDFLAGS), and then performing compile
+# and link test. If test succeed without warnings, then the flag is added to
+# VARIABLE-TO-EXTEND and next flags are not checked. If compile-link cycle
+# cannot be performed without warning with all tested flags, no flag is
+# added to the VARIABLE-TO-EXTEND.
+#
+# Example usage:
+#
+# MHD_CHECK_CC_LDFLAG([additional_LDFLAGS],
+# [-Wl,--strip-all], [-Wl,--strip-debug])
+#
+# Note: Unlike others MHD_CHECK_*CC_LDFLAG* macro, this macro uses another
+# order of parameters.
+#
+# LICENSE
+#
+# Copyright (c) 2022 Karlson2k (Evgeny Grin) <k2k@narod.ru>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 1
+
+AC_DEFUN([MHD_FIND_ADD_CC_LDFLAG],[dnl
+_MHD_FIND_ADD_CC_XFLAG([[LDFLAGS]],$@)])