From 26691689a3cad9adfa5f269de27cc2b8a511118f Mon Sep 17 00:00:00 2001 From: Matthew Woehlke Date: Mon, 24 Feb 2025 14:54:50 -0500 Subject: [PATCH] export: Allow compatible build-tree exports Modify how cmExportBuildFileGenerator::FindExportInfo collects target export information to properly record the export sets which export a target. (The old behavior treated every invocation as a separate set, which is reasonable for export(TARGETS) but does not allow referencing a target exported multiple times via export(EXPORT). This reflects recent changes to allow this for installed exports.) --- Source/cmExportBuildFileGenerator.cxx | 13 +++++++++---- ... => DependOnDifferentNamespaceExport-result.txt} | 0 .../DependOnDifferentNamespaceExport-stderr.txt | 13 +++++++++++++ .../export/DependOnDifferentNamespaceExport.cmake | 9 +++++++++ .../export/DependOnDifferentSetExport-result.txt | 1 + ...rr.txt => DependOnDifferentSetExport-stderr.txt} | 7 +++---- .../export/DependOnDifferentSetExport.cmake | 7 +++++++ Tests/RunCMake/export/DependOnDoubleExport.cmake | 4 ++-- Tests/RunCMake/export/RunCMakeTest.cmake | 2 ++ 9 files changed, 46 insertions(+), 10 deletions(-) rename Tests/RunCMake/export/{DependOnDoubleExport-result.txt => DependOnDifferentNamespaceExport-result.txt} (100%) create mode 100644 Tests/RunCMake/export/DependOnDifferentNamespaceExport-stderr.txt create mode 100644 Tests/RunCMake/export/DependOnDifferentNamespaceExport.cmake create mode 100644 Tests/RunCMake/export/DependOnDifferentSetExport-result.txt rename Tests/RunCMake/export/{DependOnDoubleExport-stderr.txt => DependOnDifferentSetExport-stderr.txt} (75%) create mode 100644 Tests/RunCMake/export/DependOnDifferentSetExport.cmake diff --git a/Source/cmExportBuildFileGenerator.cxx b/Source/cmExportBuildFileGenerator.cxx index 35f45b0439..792a39eb58 100644 --- a/Source/cmExportBuildFileGenerator.cxx +++ b/Source/cmExportBuildFileGenerator.cxx @@ -186,15 +186,20 @@ cmExportFileGenerator::ExportInfo cmExportBuildFileGenerator::FindExportInfo( target->GetLocalGenerator()->GetGlobalGenerator()->GetBuildExportSets(); for (auto const& exp : allExportSets) { - auto const& exportSet = exp.second; + cmExportBuildFileGenerator const* const bfg = exp.second; + cmExportSet const* const exportSet = bfg->GetExportSet(); std::vector targets; - exportSet->GetTargets(targets); + bfg->GetTargets(targets); if (std::any_of( targets.begin(), targets.end(), [&name](TargetExport const& te) { return te.Name == name; })) { - exportSets.insert(exp.first); + if (exportSet) { + exportSets.insert(exportSet->GetName()); + } else { + exportSets.insert(exp.first); + } exportFiles.push_back(exp.first); - namespaces.insert(exportSet->GetNamespace()); + namespaces.insert(bfg->GetNamespace()); } } diff --git a/Tests/RunCMake/export/DependOnDoubleExport-result.txt b/Tests/RunCMake/export/DependOnDifferentNamespaceExport-result.txt similarity index 100% rename from Tests/RunCMake/export/DependOnDoubleExport-result.txt rename to Tests/RunCMake/export/DependOnDifferentNamespaceExport-result.txt diff --git a/Tests/RunCMake/export/DependOnDifferentNamespaceExport-stderr.txt b/Tests/RunCMake/export/DependOnDifferentNamespaceExport-stderr.txt new file mode 100644 index 0000000000..b1160886b3 --- /dev/null +++ b/Tests/RunCMake/export/DependOnDifferentNamespaceExport-stderr.txt @@ -0,0 +1,13 @@ +CMake Error in CMakeLists.txt: + export called with target "exported" which requires target "doubleexported" + that is not in this export set, but in another export set which is exported + multiple times with different namespaces:.* + .*/Tests/RunCMake/export/DependOnDifferentNamespaceExport-build/export1.cmake,.* + .*/Tests/RunCMake/export/DependOnDifferentNamespaceExport-build/export2.cmake. ++ + An exported target cannot depend upon another target which is exported in + more than one export set or with more than one namespace. Consider + consolidating the exports of the "doubleexported" target to a single + export. ++ +CMake Generate step failed. Build files cannot be regenerated correctly. diff --git a/Tests/RunCMake/export/DependOnDifferentNamespaceExport.cmake b/Tests/RunCMake/export/DependOnDifferentNamespaceExport.cmake new file mode 100644 index 0000000000..5f9cb69f62 --- /dev/null +++ b/Tests/RunCMake/export/DependOnDifferentNamespaceExport.cmake @@ -0,0 +1,9 @@ +add_library(doubleexported INTERFACE) +install(TARGETS doubleexported EXPORT exportset) +export(EXPORT exportset + FILE "${CMAKE_CURRENT_BINARY_DIR}/export1.cmake") +export(EXPORT exportset NAMESPACE test:: + FILE "${CMAKE_CURRENT_BINARY_DIR}/export2.cmake") +add_library(exported INTERFACE) +target_link_libraries(exported INTERFACE doubleexported) +export(TARGETS exported FILE "${CMAKE_CURRENT_BINARY_DIR}/exports.cmake") diff --git a/Tests/RunCMake/export/DependOnDifferentSetExport-result.txt b/Tests/RunCMake/export/DependOnDifferentSetExport-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/export/DependOnDifferentSetExport-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/export/DependOnDoubleExport-stderr.txt b/Tests/RunCMake/export/DependOnDifferentSetExport-stderr.txt similarity index 75% rename from Tests/RunCMake/export/DependOnDoubleExport-stderr.txt rename to Tests/RunCMake/export/DependOnDifferentSetExport-stderr.txt index c79b74e1fe..499ffa953d 100644 --- a/Tests/RunCMake/export/DependOnDoubleExport-stderr.txt +++ b/Tests/RunCMake/export/DependOnDifferentSetExport-stderr.txt @@ -1,13 +1,12 @@ CMake Error in CMakeLists.txt: export called with target "exported" which requires target "doubleexported" that is not in this export set, but in multiple other export sets:.* - .*/Tests/RunCMake/export/DependOnDoubleExport-build/exportset.cmake,.* - .*/Tests/RunCMake/export/DependOnDoubleExport-build/manual.cmake. + .*/Tests/RunCMake/export/DependOnDifferentSetExport-build/exportset.cmake,.* + .*/Tests/RunCMake/export/DependOnDifferentSetExport-build/manual.cmake. + An exported target cannot depend upon another target which is exported in more than one export set or with more than one namespace. Consider consolidating the exports of the "doubleexported" target to a single export. - - ++ CMake Generate step failed. Build files cannot be regenerated correctly. diff --git a/Tests/RunCMake/export/DependOnDifferentSetExport.cmake b/Tests/RunCMake/export/DependOnDifferentSetExport.cmake new file mode 100644 index 0000000000..8d108d7ef4 --- /dev/null +++ b/Tests/RunCMake/export/DependOnDifferentSetExport.cmake @@ -0,0 +1,7 @@ +add_library(doubleexported INTERFACE) +install(TARGETS doubleexported EXPORT exportset) +export(TARGETS doubleexported FILE "${CMAKE_CURRENT_BINARY_DIR}/manual.cmake") +export(EXPORT exportset FILE "${CMAKE_CURRENT_BINARY_DIR}/exportset.cmake") +add_library(exported INTERFACE) +target_link_libraries(exported INTERFACE doubleexported) +export(TARGETS exported FILE "${CMAKE_CURRENT_BINARY_DIR}/exports.cmake") diff --git a/Tests/RunCMake/export/DependOnDoubleExport.cmake b/Tests/RunCMake/export/DependOnDoubleExport.cmake index 8d108d7ef4..e126b3a497 100644 --- a/Tests/RunCMake/export/DependOnDoubleExport.cmake +++ b/Tests/RunCMake/export/DependOnDoubleExport.cmake @@ -1,7 +1,7 @@ add_library(doubleexported INTERFACE) install(TARGETS doubleexported EXPORT exportset) -export(TARGETS doubleexported FILE "${CMAKE_CURRENT_BINARY_DIR}/manual.cmake") -export(EXPORT exportset FILE "${CMAKE_CURRENT_BINARY_DIR}/exportset.cmake") +export(EXPORT exportset FILE "${CMAKE_CURRENT_BINARY_DIR}/export1.cmake") +export(EXPORT exportset FILE "${CMAKE_CURRENT_BINARY_DIR}/export2.cmake") add_library(exported INTERFACE) target_link_libraries(exported INTERFACE doubleexported) export(TARGETS exported FILE "${CMAKE_CURRENT_BINARY_DIR}/exports.cmake") diff --git a/Tests/RunCMake/export/RunCMakeTest.cmake b/Tests/RunCMake/export/RunCMakeTest.cmake index 2dcd146796..8dcea7f7ef 100644 --- a/Tests/RunCMake/export/RunCMakeTest.cmake +++ b/Tests/RunCMake/export/RunCMakeTest.cmake @@ -15,6 +15,8 @@ run_cmake(ForbiddenToExportPropertyWithGenExp) run_cmake(ExportPropertiesUndefined) run_cmake(DependOnNotExport) run_cmake(DependOnDoubleExport) +run_cmake(DependOnDifferentSetExport) +run_cmake(DependOnDifferentNamespaceExport) run_cmake(UnknownExport) run_cmake(NamelinkOnlyExport) run_cmake(SeparateNamelinkExport)