summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorLingkai Dong <lingkai.dong@arm.com>2022-11-10 14:56:18 (GMT)
committerBrad King <brad.king@kitware.com>2022-11-10 16:01:40 (GMT)
commit5e7c8f44ac7d0157d234544e7ec903910985a0fa (patch)
treeb76727e23f123ad252f66809b82734ae69872ace /Source
parente12aa7139306f607d6d85aa8d4c552311503a319 (diff)
downloadCMake-5e7c8f44ac7d0157d234544e7ec903910985a0fa.zip
CMake-5e7c8f44ac7d0157d234544e7ec903910985a0fa.tar.gz
CMake-5e7c8f44ac7d0157d234544e7ec903910985a0fa.tar.bz2
Ninja: Restore support for compilers not defining a C++ standard level
Since commit 386465bf83 (cmTarget: add support for C++ module fileset types, 2022-04-08, v3.25.0-rc1~624^2~7), the Ninja generator checks for C++20 support using logic that requires `CMAKE_<LANG>_STANDARD_DEFAULT` to be non-empty. On some compilers, such as ARMClang, CMake does not automatically detect and set default language standards, thus causing `HaveStandardAvailable` to raise an internal error. To fix this issue, if `CMAKE_CXX_STANDARD_DEFAULT` is empty, assume all standards to be supported instead of calling `HaveStandardAvailable`. This is consistent with how `CompileFeaturesNode::Evaluate` handles this case. Fixes: #24146
Diffstat (limited to 'Source')
-rw-r--r--Source/cmGeneratorTarget.cxx17
1 files changed, 12 insertions, 5 deletions
diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx
index 6195d1f..7d43eb1 100644
--- a/Source/cmGeneratorTarget.cxx
+++ b/Source/cmGeneratorTarget.cxx
@@ -8798,11 +8798,18 @@ cmGeneratorTarget::Cxx20SupportLevel cmGeneratorTarget::HaveCxxModuleSupport(
if (!state->GetLanguageEnabled("CXX")) {
return Cxx20SupportLevel::MissingCxx;
}
- cmStandardLevelResolver standardResolver(this->Makefile);
- if (!standardResolver.HaveStandardAvailable(this, "CXX", config,
- "cxx_std_20")) {
- return Cxx20SupportLevel::NoCxx20;
- }
+ cmValue standardDefault =
+ this->Target->GetMakefile()->GetDefinition("CMAKE_CXX_STANDARD_DEFAULT");
+ if (standardDefault && !standardDefault->empty()) {
+ cmStandardLevelResolver standardResolver(this->Makefile);
+ if (!standardResolver.HaveStandardAvailable(this, "CXX", config,
+ "cxx_std_20")) {
+ return Cxx20SupportLevel::NoCxx20;
+ }
+ }
+ // Else, an empty CMAKE_CXX_STANDARD_DEFAULT means CMake does not detect and
+ // set a default standard level for this compiler, so assume all standards
+ // are available.
if (!this->Makefile->IsOn("CMAKE_EXPERIMENTAL_CXX_MODULE_DYNDEP")) {
return Cxx20SupportLevel::MissingExperimentalFlag;
}