From e4b2b69e828c2ae26730d4643344a0712edeea95 Mon Sep 17 00:00:00 2001 From: Matt Turner Date: Thu, 6 Jul 2017 21:49:05 -0700 Subject: configure: Add and use AX_CHECK_COMPILE_FLAG This makes it a lot clearer what's happening (at least I think so), and will make future additions much simpler. Reviewed-by: Emil Velikov Reviewed-by: Eric Engestrom --- configure.ac | 109 +++++++++++++++----------------------------- m4/ax_check_compile_flag.m4 | 74 ++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+), 72 deletions(-) create mode 100644 m4/ax_check_compile_flag.m4 diff --git a/configure.ac b/configure.ac index 53d52f6d52f..50876b08466 100644 --- a/configure.ac +++ b/configure.ac @@ -282,86 +282,51 @@ esac AM_CONDITIONAL(HAVE_ANDROID, test "x$android" = xyes) -dnl Add flags for gcc and g++ -if test "x$GCC" = xyes; then - CFLAGS="$CFLAGS -Wall" +dnl +dnl Check compiler flags +dnl +AX_CHECK_COMPILE_FLAG([-Wall], [CFLAGS="$CFLAGS -Wall"]) +AX_CHECK_COMPILE_FLAG([-Werror=implicit-function-declaration], [CFLAGS="$CFLAGS -Werror=implicit-function-declaration"]) +AX_CHECK_COMPILE_FLAG([-Werror=missing-prototypes], [CFLAGS="$CFLAGS -Werror=missing-prototypes"]) +AX_CHECK_COMPILE_FLAG([-Wmissing-prototypes], [CFLAGS="$CFLAGS -Wmissing-prototypes"]) +AX_CHECK_COMPILE_FLAG([-fno-math-errno], [CFLAGS="$CFLAGS -fno-math-errno"]) +AX_CHECK_COMPILE_FLAG([-fno-trapping-math], [CFLAGS="$CFLAGS -fno-trapping-math"]) +AX_CHECK_COMPILE_FLAG([-fvisibility=hidden], [VISIBILITY_CFLAGS="-fvisibility=hidden"]) + +dnl +dnl Check C++ compiler flags +dnl +AC_LANG_PUSH([C++]) +AX_CHECK_COMPILE_FLAG([-Wall], [CXXFLAGS="$CXXFLAGS -Wall"]) +AX_CHECK_COMPILE_FLAG([-fno-math-errno], [CXXFLAGS="$CXXFLAGS -fno-math-errno"]) +AX_CHECK_COMPILE_FLAG([-fno-trapping-math], [CXXFLAGS="$CXXFLAGS -fno-trapping-math"]) +AX_CHECK_COMPILE_FLAG([-fvisibility=hidden], [VISIBILITY_CXXFLAGS="-fvisibility=hidden"]) +AC_LANG_POP([C++]) + +# Flags to help ensure that certain portions of the code -- and only those +# portions -- can be built with MSVC: +# - src/util, src/gallium/auxiliary, rc/gallium/drivers/llvmpipe, and +# - non-Linux/Posix OpenGL portions needs to build on MSVC 2013 (which +# supports most of C99) +# - the rest has no compiler compiler restrictions +AX_CHECK_COMPILE_FLAG([-Werror=pointer-arith], [MSVC2013_COMPAT_CFLAGS="-Werror=pointer-arith"]) +AX_CHECK_COMPILE_FLAG([-Werror=vla], [MSVC2013_COMPAT_CFLAGS="-Werror=vla"]) +AC_LANG_PUSH([C++]) +AX_CHECK_COMPILE_FLAG([-Werror=pointer-arith], [MSVC2013_COMPAT_CXXFLAGS="-Werror=pointer-arith"]) +AX_CHECK_COMPILE_FLAG([-Werror=vla], [MSVC2013_COMPAT_CXXFLAGS="-Werror=vla"]) +AC_LANG_POP([C++]) + +AC_SUBST([MSVC2013_COMPAT_CFLAGS]) +AC_SUBST([MSVC2013_COMPAT_CXXFLAGS]) +if test "x$GCC" = xyes; then if test "x$USE_GNU99" = xyes; then CFLAGS="$CFLAGS -std=gnu99" else CFLAGS="$CFLAGS -std=c99" fi - - # Enable -Werror=implicit-function-declaration and - # -Werror=missing-prototypes, if available, or otherwise, just - # -Wmissing-prototypes. This is particularly useful to avoid - # generating a loadable driver module that has undefined symbols. - save_CFLAGS="$CFLAGS" - AC_MSG_CHECKING([whether $CC supports -Werror=missing-prototypes]) - CFLAGS="$CFLAGS -Werror=implicit-function-declaration" - CFLAGS="$CFLAGS -Werror=missing-prototypes" - AC_LINK_IFELSE([AC_LANG_PROGRAM()], - AC_MSG_RESULT([yes]), - [CFLAGS="$save_CFLAGS -Wmissing-prototypes"; - AC_MSG_RESULT([no])]) - - # Enable -fvisibility=hidden if using a gcc that supports it - save_CFLAGS="$CFLAGS" - AC_MSG_CHECKING([whether $CC supports -fvisibility=hidden]) - VISIBILITY_CFLAGS="-fvisibility=hidden" - CFLAGS="$CFLAGS $VISIBILITY_CFLAGS" - AC_LINK_IFELSE([AC_LANG_PROGRAM()], AC_MSG_RESULT([yes]), - [VISIBILITY_CFLAGS=""; AC_MSG_RESULT([no])]) - - # Restore CFLAGS; VISIBILITY_CFLAGS are added to it where needed. - CFLAGS=$save_CFLAGS - - # We don't want floating-point math functions to set errno or trap - CFLAGS="$CFLAGS -fno-math-errno -fno-trapping-math" - - # Flags to help ensure that certain portions of the code -- and only those - # portions -- can be built with MSVC: - # - src/util, src/gallium/auxiliary, rc/gallium/drivers/llvmpipe, and - # - non-Linux/Posix OpenGL portions needs to build on MSVC 2013 (which - # supports most of C99) - # - the rest has no compiler compiler restrictions - MSVC2013_COMPAT_CFLAGS="-Werror=pointer-arith" - MSVC2013_COMPAT_CXXFLAGS="-Werror=pointer-arith" - - # Enable -Werror=vla if compiler supports it - save_CFLAGS="$CFLAGS" - AC_MSG_CHECKING([whether $CC supports -Werror=vla]) - CFLAGS="$CFLAGS -Werror=vla" - AC_LINK_IFELSE([AC_LANG_PROGRAM()], - [MSVC2013_COMPAT_CFLAGS="$MSVC2013_COMPAT_CFLAGS -Werror=vla"; - MSVC2013_COMPAT_CXXFLAGS="$MSVC2013_COMPAT_CXXFLAGS -Werror=vla"; - AC_MSG_RESULT([yes])], - AC_MSG_RESULT([no])) - CFLAGS="$save_CFLAGS" -fi -if test "x$GXX" = xyes; then - CXXFLAGS="$CXXFLAGS -Wall" - - # Enable -fvisibility=hidden if using a gcc that supports it - save_CXXFLAGS="$CXXFLAGS" - AC_MSG_CHECKING([whether $CXX supports -fvisibility=hidden]) - VISIBILITY_CXXFLAGS="-fvisibility=hidden" - CXXFLAGS="$CXXFLAGS $VISIBILITY_CXXFLAGS" - AC_LANG_PUSH([C++]) - AC_LINK_IFELSE([AC_LANG_PROGRAM()], AC_MSG_RESULT([yes]), - [VISIBILITY_CXXFLAGS="" ; AC_MSG_RESULT([no])]) - AC_LANG_POP([C++]) - - # Restore CXXFLAGS; VISIBILITY_CXXFLAGS are added to it where needed. - CXXFLAGS=$save_CXXFLAGS - - # We don't want floating-point math functions to set errno or trap - CXXFLAGS="$CXXFLAGS -fno-math-errno -fno-trapping-math" fi -AC_SUBST([MSVC2013_COMPAT_CFLAGS]) -AC_SUBST([MSVC2013_COMPAT_CXXFLAGS]) - dnl even if the compiler appears to support it, using visibility attributes isn't dnl going to do anything useful currently on cygwin apart from emit lots of warnings case "$host_os" in diff --git a/m4/ax_check_compile_flag.m4 b/m4/ax_check_compile_flag.m4 new file mode 100644 index 00000000000..dcabb92a141 --- /dev/null +++ b/m4/ax_check_compile_flag.m4 @@ -0,0 +1,74 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) +# +# DESCRIPTION +# +# Check whether the given FLAG works with the current language's compiler +# or gives an error. (Warnings, however, are ignored) +# +# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +# success/failure. +# +# If EXTRA-FLAGS is defined, it is added to the current language's default +# flags (e.g. CFLAGS) when the check is done. The check is thus made with +# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to +# force the compiler to issue an error when a bad flag is given. +# +# INPUT gives an alternative input source to AC_COMPILE_IFELSE. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this +# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 5 + +AC_DEFUN([AX_CHECK_COMPILE_FLAG], +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF +AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl +AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ + ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS + _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" + AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], + [AS_VAR_SET(CACHEVAR,[yes])], + [AS_VAR_SET(CACHEVAR,[no])]) + _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) +AS_VAR_IF(CACHEVAR,yes, + [m4_default([$2], :)], + [m4_default([$3], :)]) +AS_VAR_POPDEF([CACHEVAR])dnl +])dnl AX_CHECK_COMPILE_FLAGS -- cgit v1.2.3