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>
This commit is contained in:
Thiago Macieira 2012-12-21 18:31:54 -08:00 committed by The Qt Project
parent 0520631b2b
commit ebfd85a499
3 changed files with 69 additions and 2 deletions

18
configure vendored
View File

@ -2,6 +2,7 @@
############################################################################# #############################################################################
## ##
## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
## Copyright (C) 2013 Intel Corporation.
## Contact: http://www.qt-project.org/legal ## Contact: http://www.qt-project.org/legal
## ##
## This file is the build configuration utility of the Qt Toolkit. ## This file is the build configuration utility of the Qt Toolkit.
@ -893,6 +894,7 @@ CFG_PCRE=auto
QPA_PLATFORM_GUARD=yes QPA_PLATFORM_GUARD=yes
CFG_CXX11=auto CFG_CXX11=auto
CFG_DIRECTWRITE=no CFG_DIRECTWRITE=no
CFG_WERROR=auto
# initalize variables used for installation # initalize variables used for installation
QT_INSTALL_PREFIX= QT_INSTALL_PREFIX=
@ -2138,6 +2140,13 @@ while [ "$#" -gt 0 ]; do
UNKNOWN_OPT=yes UNKNOWN_OPT=yes
fi fi
;; ;;
warnings-are-errors|Werror)
if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
CFG_WERROR="$VAL"
else
UNKNOWN_OPT=yes
fi
;;
*) *)
UNKNOWN_OPT=yes UNKNOWN_OPT=yes
;; ;;
@ -3296,6 +3305,10 @@ Additional options:
* -no-system-proxies .. Do not use system network proxies by default. * -no-system-proxies .. Do not use system network proxies by default.
-system-proxies ..... 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. $GBN -no-glib ........... Do not compile Glib support.
$GBY -glib .............. Compile Glib support. $GBY -glib .............. Compile Glib support.
EOF EOF
@ -6098,6 +6111,11 @@ else
fi fi
if [ "$CFG_DEV" = "yes" ]; then if [ "$CFG_DEV" = "yes" ]; then
QT_CONFIG="$QT_CONFIG private_tests" 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 fi
cat >>"$QTCONFIG.tmp" <<EOF cat >>"$QTCONFIG.tmp" <<EOF

View File

@ -18,3 +18,37 @@ contains(TEMPLATE, .*lib) {
contains(QT_CONFIG, separate_debug_info): CONFIG += separate_debug_info contains(QT_CONFIG, separate_debug_info): CONFIG += separate_debug_info
contains(QT_CONFIG, separate_debug_info_nocopy): CONFIG += separate_debug_info_nocopy 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
}
}
}

View File

@ -1,6 +1,7 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Copyright (C) 2013 Intel Corporation
** Contact: http://www.qt-project.org/legal ** Contact: http://www.qt-project.org/legal
** **
** This file is part of the tools applications of the Qt Toolkit. ** 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[ "CFG_GCC_SYSROOT" ] = "yes";
dictionary[ "SLOG2" ] = "no"; dictionary[ "SLOG2" ] = "no";
dictionary[ "SYSTEM_PROXIES" ] = "no"; dictionary[ "SYSTEM_PROXIES" ] = "no";
dictionary[ "WERROR" ] = "auto";
//Only used when cross compiling. //Only used when cross compiling.
dictionary[ "QT_INSTALL_SETTINGS" ] = "/etc/xdg"; dictionary[ "QT_INSTALL_SETTINGS" ] = "/etc/xdg";
@ -891,6 +893,11 @@ void Configure::parseCmdLine()
dictionary[ "SYSTEM_PROXIES" ] = "no"; dictionary[ "SYSTEM_PROXIES" ] = "no";
} else if (configCmdLine.at(i) == "-system-proxies") { } else if (configCmdLine.at(i) == "-system-proxies") {
dictionary[ "SYSTEM_PROXIES" ] = "yes"; 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 // Work around compiler nesting limitation
@ -1347,8 +1354,14 @@ void Configure::parseCmdLine()
} }
// Allow tests for private classes to be compiled against internal builds // Allow tests for private classes to be compiled against internal builds
if (dictionary["BUILDDEV"] == "yes") if (dictionary["BUILDDEV"] == "yes") {
qtConfig += "private_tests"; 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") if (dictionary["FORCE_ASSERTS"] == "yes")
qtConfig += "force_asserts"; 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", "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("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) #if !defined(EVAL)
desc( "-qtnamespace <name>", "Wraps all Qt library code in 'namespace name {...}'."); desc( "-qtnamespace <name>", "Wraps all Qt library code in 'namespace name {...}'.");