summaryrefslogtreecommitdiff
path: root/m4/wget_manywarnings.m4
diff options
context:
space:
mode:
Diffstat (limited to 'm4/wget_manywarnings.m4')
-rw-r--r--m4/wget_manywarnings.m492
1 files changed, 92 insertions, 0 deletions
diff --git a/m4/wget_manywarnings.m4 b/m4/wget_manywarnings.m4
new file mode 100644
index 0000000..9bc5ee5
--- /dev/null
+++ b/m4/wget_manywarnings.m4
@@ -0,0 +1,92 @@
+# wget_manywarnings.m4 serial 1
+dnl Copyright (C) 2016-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Tim Ruehsen
+
+# wget_WORD_SET(RESULT, SET, WORDS)
+# --------------------------------------------------
+# Add each word in WORDS to SET if not already there and store in RESULT.
+# Words separated by whitespace.
+AC_DEFUN([wget_WORD_SET], [
+ ret=$2
+ words=" $2 "
+ for word in $3; do
+ if test "${words#*" $word "}" = "$words"; then ret="$ret $word"; fi
+ done
+ $1=$ret
+])
+
+# wget_WORD_REMOVE(RESULT, SET, WORDS)
+# --------------------------------------------------
+# Remove each word in WORDS from SET and store in RESULT.
+# Words separated by whitespace.
+AC_DEFUN([wget_WORD_REMOVE], [
+ ret=
+ words=" $3 "
+ for word in $2; do
+ if test "${words#*" $word "}" = "$words"; then ret="$ret $word"; fi
+ done
+ $1=$ret
+])
+
+# wget_MANYWARNINGS(VARIABLE, LANGUAGE)
+# -----------------------------
+# Add LANGUAGE related GCC warnings to VARIABLE.
+# This only works for gcc >= 4.3.
+AC_DEFUN([wget_MANYWARNINGS], [
+ #
+ # check if manywarnings is requested
+ #
+ AC_ARG_ENABLE([manywarnings],
+ [AS_HELP_STRING([--enable-manywarnings], [Turn on extra compiler warnings (for developers)])],
+ [case $enableval in
+ yes|no) ;;
+ *) AC_MSG_ERROR([Bad value $enableval for --enable-manywarnings option]) ;;
+ esac
+ wget_manywarnings=$enableval
+ ], [
+ test -f .manywarnings && wget_manywarnings=yes || wget_manywarnings=no
+ ]
+ )
+
+ $1=""
+
+ if test "$wget_manywarnings" = yes; then
+ # AC_PROG_CC sets $GCC to 'yes' if compiler is gcc
+ # AC_REQUIRE([AC_PROG_CC])
+
+ case $CC in
+ *gcc*) CCNAME="gcc";;
+ *clang*) CCNAME="clang";;
+ esac
+
+ if test "$CCNAME" = "gcc"; then
+ test -n "$2" && wget_LANGUAGE=$2 || wget_LANGUAGE=C
+
+ # add -Wall -Wextra to reduce number of warn flags
+ wget_WORD_SET([wget_WARN_CFLAGS], [$CFLAGS], ["-Wall -Wextra -Wformat=2"])
+
+ # collect all disabled warn flags in $WARN_CFLAGS
+ wget_WARN_CFLAGS=$wget_WARN_CFLAGS" "$($CC $wget_WARN_CFLAGS -Q --help=warning,$wget_LANGUAGE|\
+ awk '{ if (([$]2 == "[[disabled]]" || [$]2 == "")\
+ && [$]1!~/=/ && [$]1~/^-W/ && [$]1!~/</ && [$]1!="-Wall") print [$]1 }')
+
+ GCC_VERSION=$($CC -dumpversion | cut -f1 -d.)
+ if test $GCC_VERSION -ge 6; then
+ wget_WARN_CFLAGS=$wget_WARN_CFLAGS" -Warray-bounds=2 -Wnormalized=nfc -Wshift-overflow=2 -Wunused-const-variable=2"
+ fi
+ if test $GCC_VERSION -ge 7; then
+ wget_WARN_CFLAGS=$wget_WARN_CFLAGS" -Wformat-overflow=2 -Wformat-truncation=1 -Wstringop-overflow=2"
+ fi
+
+ elif test "$CCNAME" = "clang"; then
+ # set all warn flags on
+ wget_WORD_SET([wget_WARN_CFLAGS], [$CFLAGS], ["-Weverything"])
+ fi
+
+ $1=$wget_WARN_CFLAGS
+ fi
+])