Browse Source

build: Check availability of warning flags at build time

This fixes a build failure with old g++ compilers not accepting
-Wc++11-compat.
Guillem Jover 10 years ago
parent
commit
0557b5eaca
3 changed files with 80 additions and 18 deletions
  1. 0 3
      TODO
  2. 2 1
      debian/changelog
  3. 78 14
      m4/dpkg-compiler.m4

+ 0 - 3
TODO

@@ -23,9 +23,6 @@ TODO
    (1.x => 2.x) while minor version bump will be used for backwards
    compatible extension (e.g. new fields).
 
- * Build:
-   - Check availability of warning flags at configure time.
-
  * Code cleanup / bug fixes:
    - Get rid of static variables inside functions.
    - Coalesce hash and checksum functions.

+ 2 - 1
debian/changelog

@@ -1,6 +1,7 @@
 dpkg (1.17.3) UNRELEASED; urgency=low
 
-  *
+  * Check availability of warning flags at build time. Fixes a build failure
+    on systems with old g++ compilers not accepting -Wc++11-compat.
 
  -- Guillem Jover <guillem@debian.org>  Thu, 05 Dec 2013 06:50:31 +0100
 

+ 78 - 14
m4/dpkg-compiler.m4

@@ -1,5 +1,56 @@
 # Copyright © 2004 Scott James Remnant <scott@netsplit.com>
-# Copyright © 2006, 2009 Guillem Jover <guillem@debian.org>
+# Copyright © 2006, 2009-2011, 2013 Guillem Jover <guillem@debian.org>
+
+# DPKG_WARNING_CC
+# ---------------
+AC_DEFUN([DPKG_WARNING_CC], [
+  AS_VAR_PUSHDEF([cache_var_name], [dpkg_cv_cflag_$1])
+  AC_CACHE_CHECK([whether $CC accepts $1], [cache_var_name], [
+    dpkg_save_CFLAGS="$CFLAGS"
+    CFLAGS="$1"
+    AC_LANG_PUSH([C])
+    AC_COMPILE_IFELSE([
+      AC_LANG_SOURCE([[]])
+    ], [
+      AS_VAR_SET([cache_var_name], [yes])
+    ],[
+      AS_VAR_SET([cache_var_name], [no])
+    ])
+    AC_LANG_POP([C])
+    CFLAGS="$dpkg_save_CFLAGS"
+  ])
+  AS_VAR_IF([cache_var_name], [yes], [CWARNFLAGS="$CWARNFLAGS $1"])
+  AS_VAR_POPDEF([cache_var_name])
+])
+
+# DPKG_WARNING_CXX
+# ----------------
+AC_DEFUN([DPKG_WARNING_CXX], [
+  AS_VAR_PUSHDEF([cache_var_name], [dpkg_cv_cxxflag_$1])
+  AC_CACHE_CHECK([whether $CXX accepts $1], [cache_var_name], [
+    dpkg_save_CXXFLAGS="$CXXFLAGS"
+    CXXFLAGS="$1"
+    AC_LANG_PUSH([C++])
+    AC_COMPILE_IFELSE([
+      AC_LANG_SOURCE([[]])
+    ], [
+      AS_VAR_SET([cache_var_name], [yes])
+    ], [
+      AS_VAR_SET([cache_var_name], [no])
+    ])
+    AC_LANG_POP([C++])
+    CXXFLAGS="$dpkg_save_CXXFLAGS"
+  ])
+  AS_VAR_IF([cache_var_name], [yes], [CXXWARNFLAGS="$CXXWARNFLAGS $1"])
+  AS_VAR_POPDEF([cache_var_name])
+])
+
+# DPKG_WARNING_ALL
+# ----------------
+AC_DEFUN([DPKG_WARNING_ALL], [
+  DPKG_WARNING_CC([$1])
+  DPKG_WARNING_CXX([$1])
+])
 
 # DPKG_COMPILER_WARNINGS
 # ---------------------
@@ -11,20 +62,33 @@ AC_DEFUN([DPKG_COMPILER_WARNINGS],
 	[],
 	[enable_compiler_warnings=yes])
 
-WFLAGS="-Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers \
-	 -Wmissing-declarations -Wmissing-format-attribute \
-	 -Wformat-security -Wpointer-arith -Wlogical-op \
-	 -Wvla -Winit-self -Wwrite-strings -Wcast-align -Wshadow"
-WCFLAGS="-Wdeclaration-after-statement -Wnested-externs -Wbad-function-cast \
-	 -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition"
-WCXXFLAGS="-Wc++11-compat"
 if test "x$enable_compiler_warnings" = "xyes"; then
-	if test "x$GCC" = "xyes"; then
-		CFLAGS="$WFLAGS $WCFLAGS $CFLAGS"
-        fi
-	if test "x$GXX" = "xyes"; then
-		CXXFLAGS="$WFLAGS $WCXXFLAGS $CXXFLAGS"
-	fi
+  DPKG_WARNING_ALL([-Wall])
+  DPKG_WARNING_ALL([-Wextra])
+  DPKG_WARNING_ALL([-Wno-unused-parameter])
+  DPKG_WARNING_ALL([-Wno-missing-field-initializers])
+  DPKG_WARNING_ALL([-Wmissing-declarations])
+  DPKG_WARNING_ALL([-Wmissing-format-attribute])
+  DPKG_WARNING_ALL([-Wformat-security])
+  DPKG_WARNING_ALL([-Wpointer-arith])
+  DPKG_WARNING_ALL([-Wlogical-op])
+  DPKG_WARNING_ALL([-Wvla])
+  DPKG_WARNING_ALL([-Winit-self])
+  DPKG_WARNING_ALL([-Wwrite-strings])
+  DPKG_WARNING_ALL([-Wcast-align])
+  DPKG_WARNING_ALL([-Wshadow])
+
+  DPKG_WARNING_CC([-Wdeclaration-after-statement])
+  DPKG_WARNING_CC([-Wnested-externs])
+  DPKG_WARNING_CC([-Wbad-function-cast])
+  DPKG_WARNING_CC([-Wstrict-prototypes])
+  DPKG_WARNING_CC([-Wmissing-prototypes])
+  DPKG_WARNING_CC([-Wold-style-definition])
+
+  DPKG_WARNING_CXX([-Wc++11-compat])
+
+  CFLAGS="$CWARNFLAGS $CFLAGS"
+  CXXFLAGS="$CXXWARNFLAGS $CXXFLAGS"
 fi
 ])