From d723409e8e379e30b0c3413b240ac75f3e130c43 Mon Sep 17 00:00:00 2001 From: Martin Duffy Date: Mon, 17 Mar 2025 17:07:17 -0400 Subject: [PATCH] export: Allow multiple exports when only one export is installed Since commit c8997fc046 (export: Allow depending on targets exported multiple times, 2024-12-26, v4.0.0-rc1~241^2), it is possible to depend on a target exported multiple times so long as the target is exported in only one set and with a consistent namespace. However, as a side-effect, a target could not be in multiple export sets even if only one of those sets was installed. Update the check so that uninstalled export sets do not count towards a target being exported multiple times. --- Source/cmExportInstallFileGenerator.cxx | 10 ++++++---- .../PackageInfo/DependsMultipleNotInstalled.cmake | 4 ++++ Tests/RunCMake/PackageInfo/RunCMakeTest.cmake | 1 + 3 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 Tests/RunCMake/PackageInfo/DependsMultipleNotInstalled.cmake diff --git a/Source/cmExportInstallFileGenerator.cxx b/Source/cmExportInstallFileGenerator.cxx index af97921906..9accd7ddc5 100644 --- a/Source/cmExportInstallFileGenerator.cxx +++ b/Source/cmExportInstallFileGenerator.cxx @@ -280,12 +280,14 @@ cmExportFileGenerator::ExportInfo cmExportInstallFileGenerator::FindExportInfo( [&name](std::unique_ptr const& te) { return te->TargetName == name; })) { - exportSets.insert(exp.first); std::vector const* installs = exportSet.GetInstallations(); - for (cmInstallExportGenerator const* install : *installs) { - exportFiles.push_back(install->GetDestinationFile()); - namespaces.insert(install->GetNamespace()); + if (!installs->empty()) { + exportSets.insert(exp.first); + for (cmInstallExportGenerator const* install : *installs) { + exportFiles.push_back(install->GetDestinationFile()); + namespaces.insert(install->GetNamespace()); + } } } } diff --git a/Tests/RunCMake/PackageInfo/DependsMultipleNotInstalled.cmake b/Tests/RunCMake/PackageInfo/DependsMultipleNotInstalled.cmake new file mode 100644 index 0000000000..7d6e06cc05 --- /dev/null +++ b/Tests/RunCMake/PackageInfo/DependsMultipleNotInstalled.cmake @@ -0,0 +1,4 @@ +project(DependsMultipleNotInstalled CXX) +set(NAMESPACE foo::) +include(DependsMultipleCommon.cmake) +install(TARGETS foo EXPORT foo-alt) # set foo-alt never installed diff --git a/Tests/RunCMake/PackageInfo/RunCMakeTest.cmake b/Tests/RunCMake/PackageInfo/RunCMakeTest.cmake index 6618ff4ca0..4b3493ea37 100644 --- a/Tests/RunCMake/PackageInfo/RunCMakeTest.cmake +++ b/Tests/RunCMake/PackageInfo/RunCMakeTest.cmake @@ -34,3 +34,4 @@ run_cmake(LowerCaseFile) run_cmake(Requirements) run_cmake(TargetTypes) run_cmake(DependsMultiple) +run_cmake(DependsMultipleNotInstalled)