From 5baecbc0ebc11178edd73431b644a5de0a31be25 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 5 Apr 2016 07:51:28 -0700 Subject: [PATCH] Enable GCC warnings in developer builds MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit However, do not fail; just issue the warnings. Add an option --enable-gcc-warnings=warn-only to configure, to implement this. * INSTALL, etc/NEWS: Document this. * configure.ac (gl_GCC_VERSION_IFELSE): New macro, from coreutils. (gl_gcc_warnings, WERROR_CFLAGS): Use it to add new option. Don’t treat --with-x-toolkit=no as a special case when configuring warnings. --- INSTALL | 8 +++++--- configure.ac | 54 ++++++++++++++++++++++++++++++++++------------------ etc/NEWS | 6 ++++++ 3 files changed, 46 insertions(+), 22 deletions(-) diff --git a/INSTALL b/INSTALL index 6f516bd1dd..27af6d9c21 100644 --- a/INSTALL +++ b/INSTALL @@ -318,9 +318,11 @@ Use --enable-gcc-warnings to enable compile-time checks that warn about possibly-questionable C code. This is intended for developers and is useful with GNU-compatible compilers. On a recent GNU system there should be no warnings; on older and on non-GNU systems the -generated warnings may still be useful, though you may prefer building -with 'make WERROR_CFLAGS=' so that the warnings are not treated as -errors. +generated warnings may still be useful, though you may prefer +configuring with --enable-gcc-warnings=warn-only so they are not +treated as errors. The default is --enable-gcc-warnings=warn-only if +it appears to be a developer build, and is --disable-gcc-warnings +otherwise. Use --disable-silent-rules to cause 'make' to give more details about the commands it executes. This can be helpful when debugging a build diff --git a/configure.ac b/configure.ac index f3846f4a25..917ca3a2f3 100644 --- a/configure.ac +++ b/configure.ac @@ -842,17 +842,44 @@ if test "$ac_test_CFLAGS" != set; then esac fi +# gl_GCC_VERSION_IFELSE([major], [minor], [run-if-found], [run-if-not-found]) +# --------------------------------------------------------------------------- +# If $CPP is gcc-MAJOR.MINOR or newer, then run RUN-IF-FOUND. +# Otherwise, run RUN-IF-NOT-FOUND. +AC_DEFUN([gl_GCC_VERSION_IFELSE], + [AC_PREPROC_IFELSE( + [AC_LANG_PROGRAM( + [[ +#if ($1) < __GNUC__ || (($1) == __GNUC__ && ($2) <= __GNUC_MINOR__) +/* ok */ +#else +# error "your version of gcc is older than $1.$2" +#endif + ]]), + ], [$3], [$4]) + ] +) + AC_ARG_ENABLE([gcc-warnings], - [AS_HELP_STRING([--enable-gcc-warnings], - [turn on lots of GCC warnings/errors. This is intended for - developers, and may generate false alarms when used - with older or non-GNU development tools.])], + [AS_HELP_STRING([--enable-gcc-warnings@<:@=TYPE@:>@], + [control generation of GCC warnings. The TYPE 'yes' + means to fail if any warnings are issued; 'warn-only' + means issue warnings without failing (default for + developer builds); 'no' means disable warnings + (default for non-developer builds).])], [case $enableval in - yes|no) ;; + yes|no|warn-only) ;; *) AC_MSG_ERROR([bad value $enableval for gcc-warnings option]) ;; esac gl_gcc_warnings=$enableval], - [gl_gcc_warnings=no] + [# By default, use 'warn-only' if it looks like the invoker of 'configure' + # is a developer as opposed to a builder. This is most likely true + # if GCC is recent enough and there is a .git subdirectory; + # however, if there is also a .tarball-version file it is probably + # just a reliease imported into Git for patch management. + gl_gcc_warnings=no + test -d "$srcdir"/.git && test ! -f "$srcdir"/.tarball-version && + gl_GCC_VERSION_IFELSE([5], [3], [gl_gcc_warnings=warn-only])] ) # clang is unduly picky about some things. @@ -868,7 +895,7 @@ AC_CACHE_CHECK([whether the compiler is clang], [emacs_cv_clang], # When compiling with GCC, prefer -isystem to -I when including system # include files, to avoid generating useless diagnostics for the files. -AS_IF([test "$gl_gcc_warnings" != yes], +AS_IF([test $gl_gcc_warnings = no], [ isystem='-I' AS_IF([test "$emacs_cv_clang" = yes], @@ -892,7 +919,7 @@ AS_IF([test "$gl_gcc_warnings" != yes], nw="$nw -Wwrite-strings" ;; esac - AS_IF([test -z "$nw"], + AS_IF([test $gl_gcc_warnings = yes], [gl_WARN_ADD([-Werror], [WERROR_CFLAGS])]) AC_SUBST([WERROR_CFLAGS]) @@ -2011,17 +2038,6 @@ fi ## $window_system is now set to the window system we will ## ultimately use. -if test "$window_system" = none && test "$gl_gcc_warnings" = yes; then - # Too many warnings for now. - nw= - nw="$nw -Wsuggest-attribute=noreturn" - gl_MANYWARN_COMPLEMENT([WARN_CFLAGS], [$WARN_CFLAGS], [$nw]) - - gl_WARN_ADD([-Wno-unused-variable]) - gl_WARN_ADD([-Wno-unused-but-set-variable]) - gl_WARN_ADD([-Wno-unused-but-set-parameter]) -fi - term_header= HAVE_X_WINDOWS=no HAVE_X11=no diff --git a/etc/NEWS b/etc/NEWS index 6cc1c5ae01..d38bc3d909 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -25,6 +25,12 @@ otherwise leave it unmarked. * Installation Changes in Emacs 25.2 +** The new option 'configure --enable-gcc-warnings=warn-only' causes +GCC to issue warnings without stopping the bild. This behavior is now +the default in developer builds. As before, use +'--disable-gcc-warnings' to suppress GCC's warnings, and +'--enable-gcc-warnings' to stop the build if GCC issues warnings. + +++ ** New configure option '--disable-build-details' attempts to build an Emacs that is more likely to be reproducible; that is, if you build -- 2.39.2