From ff4444065158285b573c6fc0a91c9e75fc7ddd96 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Wed, 8 Jul 2015 14:09:10 -0700 Subject: Make CONFIG += c++11 by default not disable GNU extensions Prefer -std=gnu++11 unless strict_c++11 is defined. You can enable strict C++11/C++14 mode by using CONFIG += strict_c++ That is enabled for Qt's own code, so we we don't accidentally use GNU extensions in portable code. There's no support for strict C++98 mode (that is, the -ansi option). [ChangeLog][qmake] By default, GNU extensions are now enabled with Clang, GCC and ICC even in C++11 and C++14 modes. To disable the GNU extensions, add to your .pro file: CONFIG += strict_c++. Change-Id: Ib056b47dde3341ef9a52ffff13ef14de2169bef5 Reviewed-by: Kai Koehne Reviewed-by: Oswald Buddenhagen --- mkspecs/common/clang-mac.conf | 2 ++ mkspecs/common/clang.conf | 1 + mkspecs/common/g++-base.conf | 1 + mkspecs/features/c++11.prf | 12 +++++++++--- mkspecs/features/c++14.prf | 12 +++++++++--- mkspecs/features/qt_common.prf | 2 +- mkspecs/linux-icc/qmake.conf | 1 + mkspecs/macx-icc/qmake.conf | 1 + mkspecs/win32-g++/qmake.conf | 1 + src/corelib/corelib.pro | 6 +++--- src/tools/bootstrap/bootstrap.pro | 6 +++--- 11 files changed, 32 insertions(+), 13 deletions(-) diff --git a/mkspecs/common/clang-mac.conf b/mkspecs/common/clang-mac.conf index 3280274f36..1e51142f02 100644 --- a/mkspecs/common/clang-mac.conf +++ b/mkspecs/common/clang-mac.conf @@ -7,4 +7,6 @@ QMAKE_OBJCXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE QMAKE_XCODE_GCC_VERSION = com.apple.compilers.llvm.clang.1_0 QMAKE_CXXFLAGS_CXX11 += -stdlib=libc++ +QMAKE_CXXFLAGS_GNUCXX11 += -stdlib=libc++ QMAKE_LFLAGS_CXX11 += -stdlib=libc++ +QMAKE_LFLAGS_GNUCXX11+= -stdlib=libc++ diff --git a/mkspecs/common/clang.conf b/mkspecs/common/clang.conf index a0a2b3f3d1..ee5fc14458 100644 --- a/mkspecs/common/clang.conf +++ b/mkspecs/common/clang.conf @@ -27,6 +27,7 @@ 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_GNUCXX11 = -std=gnu++11 QMAKE_LFLAGS_CXX11 = QMAKE_LFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG diff --git a/mkspecs/common/g++-base.conf b/mkspecs/common/g++-base.conf index d687dbc3f3..114a441687 100644 --- a/mkspecs/common/g++-base.conf +++ b/mkspecs/common/g++-base.conf @@ -28,4 +28,5 @@ 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_GNUCXX11 = -std=gnu++0x QMAKE_LFLAGS_CXX11 = diff --git a/mkspecs/features/c++11.prf b/mkspecs/features/c++11.prf index 32eaca4a9b..3f31f8ea82 100644 --- a/mkspecs/features/c++11.prf +++ b/mkspecs/features/c++11.prf @@ -1,6 +1,12 @@ -QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_CXX11 -QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_CXXFLAGS_CXX11 -QMAKE_LFLAGS += $$QMAKE_LFLAGS_CXX11 +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 +} contains(QMAKE_LFLAGS, -stdlib=libc++) { equals(QMAKE_MACOSX_DEPLOYMENT_TARGET, 10.6): \ diff --git a/mkspecs/features/c++14.prf b/mkspecs/features/c++14.prf index a54d11840d..076458560d 100644 --- a/mkspecs/features/c++14.prf +++ b/mkspecs/features/c++14.prf @@ -2,15 +2,21 @@ 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): \ + 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): \ + 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): \ + 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 diff --git a/mkspecs/features/qt_common.prf b/mkspecs/features/qt_common.prf index 55f65b5526..2ed43e5063 100644 --- a/mkspecs/features/qt_common.prf +++ b/mkspecs/features/qt_common.prf @@ -12,7 +12,7 @@ QMAKE_DIR_REPLACE_SANE += DESTDIR CONFIG -= debug_and_release_target -contains(QT_CONFIG, c++11): CONFIG += c++11 +contains(QT_CONFIG, c++11): CONFIG += c++11 strict_c++ 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 9190aa9f28..ca9e81512e 100644 --- a/mkspecs/linux-icc/qmake.conf +++ b/mkspecs/linux-icc/qmake.conf @@ -50,6 +50,7 @@ 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_GNUCXX11 = -std=gnu++0x QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG QMAKE_INCDIR = diff --git a/mkspecs/macx-icc/qmake.conf b/mkspecs/macx-icc/qmake.conf index 5e45e67d0c..c145c2c8f3 100644 --- a/mkspecs/macx-icc/qmake.conf +++ b/mkspecs/macx-icc/qmake.conf @@ -53,6 +53,7 @@ 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_GNUCXX11 = -std=gnu++11 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 c6ff808a99..ca5ac2bdce 100644 --- a/mkspecs/win32-g++/qmake.conf +++ b/mkspecs/win32-g++/qmake.conf @@ -56,6 +56,7 @@ 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_GNUCXX11 = -std=gnu++0x QMAKE_CXXFLAGS_SPLIT_SECTIONS = $$QMAKE_CFLAGS_SPLIT_SECTIONS QMAKE_INCDIR = diff --git a/src/corelib/corelib.pro b/src/corelib/corelib.pro index 2d78041752..5cd0bde87b 100644 --- a/src/corelib/corelib.pro +++ b/src/corelib/corelib.pro @@ -13,9 +13,6 @@ irix-cc*:QMAKE_CXXFLAGS += -no_prelink -ptused CONFIG += optimize_full -# otherwise mingw headers do not declare common functions like putenv -mingw:QMAKE_CXXFLAGS_CXX11 = -std=gnu++0x - QMAKE_DOCS = $$PWD/doc/qtcore.qdocconf ANDROID_JAR_DEPENDENCIES = \ @@ -48,6 +45,9 @@ include(statemachine/statemachine.pri) include(mimetypes/mimetypes.pri) include(xml/xml.pri) +# otherwise mingw headers do not declare common functions like putenv +mingw: CONFIG -= strict_c++ + mac|darwin { !ios { LIBS_PRIVATE += -framework ApplicationServices diff --git a/src/tools/bootstrap/bootstrap.pro b/src/tools/bootstrap/bootstrap.pro index be6bcadacb..d5909e68a3 100644 --- a/src/tools/bootstrap/bootstrap.pro +++ b/src/tools/bootstrap/bootstrap.pro @@ -4,9 +4,6 @@ TARGET = QtBootstrap QT = CONFIG += internal_module force_bootstrap -# otherwise mingw headers do not declare common functions like putenv -mingw:QMAKE_CXXFLAGS_CXX11 = -std=gnu++0x - MODULE_DEFINES = \ QT_BOOTSTRAPPED \ QT_LITE_UNICODE \ @@ -49,6 +46,9 @@ QMAKE_SYNCQT_OPTIONS += -version $$QT_VERSION load(qt_module) +# otherwise mingw headers do not declare common functions like putenv +mingw: CONFIG -= strict_c++ + SOURCES += \ ../../corelib/codecs/qlatincodec.cpp \ ../../corelib/codecs/qtextcodec.cpp \ -- cgit v1.2.3