From c1fc5455b192e2791010c4bec20b300c7652b712 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Fri, 17 Nov 2023 22:50:14 -0500 Subject: cmGeneratorTarget: also check included objects for Fortran modules Fortran modules provided by objects in `$` should also count as "has Fortran modules" for the target referencing the objects. --- Source/cmGeneratorTarget.cxx | 46 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 29d2af3..146319a 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -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 const& sf) -> bool { - return sf.Value->GetLanguage() == "Fortran"_s; - }); + bool const have_direct = std::any_of( + sources.begin(), sources.end(), [](BT 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 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 -- cgit v0.12