diff options
author | Lingkai Dong <lingkai.dong@arm.com> | 2022-11-10 14:56:18 +0000 |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2022-11-10 11:01:40 -0500 |
commit | 5e7c8f44ac7d0157d234544e7ec903910985a0fa (patch) | |
tree | b76727e23f123ad252f66809b82734ae69872ace /Source/cmGeneratorTarget.cxx | |
parent | e12aa7139306f607d6d85aa8d4c552311503a319 (diff) | |
download | cmake-5e7c8f44ac7d0157d234544e7ec903910985a0fa.tar.gz |
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/cmGeneratorTarget.cxx')
-rw-r--r-- | Source/cmGeneratorTarget.cxx | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 6195d1ff07..7d43eb139f 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; } |