Browse Source

export: Do not fail generation for namelink-only case

Deniz Bahadir 5 years ago
parent
commit
64690f6df0

+ 27 - 19
Source/cmInstallCommand.cxx

@@ -461,6 +461,28 @@ bool HandleTargetsMode(std::vector<std::string> const& args,
     std::unique_ptr<cmInstallFilesGenerator> publicHeaderGenerator;
     std::unique_ptr<cmInstallFilesGenerator> resourceGenerator;
 
+    auto addTargetExport = [&]() {
+      // Add this install rule to an export if one was specified.
+      // (If this is a namelink-only rule no export file will be generated.)
+      if (!exports.empty()) {
+        auto te = cm::make_unique<cmTargetExport>();
+        te->TargetName = target.GetName();
+        te->ArchiveGenerator = archiveGenerator.get();
+        te->BundleGenerator = bundleGenerator.get();
+        te->FrameworkGenerator = frameworkGenerator.get();
+        te->HeaderGenerator = publicHeaderGenerator.get();
+        te->LibraryGenerator = libraryGenerator.get();
+        te->RuntimeGenerator = runtimeGenerator.get();
+        te->ObjectsGenerator = objectGenerator.get();
+        te->InterfaceIncludeDirectories =
+          cmJoin(includesArgs.GetIncludeDirs(), ";");
+
+        helper.Makefile->GetGlobalGenerator()
+          ->GetExportSets()[exports]
+          .AddTargetExport(std::move(te));
+      }
+    };
+
     // Avoid selecting default destinations for PUBLIC_HEADER and
     // PRIVATE_HEADER if any artifacts are specified.
     bool artifactsSpecified = false;
@@ -476,6 +498,7 @@ bool HandleTargetsMode(std::vector<std::string> const& args,
         if (target.IsDLLPlatform()) {
           // When in namelink only mode skip all libraries on Windows.
           if (namelinkMode == cmInstallTargetGenerator::NamelinkModeOnly) {
+            addTargetExport();
             continue;
           }
 
@@ -507,6 +530,7 @@ bool HandleTargetsMode(std::vector<std::string> const& args,
           if (target.IsFrameworkOnApple()) {
             // When in namelink only mode skip frameworks.
             if (namelinkMode == cmInstallTargetGenerator::NamelinkModeOnly) {
+              addTargetExport();
               continue;
             }
 
@@ -551,6 +575,7 @@ bool HandleTargetsMode(std::vector<std::string> const& args,
         if (target.IsFrameworkOnApple()) {
           // When in namelink only mode skip frameworks.
           if (namelinkMode == cmInstallTargetGenerator::NamelinkModeOnly) {
+            addTargetExport();
             continue;
           }
 
@@ -744,25 +769,8 @@ bool HandleTargetsMode(std::vector<std::string> const& args,
       }
     }
 
-    // Add this install rule to an export if one was specified and
-    // this is not a namelink-only rule.
-    if (!exports.empty() && !namelinkOnly) {
-      auto te = cm::make_unique<cmTargetExport>();
-      te->TargetName = target.GetName();
-      te->ArchiveGenerator = archiveGenerator.get();
-      te->BundleGenerator = bundleGenerator.get();
-      te->FrameworkGenerator = frameworkGenerator.get();
-      te->HeaderGenerator = publicHeaderGenerator.get();
-      te->LibraryGenerator = libraryGenerator.get();
-      te->RuntimeGenerator = runtimeGenerator.get();
-      te->ObjectsGenerator = objectGenerator.get();
-      te->InterfaceIncludeDirectories =
-        cmJoin(includesArgs.GetIncludeDirs(), ";");
-
-      helper.Makefile->GetGlobalGenerator()
-        ->GetExportSets()[exports]
-        .AddTargetExport(std::move(te));
-    }
+    // Add this install rule to an export if one was specified.
+    addTargetExport();
 
     // Keep track of whether we're installing anything in each category
     installsArchive = installsArchive || archiveGenerator;

+ 9 - 0
Tests/RunCMake/export/NamelinkOnlyExport.cmake

@@ -0,0 +1,9 @@
+enable_language(CXX)
+add_library(foo SHARED empty.cpp)
+install(TARGETS foo EXPORT fooExport
+  RUNTIME DESTINATION bin
+  LIBRARY
+     DESTINATION lib
+     NAMELINK_ONLY
+)
+export(EXPORT fooExport FILE "${CMAKE_CURRENT_BINARY_DIR}/foo.cmake")

+ 2 - 0
Tests/RunCMake/export/RunCMakeTest.cmake

@@ -15,3 +15,5 @@ run_cmake(ForbiddenToExportPropertyWithGenExp)
 run_cmake(ExportPropertiesUndefined)
 run_cmake(DependOnNotExport)
 run_cmake(DependOnDoubleExport)
+run_cmake(UnknownExport)
+run_cmake(NamelinkOnlyExport)

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

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

+ 4 - 0
Tests/RunCMake/export/UnknownExport-stderr.txt

@@ -0,0 +1,4 @@
+CMake Error at UnknownExport\.cmake:[0-9]+ \(export\):
+  export Export set "fooExport" not found\.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)

+ 2 - 0
Tests/RunCMake/export/UnknownExport.cmake

@@ -0,0 +1,2 @@
+enable_language(CXX)
+export(EXPORT fooExport FILE "${CMAKE_CURRENT_BINARY_DIR}/foo.cmake")

+ 12 - 0
Tests/RunCMake/install/EXPORT-NamelinkOnly.cmake

@@ -0,0 +1,12 @@
+enable_language(C)
+add_library(foo SHARED empty.c)
+install(TARGETS foo EXPORT fooExport
+  RUNTIME DESTINATION bin
+  LIBRARY
+     DESTINATION lib
+     NAMELINK_ONLY
+)
+install(EXPORT fooExport
+    DESTINATION "lib/cmake/"
+    FILE "foo.cmake"
+)

+ 1 - 0
Tests/RunCMake/install/EXPORT-UnknownExport-result.txt

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

+ 1 - 0
Tests/RunCMake/install/EXPORT-UnknownExport-stderr.txt

@@ -0,0 +1 @@
+CMake Error: INSTALL\(EXPORT\) given unknown export "fooExport"

+ 5 - 0
Tests/RunCMake/install/EXPORT-UnknownExport.cmake

@@ -0,0 +1,5 @@
+enable_language(C)
+install(EXPORT fooExport
+    DESTINATION "lib/cmake/"
+    FILE "foo.cmake"
+)

+ 2 - 0
Tests/RunCMake/install/RunCMakeTest.cmake

@@ -76,6 +76,8 @@ run_cmake(DIRECTORY-DESTINATION-bad)
 run_cmake(FILES-DESTINATION-bad)
 run_cmake(TARGETS-DESTINATION-bad)
 run_cmake(EXPORT-OldIFace)
+run_cmake(EXPORT-UnknownExport)
+run_cmake(EXPORT-NamelinkOnly)
 run_cmake(CMP0062-OLD)
 run_cmake(CMP0062-NEW)
 run_cmake(CMP0062-WARN)