Explorar el Código

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.)
Matthew Woehlke hace 9 meses
padre
commit
26691689a3

+ 9 - 4
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<TargetExport> 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());
     }
   }
 

+ 0 - 0
Tests/RunCMake/export/DependOnDoubleExport-result.txt → Tests/RunCMake/export/DependOnDifferentNamespaceExport-result.txt


+ 13 - 0
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.

+ 9 - 0
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")

+ 1 - 0
Tests/RunCMake/export/DependOnDifferentSetExport-result.txt

@@ -0,0 +1 @@
+1

+ 3 - 4
Tests/RunCMake/export/DependOnDoubleExport-stderr.txt → 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.

+ 7 - 0
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")

+ 2 - 2
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")

+ 2 - 0
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)