From bf84d1a1fe1550fb7cb86d686bf0138c1c41e87b Mon Sep 17 00:00:00 2001
From: "Bradley T. Hughes" <bradley.hughes@nokia.com>
Date: Tue, 29 May 2012 07:10:09 +0200
Subject: [PATCH] configure: Auto-detect and enable C++11 support if available

Enabling support for C++11 adds CONFIG+=c++11 to the Qt build. Projects
using Qt can check for C++11 support using contains(QT_CONFIG, c++11) in
their .pr[iof] files.

The QMAKE_CXXFLAGS_CXX11 and QMAKE_LFLAGS_CXX11 qmake varibles contain
any arguments the compiler needs to enable C++11. CONFIG+=c++11 adds
these arguments to the build.

Support for clang, g++, and the Intel C++ Compiler for Linux are
included in this commit.

Change-Id: Id77f86d7ad4d5c740b890446a40b105879a0d327
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
---
 config.tests/unix/c++11/c++11.cpp     | 48 +++++++++++++++++++++++++++
 config.tests/unix/c++11/c++11.pro     |  3 ++
 configure                             | 32 ++++++++++++++++--
 dist/changes-5.0.0                    |  6 ++++
 mkspecs/common/clang.conf             |  3 ++
 mkspecs/common/g++-base.conf          |  3 ++
 mkspecs/features/c++11.prf            |  3 ++
 mkspecs/features/qt_module_config.prf |  1 +
 mkspecs/features/qt_plugin.prf        |  1 +
 mkspecs/linux-icc/qmake.conf          |  2 ++
 10 files changed, 100 insertions(+), 2 deletions(-)
 create mode 100644 config.tests/unix/c++11/c++11.cpp
 create mode 100644 config.tests/unix/c++11/c++11.pro
 create mode 100644 mkspecs/features/c++11.prf

diff --git a/config.tests/unix/c++11/c++11.cpp b/config.tests/unix/c++11/c++11.cpp
new file mode 100644
index 00000000000..d541144bf96
--- /dev/null
+++ b/config.tests/unix/c++11/c++11.cpp
@@ -0,0 +1,48 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the FOO module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
+// Compiler claims to support C++11, trust it
+#else
+#  error "__cplusplus must be >= 201103L"
+#endif
+
+int main(int, char **) { return 0; }
diff --git a/config.tests/unix/c++11/c++11.pro b/config.tests/unix/c++11/c++11.pro
new file mode 100644
index 00000000000..dd4042b8d6f
--- /dev/null
+++ b/config.tests/unix/c++11/c++11.pro
@@ -0,0 +1,3 @@
+SOURCES = c++11.cpp
+CONFIG += c++11
+CONFIG -= qt app_bundle
diff --git a/configure b/configure
index 747ebf3b201..d605fe07e2e 100755
--- a/configure
+++ b/configure
@@ -802,6 +802,7 @@ CFG_ICU=auto
 CFG_FORCE_ASSERTS=no
 CFG_PCRE=auto
 QPA_PLATFORM_GUARD=yes
+CFG_CXX11=auto
 
 # initalize variables used for installation
 QT_INSTALL_PREFIX=
@@ -918,7 +919,7 @@ while [ "$#" -gt 0 ]; do
         VAL=no
         ;;
     #Qt style yes options
-    -profile|-shared|-static|-sm|-xinerama|-xshape|-xsync|-xinput|-xinput2|-egl|-reduce-exports|-pch|-separate-debug-info|-freetype|-xcursor|-xfixes|-xrandr|-xrender|-mitshm|-fontconfig|-xkb|-xcb|-eglfs|-directfb|-nis|-dbus|-dbus-linked|-glib|-gstreamer|-gtkstyle|-cups|-iconv|-largefile|-h|-help|-v|-verbose|-debug|-release|-fast|-accessibility|-confirm-license|-gnumake|-framework|-debug-and-release|-harfbuzz|-prefix-install|-silent|-optimized-qmake|-reduce-relocations|-sse|-openssl|-openssl-linked|-phonon-backend|-audio-backend|-qml-debug|-javascript-jit|-rpath|-pkg-config|-force-pkg-config|-icu|-force-asserts|-testcocoon)
+    -profile|-shared|-static|-sm|-xinerama|-xshape|-xsync|-xinput|-xinput2|-egl|-reduce-exports|-pch|-separate-debug-info|-freetype|-xcursor|-xfixes|-xrandr|-xrender|-mitshm|-fontconfig|-xkb|-xcb|-eglfs|-directfb|-nis|-dbus|-dbus-linked|-glib|-gstreamer|-gtkstyle|-cups|-iconv|-largefile|-h|-help|-v|-verbose|-debug|-release|-fast|-accessibility|-confirm-license|-gnumake|-framework|-debug-and-release|-harfbuzz|-prefix-install|-silent|-optimized-qmake|-reduce-relocations|-sse|-openssl|-openssl-linked|-phonon-backend|-audio-backend|-qml-debug|-javascript-jit|-rpath|-pkg-config|-force-pkg-config|-icu|-force-asserts|-testcocoon|-c++11)
         VAR=`echo $1 | sed "s,^-\(.*\),\1,"`
         VAL=yes
         ;;
@@ -1986,6 +1987,13 @@ while [ "$#" -gt 0 ]; do
             UNKNOWN_OPT=yes
         fi
         ;;
+    c++11)
+        if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
+            CFG_CXX11="$VAL"
+        else
+            UNKNOWN_OPT=yes
+        fi
+        ;;
     *)
         UNKNOWN_OPT=yes
         ;;
@@ -2871,7 +2879,7 @@ if [ "$OPT_HELP" = "yes" ]; then
 Usage:  $relconf [-h] [-prefix <dir>] [-prefix-install] [-bindir <dir>] [-libdir <dir>]
         [-docdir <dir>] [-headerdir <dir>] [-plugindir <dir> ] [-importdir <dir>] [-datadir <dir>]
         [-translationdir <dir>] [-sysconfdir <dir>] [-examplesdir <dir>] [-testsdir <dir>]
-        [-release] [-debug] [-debug-and-release]
+        [-release] [-debug] [-debug-and-release] [-c++11] [-no-c++11]
         [-developer-build] [-shared] [-static] [-no-fast] [-fast] [-no-largefile]
         [-largefile] [-no-accessibility] [-accessibility] [-no-sql-<driver>] [-sql-<driver>]
         [-plugin-sql-<driver>] [-system-sqlite]
@@ -2961,6 +2969,8 @@ Configure options:
     -opensource ........ Compile and link the Open-Source Edition of Qt.
     -commercial ........ Compile and link the Commercial Edition of Qt.
 
+    -no-c++11 .......... Do not compile Qt with C++11 support enabled.
+ +  -c++11 ............. Compile Qt with C++11 support enabled.
 
  *  -shared ............ Create and use shared Qt libraries.
     -static ............ Create and use static Qt libraries.
@@ -3728,6 +3738,21 @@ fi
 # functionality tests
 #-------------------------------------------------------------------------------
 
+# Detect C++11 support
+if [ "$CFG_CXX11" != "no" ]; then
+    if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/c++11 "C++11" $L_FLAGS $I_FLAGS $l_FLAGS; then
+        CFG_CXX11="yes"
+    elif [ "$CFG_CXX11" != "auto" ] && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
+        echo "C++11 support cannot be enabled due to functionality tests!"
+        echo " Turn on verbose messaging (-v) to $0 to see the final report."
+        echo " If you believe this message is in error you may use the continue"
+        echo " switch (-continue) to $0 to continue."
+        exit 101
+    else
+        CFG_CXX11="no"
+    fi
+fi
+
 # detect availability of float math.h functions
 if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/floatmath "floatmath" $L_FLAGS $I_FLAGS $D_FLAGS $l_FLAGS; then
     CFG_USE_FLOATMATH=yes
@@ -5006,6 +5031,8 @@ fi
 # ask for all that hasn't been auto-detected or specified in the arguments
 #-------------------------------------------------------------------------------
 
+[ "$CFG_CXX11" = "yes" ] && QT_CONFIG="$QT_CONFIG c++11"
+
 # ### Vestige
 if [ "$CFG_PHONON_BACKEND" = "yes" ]; then
     QT_CONFIG="$QT_CONFIG phonon-backend"
@@ -5938,6 +5965,7 @@ if [ "$CFG_DEBUG_RELEASE" = "yes" ]; then
 else
    echo "Debug .................. $CFG_DEBUG"
 fi
+echo "C++11 support .......... $CFG_CXX11"
 if [ -n "$PKG_CONFIG" ]; then
     echo "pkg-config ............. yes"
 else
diff --git a/dist/changes-5.0.0 b/dist/changes-5.0.0
index 7b139528263..1775a4c556c 100644
--- a/dist/changes-5.0.0
+++ b/dist/changes-5.0.0
@@ -287,6 +287,12 @@ General Improvements
   more closely match the directory structure of the code under test.
   Integration tests have been moved to tests/auto/integrationtests.
 
+- Qt is compiled with C++11 support enabled by default, provided the compiler
+  supports C++11. Qmake based projects can enable C++11 support explicitly
+  using 'CONFIG+=c++11' in their .pro files. To enable it conditionally, use
+  'contains(QT_CONFIG,c++11):CONFIG+=c++11'. This will enable C++11 support
+  only if Qt was built with C++11 support.
+
 Third party components
 ----------------------
 
diff --git a/mkspecs/common/clang.conf b/mkspecs/common/clang.conf
index 069cdfafecf..67fdf4c1f43 100644
--- a/mkspecs/common/clang.conf
+++ b/mkspecs/common/clang.conf
@@ -15,3 +15,6 @@ QMAKE_CFLAGS_PRECOMPILE          = -x c-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_
 QMAKE_CFLAGS_USE_PRECOMPILE      = -Xclang -include-pch -Xclang ${QMAKE_PCH_OUTPUT}
 QMAKE_CXXFLAGS_PRECOMPILE        = -x c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
 QMAKE_CXXFLAGS_USE_PRECOMPILE    = $$QMAKE_CFLAGS_USE_PRECOMPILE
+
+QMAKE_CXXFLAGS_CXX11 = -std=c++11
+QMAKE_LFLAGS_CXX11   =
diff --git a/mkspecs/common/g++-base.conf b/mkspecs/common/g++-base.conf
index eb5b7d61888..35f86e5bf15 100644
--- a/mkspecs/common/g++-base.conf
+++ b/mkspecs/common/g++-base.conf
@@ -28,3 +28,6 @@ QMAKE_CFLAGS_PRECOMPILE       = -x c-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH
 QMAKE_CFLAGS_USE_PRECOMPILE   = -include ${QMAKE_PCH_OUTPUT_BASE}
 QMAKE_CXXFLAGS_PRECOMPILE     = -x c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
 QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
+
+QMAKE_CXXFLAGS_CXX11 = -std=c++0x
+QMAKE_LFLAGS_CXX11   =
diff --git a/mkspecs/features/c++11.prf b/mkspecs/features/c++11.prf
new file mode 100644
index 00000000000..4b56fa9fd24
--- /dev/null
+++ b/mkspecs/features/c++11.prf
@@ -0,0 +1,3 @@
+QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_CXX11
+QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_CXXFLAGS_CXX11
+QMAKE_LFLAGS += $$QMAKE_LFLAGS_CXX11
diff --git a/mkspecs/features/qt_module_config.prf b/mkspecs/features/qt_module_config.prf
index 217572e1432..b6b0c2ca372 100644
--- a/mkspecs/features/qt_module_config.prf
+++ b/mkspecs/features/qt_module_config.prf
@@ -50,6 +50,7 @@ contains(QT_CONFIG, largefile):CONFIG += largefile
 contains(QT_CONFIG, build_all):CONFIG += build_all
 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, c++11):CONFIG += c++11
 
 #mac frameworks
 mac:!static:contains(QT_CONFIG, qt_framework) {
diff --git a/mkspecs/features/qt_plugin.prf b/mkspecs/features/qt_plugin.prf
index a63ffab8685..768918f65b9 100644
--- a/mkspecs/features/qt_plugin.prf
+++ b/mkspecs/features/qt_plugin.prf
@@ -11,6 +11,7 @@ TARGET = $$qtLibraryTarget($$TARGET)
 contains(QT_CONFIG, reduce_exports):CONFIG += hide_symbols
 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, c++11):CONFIG += c++11
 
 load(qt_targets)
 
diff --git a/mkspecs/linux-icc/qmake.conf b/mkspecs/linux-icc/qmake.conf
index 4884ea1d1f8..eb837254e19 100644
--- a/mkspecs/linux-icc/qmake.conf
+++ b/mkspecs/linux-icc/qmake.conf
@@ -35,6 +35,7 @@ QMAKE_CXXFLAGS_SHLIB	= $$QMAKE_CFLAGS_SHLIB
 QMAKE_CXXFLAGS_STATIC_LIB = $$QMAKE_CFLAGS_STATIC_LIB
 QMAKE_CXXFLAGS_YACC	= $$QMAKE_CFLAGS_YACC
 QMAKE_CXXFLAGS_THREAD	= $$QMAKE_CFLAGS_THREAD
+QMAKE_CXXFLAGS_CXX11    = -std=c++0x
 
 QMAKE_INCDIR		=
 QMAKE_LIBDIR		=
@@ -56,6 +57,7 @@ QMAKE_LFLAGS_SONAME	= -Wl,-soname,
 QMAKE_LFLAGS_THREAD	=
 QMAKE_LFLAGS_NOUNDEF	= -Wl,-z,defs
 QMAKE_LFLAGS_RPATH	= -Wl,-rpath,
+QMAKE_LFLAGS_CXX11      =
 
 QMAKE_LIBS		=
 QMAKE_LIBS_DYNLOAD	= -ldl
-- 
GitLab