summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2015-07-08 17:21:30 -0700
committerAllan Sandfeld Jensen <allan.jensen@theqtcompany.com>2015-09-05 23:05:40 +0000
commit4684c1afe5fdb3774d56d85a52b2feaab1b8de2c (patch)
treea1b6ffe6e16c9a699dbae5e5d15bb905b6692662
parent041fae00351164fbd72763e4bd947fdeb9956a5d (diff)
Add detection of C++14 and C++1z compiler features
[ChangeLog][General Improvements] Qt's buildsystem now detects whether the compiler supports C++14 and experimental support for C++1z. If the compiler supports it, then Qt is automatically compiled using that support. \ This does not apply to user applications built using qmake: those are still built with C++11 support only. To enable support for C++14 in your application, add to your .pro file: CONFIG += c++14 (similarly for C++1z). Change-Id: Ib056b47dde3341ef9a52ffff13ef1f5d01c42596 Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
-rw-r--r--config.tests/common/c++14/c++14.cpp40
-rw-r--r--config.tests/common/c++14/c++14.pro3
-rw-r--r--config.tests/common/c++1z/c++1z.cpp40
-rw-r--r--config.tests/common/c++1z/c++1z.pro3
-rwxr-xr-xconfigure97
-rw-r--r--mkspecs/common/clang.conf6
-rw-r--r--mkspecs/common/g++-base.conf6
-rw-r--r--mkspecs/common/qcc-base-qnx.conf2
-rw-r--r--mkspecs/features/c++11.prf9
-rw-r--r--mkspecs/features/c++14.prf23
-rw-r--r--mkspecs/features/default_post.prf15
-rw-r--r--mkspecs/features/mac/sdk.prf3
-rw-r--r--mkspecs/features/qt_common.prf2
-rw-r--r--mkspecs/linux-icc/qmake.conf6
-rw-r--r--mkspecs/macx-icc/qmake.conf4
-rw-r--r--mkspecs/win32-g++/qmake.conf6
-rw-r--r--mkspecs/win32-icc/qmake.conf3
-rw-r--r--tools/configure/configureapp.cpp66
18 files changed, 256 insertions, 78 deletions
diff --git a/config.tests/common/c++14/c++14.cpp b/config.tests/common/c++14/c++14.cpp
new file mode 100644
index 0000000000..e17e51831d
--- /dev/null
+++ b/config.tests/common/c++14/c++14.cpp
@@ -0,0 +1,40 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 Intel Corporation.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the configuration module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#if __cplusplus > 201103L
+// Compiler claims to support C++14, trust it
+#else
+# error "__cplusplus must be > 201103L (the value of C++11)"
+#endif
+
+int main(int, char **) { return 0; }
diff --git a/config.tests/common/c++14/c++14.pro b/config.tests/common/c++14/c++14.pro
new file mode 100644
index 0000000000..cbd78ba6fe
--- /dev/null
+++ b/config.tests/common/c++14/c++14.pro
@@ -0,0 +1,3 @@
+SOURCES = c++14.cpp
+CONFIG += c++11 c++14 console
+CONFIG -= qt
diff --git a/config.tests/common/c++1z/c++1z.cpp b/config.tests/common/c++1z/c++1z.cpp
new file mode 100644
index 0000000000..2b61cfec49
--- /dev/null
+++ b/config.tests/common/c++1z/c++1z.cpp
@@ -0,0 +1,40 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 Intel Corporation.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the configuration module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#if __cplusplus > 201402L
+// Compiler claims to support experimental C++1z, trust it
+#else
+# error "__cplusplus must be > 201402L (the value for C++14)"
+#endif
+
+int main(int, char **) { return 0; }
diff --git a/config.tests/common/c++1z/c++1z.pro b/config.tests/common/c++1z/c++1z.pro
new file mode 100644
index 0000000000..3a24946276
--- /dev/null
+++ b/config.tests/common/c++1z/c++1z.pro
@@ -0,0 +1,3 @@
+SOURCES = c++1z.cpp
+CONFIG += c++11 c++14 c++1z console
+CONFIG -= qt
diff --git a/configure b/configure
index 7f65377ac3..b188055143 100755
--- a/configure
+++ b/configure
@@ -769,7 +769,7 @@ CFG_SANITIZE_MEMORY=no
CFG_SANITIZE_UNDEFINED=no
CFG_PCRE=auto
QPA_PLATFORM_GUARD=yes
-CFG_CXX11=auto
+CFG_STDCXX=auto
CFG_DIRECTWRITE=no
CFG_WERROR=auto
CFG_HEADERSCLEAN=auto
@@ -935,6 +935,7 @@ while [ "$#" -gt 0 ]; do
-sdk| \
-arch| \
-host-arch| \
+ -c++std | \
-mysql_config| \
-psql_config| \
-qpa| \
@@ -2234,12 +2235,31 @@ while [ "$#" -gt 0 ]; do
fi
;;
c++11)
- if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
- CFG_CXX11="$VAL"
+ if [ "$VAL" = "yes" ]; then
+ CFG_STDCXX="c++11"
+ elif [ "$VAL" = "no" ]; then
+ CFG_STDCXX="c++98"
else
UNKNOWN_OPT=yes
fi
;;
+ c++std)
+ case "$VAL" in
+ c++98|c++11|c++14|c++1z|auto)
+ CFG_STDCXX="$VAL"
+ ;;
+ 98|11|14|1z)
+ CFG_STDCXX="c++$VAL"
+ ;;
+ 1y|c++1y)
+ CFG_STDCXX="c++14"
+ ;;
+ *)
+ echo >&2 "Invalid C++ edition: $VAL; valid options are: c++98 c++11 c++14 c++1z auto"
+ ERROR=yes
+ ;;
+ esac
+ ;;
system-proxies)
if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
CFG_SYSTEM_PROXIES="$VAL"
@@ -2411,8 +2431,8 @@ Configure options:
-confirm-license ... Automatically acknowledge the license (use with
either -opensource or -commercial)
- -no-c++11 .......... Do not compile Qt with C++11 support enabled.
- + -c++11 ............. Compile Qt with C++11 support enabled.
+ -c++std <edition> .. Compile Qt with C++ standard edition (c++98, c++11, c++14, c++1z)
+ Default: highest supported
* -shared ............ Create and use shared Qt libraries.
-static ............ Create and use static Qt libraries.
@@ -4323,24 +4343,47 @@ if [ "$CFG_SEPARATE_DEBUG_INFO" = "yes" ]; then
fi
fi
-# Detect C++11 support
-if [ "$CFG_CXX11" != "no" ]; then
- # Configure detects compiler features based on cross compiler, so we need
- # to explicitly disable C++11 on Mac to avoid breaking builds where the
- # host compiler does not support it.
- if [ "$BUILD_ON_MAC" = "yes" ] && [ "$XPLATFORM_ANDROID" = "yes" ]; then
- CFG_CXX11="no"
- elif compileTest common/c++11 "C++11"; 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
+# Detect C++11 & up support
+# Configure detects compiler features based on cross compiler, so we need
+# to explicitly disable C++11 on Mac to avoid breaking builds where the
+# host compiler does not support it.
+stdcxx_error=false
+if [ "$BUILD_ON_MAC" = "yes" ] && [ "$XPLATFORM_ANDROID" = "yes" ]; then
+ CFG_STDCXX="c++98"
+elif [ "$CFG_STDCXX" = "c++98" ]; then
+ : # CFG_STDCXX is correct
+elif ! compileTest common/c++11 "C++11"; then
+ if [ "$CFG_STDCXX" != "auto" ]; then
+ stdcxx_error=true
+ else
+ CFG_STDCXX="c++98"
+ fi
+elif [ "$CFG_STDCXX" = "c++11" ]; then
+ : # CFG_STDCXX is correct
+elif ! compileTest common/c++14 "C++14"; then
+ if [ "$CFG_STDCXX" != "auto" ]; then
+ stdcxx_error=true
else
- CFG_CXX11="no"
+ CFG_STDCXX="c++11"
fi
+elif [ "$CFG_STDCXX" = "c++14" ]; then
+ : # CFG_STDCXX is correct
+elif ! compileTest common/c++1z "C++1z"; then
+ if [ "$CFG_STDCXX" != "auto" ]; then
+ stdcxx_error=true
+ else
+ CFG_STDCXX="c++14"
+ fi
+else
+ CFG_STDCXX="c++1z"
+fi
+
+if $stdcxx_error && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
+ echo "$CFG_STDCXX 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
fi
# Detect which edition of the C++ standard the compiler defaults to
@@ -6086,7 +6129,15 @@ fi
# ask for all that hasn't been auto-detected or specified in the arguments
#-------------------------------------------------------------------------------
-[ "$CFG_CXX11" = "yes" ] && QT_CONFIG="$QT_CONFIG c++11"
+if [ "$CFG_STDCXX" != "c++98" ]; then
+ QT_CONFIG="$QT_CONFIG c++11"
+ if [ "$CFG_STDCXX" != "c++11" ]; then
+ QT_CONFIG="$QT_CONFIG c++14"
+ if [ "$CFG_STDCXX" != "c++14" ]; then
+ QT_CONFIG="$QT_CONFIG c++1z"
+ fi
+ fi
+fi
if [ "$CFG_SILENT" = "yes" ]; then
QMAKE_CONFIG="$QMAKE_CONFIG silent"
@@ -7104,7 +7155,7 @@ else
fi
unset build_mode release
echo " Using sanitizer(s)...... $CFG_SANITIZERS"
-echo " Using C++11 ............ $CFG_CXX11"
+echo " Using C++ standard ..... $CFG_STDCXX"
echo " Using gold linker....... $CFG_USE_GOLD_LINKER"
echo " Using new DTAGS ........ $CFG_ENABLE_NEW_DTAGS"
echo " Using PCH .............. $CFG_PRECOMPILE"
diff --git a/mkspecs/common/clang.conf b/mkspecs/common/clang.conf
index ee5fc14458..ee9c1b8371 100644
--- a/mkspecs/common/clang.conf
+++ b/mkspecs/common/clang.conf
@@ -27,9 +27,15 @@ QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
QMAKE_CXXFLAGS_DISABLE_LTCG = $$QMAKE_CFLAGS_DISABLE_LTCG
QMAKE_CXXFLAGS_CXX11 = -std=c++11
+QMAKE_CXXFLAGS_CXX14 = -std=c++1y
+QMAKE_CXXFLAGS_CXX1Z = -std=c++1z
QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++11
+QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++1y
+QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z
QMAKE_LFLAGS_CXX11 =
+QMAKE_LFLAGS_CXX14 =
+QMAKE_LFLAGS_CXX1Z =
QMAKE_LFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
# Wrapper tools that understand .o/.a files with LLVM bytecode instead of machine code
diff --git a/mkspecs/common/g++-base.conf b/mkspecs/common/g++-base.conf
index 114a441687..4254551994 100644
--- a/mkspecs/common/g++-base.conf
+++ b/mkspecs/common/g++-base.conf
@@ -28,5 +28,11 @@ QMAKE_CXXFLAGS_PRECOMPILE = -x c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_P
QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
QMAKE_CXXFLAGS_CXX11 = -std=c++0x
+QMAKE_CXXFLAGS_CXX14 = -std=c++1y
+QMAKE_CXXFLAGS_CXX1Z = -std=c++1z
QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++0x
+QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++1y
+QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z
QMAKE_LFLAGS_CXX11 =
+QMAKE_LFLAGS_CXX14 =
+QMAKE_LFLAGS_CXX1Z =
diff --git a/mkspecs/common/qcc-base-qnx.conf b/mkspecs/common/qcc-base-qnx.conf
index a0a88b9605..f7da151a41 100644
--- a/mkspecs/common/qcc-base-qnx.conf
+++ b/mkspecs/common/qcc-base-qnx.conf
@@ -45,6 +45,8 @@ QMAKE_LIBDIR = $${QNX_DIR}/$${QNX_CPUDIR}/lib $${QNX_DIR}/$${QNX_CPUD
QMAKE_LFLAGS += -Wl,-rpath-link,$${QNX_DIR}/$${QNX_CPUDIR}/lib -Wl,-rpath-link,$${QNX_DIR}/$${QNX_CPUDIR}/usr/lib
QMAKE_CXXFLAGS_CXX11 = -Wc,-std=gnu++0x
+QMAKE_CXXFLAGS_CXX14 = -Wc,-std=gnu++1y
+QMAKE_CXXFLAGS_CXX1Z = -Wc,-std=gnu++1z
QMAKE_LINK_C = $$QMAKE_CC
QMAKE_LINK_C_SHLIB = $$QMAKE_CC
diff --git a/mkspecs/features/c++11.prf b/mkspecs/features/c++11.prf
deleted file mode 100644
index c8a86548ee..0000000000
--- a/mkspecs/features/c++11.prf
+++ /dev/null
@@ -1,9 +0,0 @@
-strict_c++|isEmpty(QMAKE_CXXFLAGS_GNUCXX11) {
- QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_CXX11
- QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_CXXFLAGS_CXX11
- QMAKE_LFLAGS += $$QMAKE_LFLAGS_CXX11
-} else {
- QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_GNUCXX11
- QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_CXXFLAGS_GNUCXX11
- QMAKE_LFLAGS += $$QMAKE_LFLAGS_GNUCXX11
-}
diff --git a/mkspecs/features/c++14.prf b/mkspecs/features/c++14.prf
deleted file mode 100644
index 076458560d..0000000000
--- a/mkspecs/features/c++14.prf
+++ /dev/null
@@ -1,23 +0,0 @@
-intel_icc {
- # ICC does not support C++14 yet
-} else: clang {
- # Clang has supported -std=c++1y since version 3.2
- greaterThan(QT_CLANG_MAJOR_VERSION, 3)|greaterThan(QT_CLANG_MINOR_VERSION, 1) {
- QMAKE_CXXFLAGS_CXX11 = -std=c++1y
- QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++1y
- }
- # Unknown how long Apple Clang has supported -std=c++1y, but at least since XCode 5.0
- greaterThan(QT_APPLE_CLANG_MAJOR_VERSION, 4) {
- QMAKE_CXXFLAGS_CXX11 = -std=c++1y
- QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++1y
- }
-} else: gcc {
- # GCC has supported -std=c++1y since 4.8
- greaterThan(QT_GCC_MAJOR_VERSION, 4)|greaterThan(QT_GCC_MINOR_VERSION, 7) {
- QMAKE_CXXFLAGS_CXX11 = -std=c++1y
- QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++1y
- }
-}
-
-# Delegate to c++11.prf
-include(c++11.prf)
diff --git a/mkspecs/features/default_post.prf b/mkspecs/features/default_post.prf
index bcaddc8363..ebe83af25e 100644
--- a/mkspecs/features/default_post.prf
+++ b/mkspecs/features/default_post.prf
@@ -98,6 +98,21 @@ breakpad {
!isEmpty(QMAKE_STRIP):QMAKE_POST_LINK = $$QMAKE_POST_LINK$$escape_expand(\\n\\t)$$quote($$QMAKE_STRIP $$DEBUGFILENAME)
}
+c++11|c++14|c++1z {
+ c++1z: cxxstd = CXX1Z
+ else: c++14: cxxstd = CXX14
+ else: cxxstd = CXX11
+
+ # Check if we should disable the GNU extensions or not
+ !strict_c++:!isEmpty(QMAKE_CXXFLAGS_GNU$$cxxstd): cxxstd = GNU$$cxxstd
+
+ QMAKE_CXXFLAGS += $$eval(QMAKE_CXXFLAGS_$$cxxstd)
+ QMAKE_OBJECTIVE_CFLAGS += $$eval(QMAKE_CXXFLAGS_$$cxxstd)
+ QMAKE_LFLAGS += $$eval(QMAKE_LFLAGS_$$cxxstd)
+
+ unset(cxxstd)
+}
+
!precompile_header: SOURCES += $$NO_PCH_SOURCES
QMAKE_INCDIR += $$QMAKE_INCDIR_POST
diff --git a/mkspecs/features/mac/sdk.prf b/mkspecs/features/mac/sdk.prf
index e238f8e005..a5643e311d 100644
--- a/mkspecs/features/mac/sdk.prf
+++ b/mkspecs/features/mac/sdk.prf
@@ -72,9 +72,6 @@ isEmpty(QMAKE_MAC_SDK.$${QMAKE_MAC_SDK}.platform_name) {
# FIXME: Get the version_min_flag out of the platform's 'Native Build System.xcspec'
version_identifier = $$replace(QMAKE_MAC_PLATFORM_NAME, iphonesimulator, ios-simulator)
- # C++11 support may affect the deployment target
- c++11: load(c++11)
-
ios:!host_build: \
deployment_target = $$QMAKE_IOS_DEPLOYMENT_TARGET
else: \
diff --git a/mkspecs/features/qt_common.prf b/mkspecs/features/qt_common.prf
index 2ed43e5063..4fb04339f8 100644
--- a/mkspecs/features/qt_common.prf
+++ b/mkspecs/features/qt_common.prf
@@ -13,6 +13,8 @@ QMAKE_DIR_REPLACE_SANE += DESTDIR
CONFIG -= debug_and_release_target
contains(QT_CONFIG, c++11): CONFIG += c++11 strict_c++
+contains(QT_CONFIG, c++14): CONFIG += c++14
+contains(QT_CONFIG, c++1z): CONFIG += c++1z
contains(TEMPLATE, .*lib) {
# module and plugins
!host_build:contains(QT_CONFIG, reduce_exports): CONFIG += hide_symbols
diff --git a/mkspecs/linux-icc/qmake.conf b/mkspecs/linux-icc/qmake.conf
index ca9e81512e..38f1fe41a7 100644
--- a/mkspecs/linux-icc/qmake.conf
+++ b/mkspecs/linux-icc/qmake.conf
@@ -50,7 +50,11 @@ QMAKE_CXXFLAGS_SPLIT_SECTIONS = $$QMAKE_CFLAGS_SPLIT_SECTIONS
# Disabling exceptions disabled - workaround for QTBUG-36577
#QMAKE_CXXFLAGS_EXCEPTIONS_OFF = -fno-exceptions
QMAKE_CXXFLAGS_CXX11 = -std=c++0x
+QMAKE_CXXFLAGS_CXX14 = -std=c++1y
+QMAKE_CXXFLAGS_CXX1Z = -std=c++1z
QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++0x
+QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++1y
+QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z
QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
QMAKE_INCDIR =
@@ -73,6 +77,8 @@ QMAKE_LFLAGS_NOUNDEF = -Wl,-z,defs
QMAKE_LFLAGS_RPATH = -Wl,-rpath,
QMAKE_LFLAGS_RPATHLINK = -Wl,-rpath-link,
QMAKE_LFLAGS_CXX11 =
+QMAKE_LFLAGS_CXX14 =
+QMAKE_LFLAGS_CXX1Z =
QMAKE_LFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
QMAKE_LIBS =
diff --git a/mkspecs/macx-icc/qmake.conf b/mkspecs/macx-icc/qmake.conf
index c145c2c8f3..ffd95973ce 100644
--- a/mkspecs/macx-icc/qmake.conf
+++ b/mkspecs/macx-icc/qmake.conf
@@ -53,7 +53,11 @@ 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++11
+QMAKE_CXXFLAGS_CXX14 = -std=c++1y
+QMAKE_CXXFLAGS_CXX1Z = -std=c++1z
QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++11
+QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++1y
+QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z
QMAKE_CXXFLAGS_SPLIT_SECTIONS = $$QMAKE_CFLAGS_SPLIT_SECTIONS
QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
diff --git a/mkspecs/win32-g++/qmake.conf b/mkspecs/win32-g++/qmake.conf
index 019c220de5..388d697b58 100644
--- a/mkspecs/win32-g++/qmake.conf
+++ b/mkspecs/win32-g++/qmake.conf
@@ -56,7 +56,11 @@ QMAKE_CXXFLAGS_RTTI_OFF = -fno-rtti
QMAKE_CXXFLAGS_EXCEPTIONS_ON = -fexceptions -mthreads
QMAKE_CXXFLAGS_EXCEPTIONS_OFF = -fno-exceptions
QMAKE_CXXFLAGS_CXX11 = -std=c++0x
+QMAKE_CXXFLAGS_CXX14 = -std=c++1y
+QMAKE_CXXFLAGS_CXX1Z = -std=c++1z
QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++0x
+QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++1y
+QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z
QMAKE_CXXFLAGS_SPLIT_SECTIONS = $$QMAKE_CFLAGS_SPLIT_SECTIONS
QMAKE_INCDIR =
@@ -77,6 +81,8 @@ QMAKE_LFLAGS_CONSOLE = -Wl,-subsystem,console
QMAKE_LFLAGS_WINDOWS = -Wl,-subsystem,windows
QMAKE_LFLAGS_DLL = -shared
QMAKE_LFLAGS_CXX11 =
+QMAKE_LFLAGS_CXX14 =
+QMAKE_LFLAGS_CXX1Z =
QMAKE_LFLAGS_GCSECTIONS = -Wl,--gc-sections
QMAKE_LFLAGS_USE_GOLD = -fuse-ld=gold
QMAKE_LINK_OBJECT_MAX = 10
diff --git a/mkspecs/win32-icc/qmake.conf b/mkspecs/win32-icc/qmake.conf
index 31c87fff26..ff38ada670 100644
--- a/mkspecs/win32-icc/qmake.conf
+++ b/mkspecs/win32-icc/qmake.conf
@@ -46,6 +46,9 @@ QMAKE_CXXFLAGS_RTTI_OFF =
QMAKE_CXXFLAGS_EXCEPTIONS_ON = -EHsc
QMAKE_CXXFLAGS_EXCEPTIONS_OFF =
QMAKE_CXXFLAGS_CXX11 = -Qstd=c++11
+# ICC supports the following but Qt won't compile
+#QMAKE_CXXFLAGS_CXX14 = -Qstd=c++14
+#QMAKE_CXXFLAGS_CXX1Z = -Qstd=c++1z
QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
QMAKE_INCDIR =
diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp
index 6a7a217446..ab4e091d6b 100644
--- a/tools/configure/configureapp.cpp
+++ b/tools/configure/configureapp.cpp
@@ -238,7 +238,7 @@ Configure::Configure(int& argc, char** argv)
dictionary[ "COMPILE_EXAMPLES" ] = "yes";
- dictionary[ "C++11" ] = "auto";
+ dictionary[ "C++STD" ] = "auto";
dictionary[ "USE_GOLD_LINKER" ] = "no";
@@ -464,9 +464,29 @@ void Configure::parseCmdLine()
}
else if (configCmdLine.at(i) == "-c++11")
- dictionary[ "C++11" ] = "yes";
+ dictionary[ "C++STD" ] = "c++11";
else if (configCmdLine.at(i) == "-no-c++11")
- dictionary[ "C++11" ] = "no";
+ dictionary[ "C++STD" ] = "c++98";
+ else if (configCmdLine.at(i) == "-c++std") {
+ ++i;
+ if (i == argCount)
+ break;
+
+ QString level = configCmdLine.at(i);
+ if (level == "c++98" || level == "c++11" || level == "c++14" || level == "c++1z"
+ || level == "auto") {
+ dictionary[ "C++STD" ] = level;
+ } else if (level == "98" || level == "11" || level == "14" || level == "1z") {
+ dictionary[ "C++STD" ] = "c++" + level;
+ } else {
+ dictionary[ "DONE" ] = "error";
+ cout << "ERROR: invalid C++ standard " << level
+ << "; valid options are: c++98 c++11 c++14 c++1z auto" << endl;
+ return;
+ }
+ }
+
+
else if (configCmdLine.at(i) == "-use-gold-linker")
dictionary[ "USE_GOLD_LINKER" ] = "yes";
else if (configCmdLine.at(i) == "-no-use-gold-linker")
@@ -1791,8 +1811,8 @@ bool Configure::displayHelp()
desc("OPENSOURCE", "opensource", "-opensource", "Compile and link the Open-Source Edition of Qt.");
desc("COMMERCIAL", "commercial", "-commercial", "Compile and link the Commercial Edition of Qt.\n");
- desc("C++11", "yes", "-c++11", "Compile Qt with C++11 support enabled.");
- desc("C++11", "no", "-no-c++11", "Do not compile Qt with C++11 support enabled.\n");
+ desc( "-c++std <edition>", "Compile Qt with C++ standard edition (c++98, c++11, c++14, c++1z)\n"
+ "Default: highest supported. This option is not supported for MSVC.\n");
desc("USE_GOLD_LINKER", "yes", "-use-gold-linker", "Link using the GNU gold linker (gcc only).");
desc("USE_GOLD_LINKER", "no", "-no-use-gold-linker", "Do not link using the GNU gold linker.\n");
@@ -2117,7 +2137,7 @@ QString Configure::defaultTo(const QString &option)
return "no";
// keep 'auto' default for msvc, since we can't set the language supported
- if (option == "C++11"
+ if (option == "C++STD"
&& dictionary["QMAKESPEC"].contains("msvc"))
return "auto";
@@ -2338,9 +2358,16 @@ void Configure::autoDetection()
// Auto-detect CPU architectures.
detectArch();
- if (dictionary["C++11"] == "auto") {
- if (!dictionary["QMAKESPEC"].contains("msvc"))
- dictionary["C++11"] = tryCompileProject("common/c++11") ? "yes" : "no";
+ if (dictionary["C++STD"] == "auto" && !dictionary["QMAKESPEC"].contains("msvc")) {
+ if (!tryCompileProject("common/c++11")) {
+ dictionary["C++STD"] = "c++98";
+ } else if (!tryCompileProject("common/c++14")) {
+ dictionary["C++STD"] = "c++11";
+ } else if (!tryCompileProject("common/c++1z")) {
+ dictionary["C++STD"] = "c++14";
+ } else {
+ dictionary["C++STD"] = "c++1z";
+ }
}
if (!dictionary["QMAKESPEC"].contains("msvc")) {
@@ -2544,16 +2571,11 @@ void Configure::autoDetection()
bool Configure::verifyConfiguration()
{
bool prompt = false;
- if (dictionary["C++11"] != "auto"
+ if (dictionary["C++STD"] != "auto"
&& dictionary["QMAKESPEC"].contains("msvc")) {
- cout << "WARNING: Qt does not support disabling or enabling any existing C++11 support "
- "with MSVC compilers.";
- if (dictionary["C++11"] == "yes")
- cout << "Therefore -c++11 is ignored." << endl << endl;
- else
- cout << "Therefore -no-c++11 is ignored." << endl << endl;
-
- dictionary["C++11"] = "auto";
+ cout << "WARNING: It is not possible to change the C++ standard edition with MSVC compilers. "
+ "Therefore, the option -c++std " << dictionary["C++STD"] << " was ignored." << endl << endl;
+ dictionary["C++STD"] = "auto";
}
if (dictionary["STATIC_RUNTIME"] == "yes" && dictionary["SHARED"] == "yes") {
@@ -2695,8 +2717,12 @@ void Configure::generateOutputVars()
qtConfig += "release";
}
- if (dictionary[ "C++11" ] == "yes")
+ if (dictionary[ "C++STD" ] == "c++11")
qtConfig += "c++11";
+ else if (dictionary[ "C++STD" ] == "c++14")
+ qtConfig += "c++11 c++14";
+ else if (dictionary[ "C++STD" ] == "c++1z")
+ qtConfig += "c++11 c++14 c++1z";
if (!dictionary[ "CFG_STDCXX_DEFAULT" ].isEmpty())
qmakeVars += "QT_COMPILER_STDCXX = " + dictionary[ "CFG_STDCXX_DEFAULT" ];
@@ -3773,7 +3799,7 @@ void Configure::displayConfig()
}
if (dictionary[ "BUILD" ] == "release" || dictionary[ "BUILDALL" ] == "yes")
sout << "Force debug info............" << dictionary[ "FORCEDEBUGINFO" ] << endl;
- sout << "C++11 support..............." << dictionary[ "C++11" ] << endl;
+ sout << "C++ language standard......." << dictionary[ "C++STD" ] << endl;
sout << "Link Time Code Generation..." << dictionary[ "LTCG" ] << endl;
sout << "Accessibility support......." << dictionary[ "ACCESSIBILITY" ] << endl;
sout << "RTTI support................" << dictionary[ "RTTI" ] << endl;