cmGeneratorTarget: support better errors when checking for C++20 modules

Some callers have their own error reporting mechanisms which give more
context. Support handing off the error string for these use cases.
This commit is contained in:
Ben Boeckel
2023-07-23 13:36:53 -04:00
parent 58d27dc6db
commit 1690e451f7
2 changed files with 23 additions and 16 deletions

View File

@@ -8930,24 +8930,28 @@ bool cmGeneratorTarget::HaveFortranSources(std::string const& config) const
});
}
bool cmGeneratorTarget::HaveCxx20ModuleSources() const
bool cmGeneratorTarget::HaveCxx20ModuleSources(std::string* errorMessage) const
{
auto const& fs_names = this->Target->GetAllFileSetNames();
return std::any_of(fs_names.begin(), fs_names.end(),
[this](std::string const& name) -> bool {
auto const* file_set = this->Target->GetFileSet(name);
if (!file_set) {
this->Makefile->IssueMessage(
MessageType::INTERNAL_ERROR,
cmStrCat("Target \"", this->Target->GetName(),
"\" is tracked to have file set \"", name,
"\", but it was not found."));
return false;
}
return std::any_of(
fs_names.begin(), fs_names.end(),
[this, errorMessage](std::string const& name) -> bool {
auto const* file_set = this->Target->GetFileSet(name);
if (!file_set) {
auto message = cmStrCat("Target \"", this->Target->GetName(),
"\" is tracked to have file set \"", name,
"\", but it was not found.");
if (errorMessage) {
*errorMessage = std::move(message);
} else {
this->Makefile->IssueMessage(MessageType::INTERNAL_ERROR, message);
}
return false;
}
auto const& fs_type = file_set->GetType();
return fs_type == "CXX_MODULES"_s;
});
auto const& fs_type = file_set->GetType();
return fs_type == "CXX_MODULES"_s;
});
}
cmGeneratorTarget::Cxx20SupportLevel cmGeneratorTarget::HaveCxxModuleSupport(

View File

@@ -1264,8 +1264,11 @@ public:
*
* This will inspect the target itself to see if C++20 module
* support is expected to work based on its sources.
*
* If `errorMessage` is given a non-`nullptr`, any error message will be
* stored in it, otherwise the error will be reported directly.
*/
bool HaveCxx20ModuleSources() const;
bool HaveCxx20ModuleSources(std::string* errorMessage = nullptr) const;
enum class Cxx20SupportLevel
{