From 23373d01d90c8063cbb5a4fe87c320ebb11c5de7 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sat, 6 Jun 2015 15:53:00 +0200 Subject: [PATCH] configure: Test compiler flags When AC_PROG_CC detects GCC, Make.mk adds a bunch of flags to CFLAGS. Works only for flags that any version of gcc in use accepts. Instead, make configure add the flags that actually work to CFLAGS. This will let us add flags that work only for some compilers. The new autoconf macros are from autoconf-archive v2015.02.24. Unfortunately, AX_APPEND_COMPILE_FLAGS doesn't work reliably for -Wno-*: gcc complains about unknown -Wno-foo only when other diagnostics are being produced. Test -Wfoo instead of -Wno-foo, and rename to MY_APPEND_COMPILE_FLAGS. Signed-off-by: Markus Armbruster --- GNUmakefile.in | 1 - Make.mk | 7 ---- configure.ac | 21 +++++++++- m4/ax_append_flag.m4 | 71 +++++++++++++++++++++++++++++++++ m4/ax_check_compile_flag.m4 | 74 +++++++++++++++++++++++++++++++++++ m4/ax_require_defined.m4 | 37 ++++++++++++++++++ m4/my_append_compile_flags.m4 | 67 +++++++++++++++++++++++++++++++ 7 files changed, 269 insertions(+), 9 deletions(-) create mode 100644 m4/ax_append_flag.m4 create mode 100644 m4/ax_check_compile_flag.m4 create mode 100644 m4/ax_require_defined.m4 create mode 100644 m4/my_append_compile_flags.m4 diff --git a/GNUmakefile.in b/GNUmakefile.in index f60442ad7..4fc42219c 100644 --- a/GNUmakefile.in +++ b/GNUmakefile.in @@ -37,7 +37,6 @@ TARNAME := @PACKAGE_TARNAME@ VERSION := @PACKAGE_VERSION@ CC := @CC@ -have_gcc := @GCC@ CFLAGS := @CFLAGS@ CPPFLAGS := @CPPFLAGS@ @DEFS@ LDFLAGS := @LDFLAGS@ diff --git a/Make.mk b/Make.mk index 3468f54b5..b535e9db0 100644 --- a/Make.mk +++ b/Make.mk @@ -169,13 +169,6 @@ CPPFLAGS += -I$(srcdir)/include -I. ifeq ($(empthread),Windows) # really: W32, regardless of thread package CPPFLAGS += -I$(srcdir)/src/lib/w32 endif -ifeq ($(have_gcc),yes) -CFLAGS += -fno-builtin-carg # conflicts with our carg() -CFLAGS += -fno-common -CFLAGS += -Wall -W -Wno-unused-parameter -Wpointer-arith \ --Wstrict-prototypes -Wmissing-prototypes -Wnested-externs \ --Wredundant-decls -endif $(client): LDLIBS := $(LIBS_client) $(server): LDLIBS := $(LIBS_server) diff --git a/configure.ac b/configure.ac index e49eb3b30..64cea21a6 100644 --- a/configure.ac +++ b/configure.ac @@ -50,7 +50,6 @@ AC_PROG_AWK AC_PROG_INSTALL AC_PROG_RANLIB AC_PROG_CC -AC_SUBST(GCC) AM_PROG_CC_C_O # Private automake macro, tsk, tsk, tsk... _AM_DEPENDENCIES(CC) @@ -81,6 +80,26 @@ LIBS_server="$LIBS" ### Checks for typedefs, structures, and compiler characteristics +# Enable useful warnings +# clang needs to be tested with -Werror=unknown-warning-option +AX_CHECK_COMPILE_FLAG([-Werror=unknown-warning-option], +[cflags_test="-Werror=unknown-warning-option"], +[cflags_test=""]) +MY_APPEND_COMPILE_FLAGS([-Wall -Wextra dnl +-Wmissing-prototypes dnl +-Wnested-externs dnl +-Wpointer-arith dnl +-Wredundant-decls dnl +-Wstrict-prototypes dnl +-Wno-unused-parameter dnl +], [], [$cflags_test]) + +# Our carg() conflicts with libm's TODO clean that up +MY_APPEND_COMPILE_FLAGS([-fno-builtin-carg]) + +# No multiple definitions of uninitialized global variables +MY_APPEND_COMPILE_FLAGS([-fno-common]) + ### Checks for library functions diff --git a/m4/ax_append_flag.m4 b/m4/ax_append_flag.m4 new file mode 100644 index 000000000..aeab89979 --- /dev/null +++ b/m4/ax_append_flag.m4 @@ -0,0 +1,71 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_append_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE]) +# +# DESCRIPTION +# +# FLAG is appended to the FLAGS-VARIABLE shell variable, with a space +# added in between. +# +# If FLAGS-VARIABLE is not specified, the current language's flags (e.g. +# CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains +# FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly +# FLAG. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. +# +# 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_APPEND_FLAG], +[dnl +AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_SET_IF +AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])]) +AS_VAR_SET_IF(FLAGS,[ + AS_CASE([" AS_VAR_GET(FLAGS) "], + [*" $1 "*], [AC_RUN_LOG([: FLAGS already contains $1])], + [ + AS_VAR_APPEND(FLAGS," $1") + AC_RUN_LOG([: FLAGS="$FLAGS"]) + ]) + ], + [ + AS_VAR_SET(FLAGS,[$1]) + AC_RUN_LOG([: FLAGS="$FLAGS"]) + ]) +AS_VAR_POPDEF([FLAGS])dnl +])dnl AX_APPEND_FLAG diff --git a/m4/ax_check_compile_flag.m4 b/m4/ax_check_compile_flag.m4 new file mode 100644 index 000000000..ca3639715 --- /dev/null +++ b/m4/ax_check_compile_flag.m4 @@ -0,0 +1,74 @@ +# =========================================================================== +# http://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 4 + +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 diff --git a/m4/ax_require_defined.m4 b/m4/ax_require_defined.m4 new file mode 100644 index 000000000..cae11112d --- /dev/null +++ b/m4/ax_require_defined.m4 @@ -0,0 +1,37 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_require_defined.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_REQUIRE_DEFINED(MACRO) +# +# DESCRIPTION +# +# AX_REQUIRE_DEFINED is a simple helper for making sure other macros have +# been defined and thus are available for use. This avoids random issues +# where a macro isn't expanded. Instead the configure script emits a +# non-fatal: +# +# ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found +# +# It's like AC_REQUIRE except it doesn't expand the required macro. +# +# Here's an example: +# +# AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG]) +# +# LICENSE +# +# Copyright (c) 2014 Mike Frysinger +# +# 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([AX_REQUIRE_DEFINED], [dnl + m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])]) +])dnl AX_REQUIRE_DEFINED diff --git a/m4/my_append_compile_flags.m4 b/m4/my_append_compile_flags.m4 new file mode 100644 index 000000000..d96fab1d0 --- /dev/null +++ b/m4/my_append_compile_flags.m4 @@ -0,0 +1,67 @@ +# SYNOPSIS +# +# MY_APPEND_COMPILE_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS]) +# +# DESCRIPTION +# +# For every FLAG1, FLAG2 it is checked whether the compiler works with the +# flag. If it does, the flag is added FLAGS-VARIABLE +# +# Works just like AX_APPEND_COMPILE_FLAGS, except when testing +# -Wno-foo, run the compiler with -Wfoo, because gcc complains about +# unknown -Wno-foo only when other diagnostics are being produced. +# +# If FLAGS-VARIABLE is not specified, the current language's flags (e.g. +# CFLAGS) is used. During the check the flag is always added to the +# current language's flags. +# +# 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. +# +# NOTE: This macro depends on the AX_APPEND_FLAG and +# AX_CHECK_COMPILE_FLAG. Please keep this macro in sync with +# MY_APPEND_LINK_FLAGS. +# +# Derived from AX_APPEND_COMPILE_FLAGS, covered by the following +# copyright and permission notice: +# +# LICENSE +# +# 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. + +AC_DEFUN([MY_APPEND_COMPILE_FLAGS], +[AX_REQUIRE_DEFINED([AX_CHECK_COMPILE_FLAG]) +AX_REQUIRE_DEFINED([AX_APPEND_FLAG]) +for flag in $1; do + tflag=`echo "$flag" | sed 's/^-Wno-/-W/'` + AX_CHECK_COMPILE_FLAG([$tflag], [AX_APPEND_FLAG([$flag], [$2])], [], [$3]) +done +])dnl MY_APPEND_COMPILE_FLAGS -- 2.43.0