summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2012-12-21 18:31:54 -0800
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-02-28 23:43:36 +0100
commitebfd85a499a4382ace09d443b1f35cd6b1848af6 (patch)
tree3d957d0d57b49ee34b82a60f316ab5bb88e7e013
parent0520631b2ba04fb99d3d46385f04279cd89a7732 (diff)
Add the infrastructure to compile Qt with -Werror
This is enabled only for -developer-builds and only for certain compiler-version combinations that are in a whitelist. It also requires each library, plugin or tool to declare whether it is supposedly clean of warnings. When most targets are clean, we can consider inverting. Change-Id: I17b5c4e45aee5078f9788e846a45d619c144095a Reviewed-by: Lars Knoll <lars.knoll@digia.com> Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
-rwxr-xr-xconfigure18
-rw-r--r--mkspecs/features/qt_common.prf34
-rw-r--r--tools/configure/configureapp.cpp19
3 files changed, 69 insertions, 2 deletions
diff --git a/configure b/configure
index dbc82b4e47..777de4673e 100755
--- a/configure
+++ b/configure
@@ -2,6 +2,7 @@
#############################################################################
##
## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+## Copyright (C) 2013 Intel Corporation.
## Contact: http://www.qt-project.org/legal
##
## This file is the build configuration utility of the Qt Toolkit.
@@ -893,6 +894,7 @@ CFG_PCRE=auto
QPA_PLATFORM_GUARD=yes
CFG_CXX11=auto
CFG_DIRECTWRITE=no
+CFG_WERROR=auto
# initalize variables used for installation
QT_INSTALL_PREFIX=
@@ -2138,6 +2140,13 @@ while [ "$#" -gt 0 ]; do
UNKNOWN_OPT=yes
fi
;;
+ warnings-are-errors|Werror)
+ if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
+ CFG_WERROR="$VAL"
+ else
+ UNKNOWN_OPT=yes
+ fi
+ ;;
*)
UNKNOWN_OPT=yes
;;
@@ -3296,6 +3305,10 @@ Additional options:
* -no-system-proxies .. Do not use system network proxies by default.
-system-proxies ..... Use system network proxies by default.
+ -no-warnings-are-errors Make warnings be treated normally
+ -warnings-are-errors Make warnings be treated as errors
+ (enabled if -developer-build is active)
+
$GBN -no-glib ........... Do not compile Glib support.
$GBY -glib .............. Compile Glib support.
EOF
@@ -6098,6 +6111,11 @@ else
fi
if [ "$CFG_DEV" = "yes" ]; then
QT_CONFIG="$QT_CONFIG private_tests"
+ if [ "$CFG_WERROR" != "no" ]; then
+ QMAKE_CONFIG="$QMAKE_CONFIG warnings_are_errors"
+ fi
+elif [ "$CFG_WERROR" = "yes" ]; then
+ QMAKE_CONFIG="$QMAKE_CONFIG warnings_are_errors"
fi
cat >>"$QTCONFIG.tmp" <<EOF
diff --git a/mkspecs/features/qt_common.prf b/mkspecs/features/qt_common.prf
index 2400ab0c2c..10b7736749 100644
--- a/mkspecs/features/qt_common.prf
+++ b/mkspecs/features/qt_common.prf
@@ -18,3 +18,37 @@ contains(TEMPLATE, .*lib) {
contains(QT_CONFIG, separate_debug_info): CONFIG += separate_debug_info
contains(QT_CONFIG, separate_debug_info_nocopy): CONFIG += separate_debug_info_nocopy
}
+
+warnings_are_errors:warning_clean {
+ # If the module declares that it has does its clean-up of warnings, enable -Werror.
+ # This setting is compiler-dependent anyway because it depends on the version of the
+ # compiler.
+ clang {
+ # Apple clang 4.0+ or clang 3.1+
+ greaterThan(QT_CLANG_MAJOR_VERSION, 3) | \
+ if(equals(QT_CLANG_MAJOR_VERSION, 3):greaterThan(QT_CLANG_MINOR_VERSION, 1)) | \
+ greaterThan(QT_APPLE_CLANG_MAJOR_VERSION, 3) {
+ QMAKE_CXXFLAGS += -Werror -Wno-error=\\$${LITERAL_HASH}warnings $$WERROR
+ }
+ } else:intel_icc {
+ # Intel CC 13.0+ (a.k.a. Intel Composer XE 2013)
+ greaterThan(QT_ICC_MAJOR_VERSION, 12) {
+ # 177: function "entity" was declared but never referenced
+ # (too aggressive; ICC reports even for functions created due to template instantiation)
+ # 1224: #warning directive
+ # 1881: argument must be a constant null pointer value
+ # (NULL in C++ is usually a literal 0)
+ QMAKE_CXXFLAGS += -Werror -ww177,1224,1881 $$WERROR
+ }
+ } else:gcc {
+ # GCC 4.6+
+ # note: there was no GCC 3.6 and this assumes no one is crazy enough to compile Qt with GCC 2.7
+ greaterThan(QT_GCC_MAJOR_VERSION, 4)|greaterThan(QT_GCC_MINOR_VERSION, 5) {
+ QMAKE_CXXFLAGS += -Werror -Wno-error=cpp $$WERROR
+
+ # GCC prints this bogus warning, after it has inlined a lot of code
+ # error: assuming signed overflow does not occur when assuming that (X + c) < X is always false
+ QMAKE_CXXFLAGS += -Wno-error=strict-overflow
+ }
+ }
+}
diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp
index 29c1e4a661..67db7b3555 100644
--- a/tools/configure/configureapp.cpp
+++ b/tools/configure/configureapp.cpp
@@ -1,6 +1,7 @@
/****************************************************************************
**
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Copyright (C) 2013 Intel Corporation
** Contact: http://www.qt-project.org/legal
**
** This file is part of the tools applications of the Qt Toolkit.
@@ -244,6 +245,7 @@ Configure::Configure(int& argc, char** argv)
dictionary[ "CFG_GCC_SYSROOT" ] = "yes";
dictionary[ "SLOG2" ] = "no";
dictionary[ "SYSTEM_PROXIES" ] = "no";
+ dictionary[ "WERROR" ] = "auto";
//Only used when cross compiling.
dictionary[ "QT_INSTALL_SETTINGS" ] = "/etc/xdg";
@@ -891,6 +893,11 @@ void Configure::parseCmdLine()
dictionary[ "SYSTEM_PROXIES" ] = "no";
} else if (configCmdLine.at(i) == "-system-proxies") {
dictionary[ "SYSTEM_PROXIES" ] = "yes";
+ } else if (configCmdLine.at(i) == "-warnings-are-errors" ||
+ configCmdLine.at(i) == "-Werror") {
+ dictionary[ "WERROR" ] = "yes";
+ } else if (configCmdLine.at(i) == "-no-warnings-are-errors") {
+ dictionary[ "WERROR" ] = "no";
}
// Work around compiler nesting limitation
@@ -1347,8 +1354,14 @@ void Configure::parseCmdLine()
}
// Allow tests for private classes to be compiled against internal builds
- if (dictionary["BUILDDEV"] == "yes")
- qtConfig += "private_tests";
+ if (dictionary["BUILDDEV"] == "yes") {
+ qtConfig << "private_tests";
+ if (dictionary["WERROR"] != "no")
+ qmakeConfig << "warnings_are_errors";
+ } else {
+ if (dictionary["WERROR"] == "yes")
+ qmakeConfig << "warnings_are_errors";
+ }
if (dictionary["FORCE_ASSERTS"] == "yes")
qtConfig += "force_asserts";
@@ -1718,6 +1731,8 @@ bool Configure::displayHelp()
desc("SYSTEM_PROXIES", "yes", "-system-proxies", "Use system network proxies by default.");
desc("SYSTEM_PROXIES", "no", "-no-system-proxies", "Do not use system network proxies by default.\n");
+ desc("WERROR", "yes", "-warnings-are-errors", "Make warnings be treated as errors.");
+ desc("WERROR", "no", "-no-warnings-are-errors","Make warnings be treated normally.");
#if !defined(EVAL)
desc( "-qtnamespace <name>", "Wraps all Qt library code in 'namespace name {...}'.");