Merge topic 'module-depends-static-lib-cycle'

01d7860fdb Ninja,Makefile: Restore Fortran module scanning in static library cycle
846baa7c5b cmGlobalGenerator: Factor out helper to check target ordering

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: buildbot <buildbot@kitware.com>
Merge-request: !8363
This commit is contained in:
Brad King
2023-03-27 13:51:45 +00:00
committed by Kitware Robot
10 changed files with 42 additions and 3 deletions

View File

@@ -165,6 +165,7 @@ std::vector<std::string> cmCommonTargetGenerator::GetLinkedTargetDirectories(
{
std::vector<std::string> dirs;
std::set<cmGeneratorTarget const*> emitted;
cmGlobalCommonGenerator* const gg = this->GlobalCommonGenerator;
if (cmComputeLinkInformation* cli =
this->GeneratorTarget->GetLinkInformation(config)) {
cmComputeLinkInformation::ItemVector const& items = cli->GetItems();
@@ -172,6 +173,8 @@ std::vector<std::string> cmCommonTargetGenerator::GetLinkedTargetDirectories(
cmGeneratorTarget const* linkee = item.Target;
if (linkee &&
!linkee->IsImported()
// Skip targets that build after this one in a static lib cycle.
&& gg->TargetOrderIndexLess(linkee, this->GeneratorTarget)
// We can ignore the INTERFACE_LIBRARY items because
// Target->GetLinkInformation already processed their
// link interface and they don't have any output themselves.

View File

@@ -1727,8 +1727,7 @@ cmGlobalGenerator::GetLocalGeneratorTargetsInOrder(cmLocalGenerator* lg) const
cm::append(gts, lg->GetGeneratorTargets());
std::sort(gts.begin(), gts.end(),
[this](cmGeneratorTarget const* l, cmGeneratorTarget const* r) {
return this->TargetOrderIndex.at(l) <
this->TargetOrderIndex.at(r);
return this->TargetOrderIndexLess(l, r);
});
return gts;
}
@@ -3068,6 +3067,12 @@ cmGlobalGenerator::GetTargetDirectDepends(cmGeneratorTarget const* target)
return this->TargetDependencies[target];
}
bool cmGlobalGenerator::TargetOrderIndexLess(cmGeneratorTarget const* l,
cmGeneratorTarget const* r) const
{
return this->TargetOrderIndex.at(l) < this->TargetOrderIndex.at(r);
}
bool cmGlobalGenerator::IsReservedTarget(std::string const& name)
{
// The following is a list of targets reserved

View File

@@ -479,6 +479,11 @@ public:
TargetDependSet const& GetTargetDirectDepends(
const cmGeneratorTarget* target);
// Return true if target 'l' occurs before 'r' in a global ordering
// of targets that respects inter-target dependencies.
bool TargetOrderIndexLess(cmGeneratorTarget const* l,
cmGeneratorTarget const* r) const;
const std::map<std::string, std::vector<cmLocalGenerator*>>& GetProjectMap()
const
{

View File

@@ -6,3 +6,4 @@ add_executable(subdir_exe2 main.f90)
target_link_libraries(subdir_exe2 subdir_mods subdir_mods2)
add_dependencies(subdir_exe2 ExternalTarget)
target_link_libraries(subdir_exe2 myext)
target_link_libraries(subdir_exe2 cycleA)

View File

@@ -3,5 +3,9 @@ PROGRAM MAINF90
USE libraryModuleB
USE subdirModuleA
USE externalMod
USE libraryCycleA
USE libraryCycleB
CALL printExtModGreeting
CALL libraryCycleA2
CALL libraryCycleB2
END PROGRAM MAINF90

View File

@@ -3,9 +3,14 @@ add_library(subdir_mods a.f90 b.f90)
add_executable(subdir_exe main.f90)
target_link_libraries(subdir_exe subdir_mods)
add_library(cycleA STATIC cycleA1.f90 cycleA2.f90)
add_library(cycleB STATIC cycleB1.f90 cycleB2.f90)
target_link_libraries(cycleA PRIVATE cycleB)
target_link_libraries(cycleB PRIVATE cycleA)
# Test module output directory if available.
if(CMAKE_Fortran_MODDIR_FLAG)
set_target_properties(subdir_mods PROPERTIES
set_target_properties(subdir_mods cycleA cycleB PROPERTIES
Fortran_MODULE_DIRECTORY modules
)
endif()

View File

@@ -0,0 +1,3 @@
subroutine cycleA1
use libraryCycleA
end subroutine

View File

@@ -0,0 +1,5 @@
module libraryCycleA
contains
subroutine libraryCycleA2
end subroutine
end module

View File

@@ -0,0 +1,3 @@
subroutine cycleB1
use libraryCycleB
end subroutine

View File

@@ -0,0 +1,5 @@
module libraryCycleB
contains
subroutine libraryCycleB2
end subroutine
end module