Build system: support C++2c

CMake supports it since 3.25 (and we ship Qt with 3.30), so allow the
selection of to-be-C++26.

This patch merely continues the status quo. It does not attempt to
change policy.

Pick-to: 6.10 6.9 6.8 6.5
Change-Id: I6e1e7d76f787d619ad16551114ca92423159917a
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Reviewed-by: Alexey Edelev <alexey.edelev@qt.io>
This commit is contained in:
Marc Mutz 2025-06-24 10:11:30 +02:00
parent 154d175c9b
commit 1685ee36eb
8 changed files with 47 additions and 6 deletions

View File

@ -1570,7 +1570,8 @@ function(qt_run_config_compile_test name)
endif() endif()
if(arg_CXX_STANDARD) if(arg_CXX_STANDARD)
if(${arg_CXX_STANDARD} LESS 23 OR ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.20") if((${arg_CXX_STANDARD} LESS 23 OR ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.20") AND
(${arg_CXX_STANDARD} LESS 26 OR ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.25"))
set(CMAKE_CXX_STANDARD "${arg_CXX_STANDARD}") set(CMAKE_CXX_STANDARD "${arg_CXX_STANDARD}")
set(CMAKE_CXX_STANDARD_REQUIRED OFF) set(CMAKE_CXX_STANDARD_REQUIRED OFF)
endif() endif()

View File

@ -359,7 +359,9 @@ endfunction()
function(qt_set_language_standards) function(qt_set_language_standards)
## Use the latest standard the compiler supports (same as qt_common.prf) ## Use the latest standard the compiler supports (same as qt_common.prf)
if (QT_FEATURE_cxx2b) if (QT_FEATURE_cxx2c)
set(CMAKE_CXX_STANDARD 26 PARENT_SCOPE)
elseif (QT_FEATURE_cxx2b)
set(CMAKE_CXX_STANDARD 23 PARENT_SCOPE) set(CMAKE_CXX_STANDARD 23 PARENT_SCOPE)
elseif (QT_FEATURE_cxx20) elseif (QT_FEATURE_cxx20)
set(CMAKE_CXX_STANDARD 20 PARENT_SCOPE) set(CMAKE_CXX_STANDARD 20 PARENT_SCOPE)

View File

@ -292,6 +292,25 @@ int main(void)
CXX_STANDARD 23 CXX_STANDARD 23
) )
qt_config_compile_test(cxx2c
LABEL "C++2c support"
CODE
"#if __cplusplus > 202302L
// Compiler claims to support C++2c, trust it
#else
# error __cplusplus must be > 202302L (the value for C++23)
#endif
int main(void)
{
/* BEGIN TEST: */
/* END TEST: */
return 0;
}
"
CXX_STANDARD 26
)
qt_config_compiler_supports_flag_test(optimize_debug qt_config_compiler_supports_flag_test(optimize_debug
LABEL "-Og support" LABEL "-Og support"
FLAG "-Og" FLAG "-Og"
@ -730,6 +749,12 @@ qt_feature("c++2b" PUBLIC
CONDITION QT_FEATURE_cxx20 AND (CMAKE_VERSION VERSION_GREATER_EQUAL "3.20") AND TEST_cxx2b CONDITION QT_FEATURE_cxx20 AND (CMAKE_VERSION VERSION_GREATER_EQUAL "3.20") AND TEST_cxx2b
) )
qt_feature_config("c++2b" QMAKE_PUBLIC_QT_CONFIG) qt_feature_config("c++2b" QMAKE_PUBLIC_QT_CONFIG)
qt_feature("c++2c" PUBLIC
LABEL "C++2c"
AUTODETECT OFF
CONDITION QT_FEATURE_cxx2b AND (CMAKE_VERSION VERSION_GREATER_EQUAL "3.25") AND TEST_cxx2c
)
qt_feature_config("c++2c" QMAKE_PUBLIC_QT_CONFIG)
set(__qt_ltcg_detected FALSE) set(__qt_ltcg_detected FALSE)
if(CMAKE_INTERPROCEDURAL_OPTIMIZATION) if(CMAKE_INTERPROCEDURAL_OPTIMIZATION)
set(__qt_ltcg_detected TRUE) set(__qt_ltcg_detected TRUE)

View File

@ -36,11 +36,13 @@ QMAKE_CXXFLAGS_CXX14 = -std=c++1y
QMAKE_CXXFLAGS_CXX1Z = -std=c++1z QMAKE_CXXFLAGS_CXX1Z = -std=c++1z
QMAKE_CXXFLAGS_CXX2A = -std=c++2a QMAKE_CXXFLAGS_CXX2A = -std=c++2a
QMAKE_CXXFLAGS_CXX2B = -std=c++2b QMAKE_CXXFLAGS_CXX2B = -std=c++2b
QMAKE_CXXFLAGS_CXX2C = -std=c++2c
QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++11 QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++11
QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++1y QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++1y
QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z
QMAKE_CXXFLAGS_GNUCXX2A = -std=gnu++2a QMAKE_CXXFLAGS_GNUCXX2A = -std=gnu++2a
QMAKE_CXXFLAGS_GNUCXX2B = -std=gnu++2b QMAKE_CXXFLAGS_GNUCXX2B = -std=gnu++2b
QMAKE_CXXFLAGS_GNUCXX2C = -std=gnu++2c
QMAKE_LFLAGS_CXX11 = QMAKE_LFLAGS_CXX11 =
QMAKE_LFLAGS_CXX14 = QMAKE_LFLAGS_CXX14 =

View File

@ -34,11 +34,13 @@ QMAKE_CXXFLAGS_CXX14 = -std=c++1y
QMAKE_CXXFLAGS_CXX1Z = -std=c++1z QMAKE_CXXFLAGS_CXX1Z = -std=c++1z
QMAKE_CXXFLAGS_CXX2A = -std=c++2a QMAKE_CXXFLAGS_CXX2A = -std=c++2a
QMAKE_CXXFLAGS_CXX2B = -std=c++2b QMAKE_CXXFLAGS_CXX2B = -std=c++2b
QMAKE_CXXFLAGS_CXX2C = -std=c++2c
QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++11 QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++11
QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++1y QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++1y
QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z
QMAKE_CXXFLAGS_GNUCXX2A = -std=gnu++2a QMAKE_CXXFLAGS_GNUCXX2A = -std=gnu++2a
QMAKE_CXXFLAGS_GNUCXX2B = -std=gnu++2b QMAKE_CXXFLAGS_GNUCXX2B = -std=gnu++2b
QMAKE_CXXFLAGS_GNUCXX2C = -std=gnu++2c
QMAKE_LFLAGS_CXX11 = QMAKE_LFLAGS_CXX11 =
QMAKE_LFLAGS_CXX14 = QMAKE_LFLAGS_CXX14 =
QMAKE_LFLAGS_CXX1Z = QMAKE_LFLAGS_CXX1Z =

View File

@ -121,6 +121,7 @@ greaterThan(QMAKE_MSC_VER, 1919) {
MSVC_TOOLSET_VER = 142 MSVC_TOOLSET_VER = 142
QMAKE_CXXFLAGS_CXX2A = -std:c++latest QMAKE_CXXFLAGS_CXX2A = -std:c++latest
QMAKE_CXXFLAGS_CXX2B = -std:c++latest QMAKE_CXXFLAGS_CXX2B = -std:c++latest
QMAKE_CXXFLAGS_CXX2C = -std:c++latest
QMAKE_CXXFLAGS += -Zc:externConstexpr QMAKE_CXXFLAGS += -Zc:externConstexpr
} }

View File

@ -124,17 +124,18 @@ breakpad {
c++17: CONFIG += c++1z c++17: CONFIG += c++1z
c++20: CONFIG += c++2a c++20: CONFIG += c++2a
c++23: CONFIG += c++2b c++23: CONFIG += c++2b
c++latest: CONFIG *= c++2b c++2a c++1z c++14 c++11 c++latest: CONFIG *= c++2c c++2b c++2a c++1z c++14 c++11
!c++1z:!c++2a:!c++2b { !c++1z:!c++2a:!c++2b:!c++2c {
# Qt requires C++17 # Qt requires C++17
QT_COMPILER_STDCXX_no_L = $$replace(QT_COMPILER_STDCXX, "L$", "") QT_COMPILER_STDCXX_no_L = $$replace(QT_COMPILER_STDCXX, "L$", "")
!greaterThan(QT_COMPILER_STDCXX_no_L, 201402): CONFIG += c++1z !greaterThan(QT_COMPILER_STDCXX_no_L, 201402): CONFIG += c++1z
} }
c++1z|c++2a|c++2b { c++1z|c++2a|c++2b|c++2c {
# Disable special compiler flags for host builds # Disable special compiler flags for host builds
!host_build|!cross_compile { !host_build|!cross_compile {
c++2b: cxxstd = CXX2B c++2c: cxxstd = CXX2C
else:c++2b: cxxstd = CXX2B
else:c++2a: cxxstd = CXX2A else:c++2a: cxxstd = CXX2A
else: cxxstd = CXX1Z else: cxxstd = CXX1Z
} else { } else {

View File

@ -174,12 +174,19 @@ function(qt_commandline_cxxstd arg val nextok)
if(val MATCHES "(c\\+\\+)?(17|1z)") if(val MATCHES "(c\\+\\+)?(17|1z)")
qtConfCommandlineDisableFeature(c++20) qtConfCommandlineDisableFeature(c++20)
qtConfCommandlineDisableFeature(c++2b) qtConfCommandlineDisableFeature(c++2b)
qtConfCommandlineDisableFeature(c++2c)
elseif(val MATCHES "(c\\+\\+)?(20|2a)") elseif(val MATCHES "(c\\+\\+)?(20|2a)")
qtConfCommandlineEnableFeature(c++20) qtConfCommandlineEnableFeature(c++20)
qtConfCommandlineDisableFeature(c++2b) qtConfCommandlineDisableFeature(c++2b)
qtConfCommandlineDisableFeature(c++2c)
elseif(val MATCHES "(c\\+\\+)?(23|2b)") elseif(val MATCHES "(c\\+\\+)?(23|2b)")
qtConfCommandlineEnableFeature(c++20) qtConfCommandlineEnableFeature(c++20)
qtConfCommandlineEnableFeature(c++2b) qtConfCommandlineEnableFeature(c++2b)
qtConfCommandlineDisableFeature(c++2c)
elseif(val MATCHES "(c\\+\\+)?(2c)")
qtConfCommandlineEnableFeature(c++20)
qtConfCommandlineEnableFeature(c++2b)
qtConfCommandlineEnableFeature(c++2c)
else() else()
qtConfAddError("Invalid argument '${val}' to command line parameter '${arg}'") qtConfAddError("Invalid argument '${val}' to command line parameter '${arg}'")
endif() endif()