cmGeneratorTarget: also check included objects for Fortran modules

Fortran modules provided by objects in `$<TARGET_OBJECTS>` should also
count as "has Fortran modules" for the target referencing the objects.
This commit is contained in:
Ben Boeckel
2023-11-17 22:50:14 -05:00
parent 515ca5fcd1
commit c1fc5455b1
+37 -9
View File
@@ -9090,19 +9090,47 @@ std::string cmGeneratorTarget::GetImportedXcFrameworkPath(
bool cmGeneratorTarget::HaveFortranSources(std::string const& config) const
{
auto sources = this->GetSourceFiles(config);
return std::any_of(sources.begin(), sources.end(),
[](BT<cmSourceFile*> const& sf) -> bool {
return sf.Value->GetLanguage() == "Fortran"_s;
});
bool const have_direct = std::any_of(
sources.begin(), sources.end(), [](BT<cmSourceFile*> const& sf) -> bool {
return sf.Value->GetLanguage() == "Fortran"_s;
});
bool have_via_target_objects = false;
if (!have_direct) {
auto const sourceObjectLibraries = this->GetSourceObjectLibraries(config);
have_via_target_objects =
std::any_of(sourceObjectLibraries.begin(), sourceObjectLibraries.end(),
[&config](cmGeneratorTarget const* tgt) -> bool {
return tgt->HaveFortranSources(config);
});
}
return have_direct || have_via_target_objects;
}
bool cmGeneratorTarget::HaveFortranSources() const
{
auto sources = cmGeneratorTarget::GetAllConfigSources();
return std::any_of(sources.begin(), sources.end(),
[](AllConfigSource const& sf) -> bool {
return sf.Source->GetLanguage() == "Fortran"_s;
});
auto sources = this->GetAllConfigSources();
bool const have_direct = std::any_of(
sources.begin(), sources.end(), [](AllConfigSource const& sf) -> bool {
return sf.Source->GetLanguage() == "Fortran"_s;
});
bool have_via_target_objects = false;
if (!have_direct) {
std::vector<std::string> configs =
this->Makefile->GetGeneratorConfigs(cmMakefile::IncludeEmptyConfig);
for (auto const& config : configs) {
auto const sourceObjectLibraries =
this->GetSourceObjectLibraries(config);
have_via_target_objects =
std::any_of(sourceObjectLibraries.begin(), sourceObjectLibraries.end(),
[&config](cmGeneratorTarget const* tgt) -> bool {
return tgt->HaveFortranSources(config);
});
if (have_via_target_objects) {
break;
}
}
}
return have_direct || have_via_target_objects;
}
bool cmGeneratorTarget::HaveCxx20ModuleSources(std::string* errorMessage) const