1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-18 12:00:31 +01:00

configure: add macro to check compiler flag '-Wstrict-prototype'

Strict prototype are better for portability and to avoid bugs because it
makes sure the compiler has the information to properly validate the
arguments given when a function is called.

This flag however need special care when checking for it, because the
declaration for 'main' generated by autoconf cannot be a strict prototype
so the detection would always see the flag as failing.

This patch handles this by creating a dedicated macro for this detection
which uses a good prototype because we're in a case where it is possible,
so the detection will not always fail; it also makes sure to add the flag
to CFLAG only at the end, to avoid falsely crashing any further test done
in the configure script.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
This commit is contained in:
Christophe CURIS
2014-12-08 22:42:23 +01:00
committed by Carlos R. Mafra
parent 11fe8bd860
commit 30e1fad926
2 changed files with 44 additions and 1 deletions

View File

@@ -129,6 +129,11 @@ AS_IF([test "x$debug" = "xyes"],
dnl more difficult, so try to avoid it
AX_CFLAGS_GCC_OPTION([-Wredundant-decls])
dnl
dnl Prototype of function must be explicit, no deprecated K&R syntax
dnl and no empty argument list which prevents compiler from doing
dnl type checking when using the function
WM_CFLAGS_GCC_OPTION_STRICTPROTO
dnl
dnl Proper attributes helps the compiler to produce better code
WM_CFLAGS_CHECK_FIRST([format attribute suggest],
[-Wsuggest-attribute=format dnl new gcc syntax

View File

@@ -122,6 +122,44 @@ _ACEOF
])
# WM_CFLAGS_GCC_OPTION_STRICTPROTO
# --------------------------------
#
# Check if the compiler support '-Wstrict-prototypes'. This would be done
# traditionally using AX_CFLAGS_GCC_OPTION(...), but in the present case it
# always fail because the test program generated by autoconf always use a
# non-compliant prototype (this is needed for portability to avoid possible
# function declaration mismatch on 'main').
#
# This macro works around this by providing a strict prototype for 'main'
# in this case because we are in a very known case.
AC_DEFUN([WM_CFLAGS_GCC_OPTION_STRICTPROTO],
[AC_CACHE_CHECK([CFLAGS for gcc -Wstrict-prototypes], [wm_cv_c_checks_compopt_Wstrict_prototypes],
[AC_LANG_COMPILER_REQUIRE()dnl
AC_LANG_PUSH([C])
wm_save_CFLAGS="$CFLAGS"
CFLAGS="$wm_save_CFLAGS -pedantic -Werror -Wstrict-prototypes"
AC_COMPILE_IFELSE(
[AC_LANG_SOURCE([dnl
int
main(int argc, char **argv)
{
/* to avoid failing on -Wunused-parameter */
(void) argc;
(void) argv;
return 0;
}])],
[wm_cv_c_checks_compopt_Wstrict_prototypes="-Wstrict-prototypes"],
[wm_cv_c_checks_compopt_Wstrict_prototypes="no"])
CFLAGS="$wm_save_CFLAGS"
AC_LANG_POP([C]) ])
# We cannot add this flag now to CFLAGS because it could break all further
# detections done by configure, the flag will be added at the end by the
# macro WM_CFLAGS_GCC_OPTION_POSTPONED
])
# WM_CFLAGS_GCC_OPTION_POSTPONED
# ------------------------------
#
@@ -133,7 +171,7 @@ _ACEOF
AC_DEFUN_ONCE([WM_CFLAGS_GCC_OPTION_POSTPONED],
[# WM_CFLAGS_GCC_OPTION_POSTPONED: add compiler flags at the end of the autoconf flow
AS_IF([test "x$debug" = "xyes"],
[m4_foreach([arg_name], [[Wunused_macros]],
[m4_foreach([arg_name], [[Wstrict_prototypes], [Wunused_macros]],
[AS_CASE([$wm_cv_c_checks_compopt_[]arg_name],
[no*], [],
[AS_IF([echo " $CFLAGS " | grep " $wm_cv_c_checks_compopt_[]arg_name " 2>&1 > /dev/null],