From 26691689a3cad9adfa5f269de27cc2b8a511118f Mon Sep 17 00:00:00 2001 From: Matthew Woehlke Date: Mon, 24 Feb 2025 14:54:50 -0500 Subject: 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 +++++++++---- .../export/DependOnDifferentNamespaceExport-result.txt | 1 + .../export/DependOnDifferentNamespaceExport-stderr.txt | 13 +++++++++++++ .../RunCMake/export/DependOnDifferentNamespaceExport.cmake | 9 +++++++++ Tests/RunCMake/export/DependOnDifferentSetExport-result.txt | 1 + Tests/RunCMake/export/DependOnDifferentSetExport-stderr.txt | 12 ++++++++++++ Tests/RunCMake/export/DependOnDifferentSetExport.cmake | 7 +++++++ Tests/RunCMake/export/DependOnDoubleExport-result.txt | 1 - Tests/RunCMake/export/DependOnDoubleExport-stderr.txt | 13 ------------- Tests/RunCMake/export/DependOnDoubleExport.cmake | 4 ++-- Tests/RunCMake/export/RunCMakeTest.cmake | 2 ++ 11 files changed, 56 insertions(+), 20 deletions(-) create mode 100644 Tests/RunCMake/export/DependOnDifferentNamespaceExport-result.txt 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 create mode 100644 Tests/RunCMake/export/DependOnDifferentSetExport-stderr.txt create mode 100644 Tests/RunCMake/export/DependOnDifferentSetExport.cmake delete mode 100644 Tests/RunCMake/export/DependOnDoubleExport-result.txt delete mode 100644 Tests/RunCMake/export/DependOnDoubleExport-stderr.txt diff --git a/Source/cmExportBuildFileGenerator.cxx b/Source/cmExportBuildFileGenerator.cxx index 35f45b0..792a39e 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/DependOnDifferentNamespaceExport-result.txt b/Tests/RunCMake/export/DependOnDifferentNamespaceExport-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/export/DependOnDifferentNamespaceExport-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/export/DependOnDifferentNamespaceExport-stderr.txt b/Tests/RunCMake/export/DependOnDifferentNamespaceExport-stderr.txt new file mode 100644 index 0000000..b116088 --- /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 0000000..5f9cb69 --- /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 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/export/DependOnDifferentSetExport-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/export/DependOnDifferentSetExport-stderr.txt b/Tests/RunCMake/export/DependOnDifferentSetExport-stderr.txt new file mode 100644 index 0000000..499ffa9 --- /dev/null +++ b/Tests/RunCMake/export/DependOnDifferentSetExport-stderr.txt @@ -0,0 +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/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 0000000..8d108d7 --- /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-result.txt b/Tests/RunCMake/export/DependOnDoubleExport-result.txt deleted file mode 100644 index d00491f..0000000 --- a/Tests/RunCMake/export/DependOnDoubleExport-result.txt +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/Tests/RunCMake/export/DependOnDoubleExport-stderr.txt b/Tests/RunCMake/export/DependOnDoubleExport-stderr.txt deleted file mode 100644 index c79b74e..0000000 --- a/Tests/RunCMake/export/DependOnDoubleExport-stderr.txt +++ /dev/null @@ -1,13 +0,0 @@ -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. -+ - 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/DependOnDoubleExport.cmake b/Tests/RunCMake/export/DependOnDoubleExport.cmake index 8d108d7..e126b3a 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 2dcd146..8dcea7f 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) -- cgit v0.12