Browse Source

export: Do not fail generation for separate namelink only case

Update the change from commit 64690f6df0 (export: Do not fail generation
for namelink-only case, 2020-10-09, v3.19.0-rc1~7^2) to also handle
separate namelink-only and namelink-skip calls.

Fixes: #21529
Deniz Bahadir 4 years ago
parent
commit
38bcb5c0a3

+ 3 - 0
Source/cmExportBuildFileGenerator.cxx

@@ -288,6 +288,9 @@ void cmExportBuildFileGenerator::GetTargets(
   if (this->ExportSet) {
     for (std::unique_ptr<cmTargetExport> const& te :
          this->ExportSet->GetTargetExports()) {
+      if (te->NamelinkOnly) {
+        continue;
+      }
       targets.push_back(te->TargetName);
     }
     return;

+ 3 - 0
Source/cmExportInstallFileGenerator.cxx

@@ -42,6 +42,9 @@ bool cmExportInstallFileGenerator::GenerateMainFile(std::ostream& os)
     std::string sep;
     for (std::unique_ptr<cmTargetExport> const& te :
          this->IEGen->GetExportSet()->GetTargetExports()) {
+      if (te->NamelinkOnly) {
+        continue;
+      }
       expectedTargets += sep + this->Namespace + te->Target->GetExportName();
       sep = " ";
       if (this->ExportedTargets.insert(te->Target).second) {

+ 11 - 8
Source/cmInstallCommand.cxx

@@ -461,6 +461,13 @@ bool HandleTargetsMode(std::vector<std::string> const& args,
     std::unique_ptr<cmInstallFilesGenerator> publicHeaderGenerator;
     std::unique_ptr<cmInstallFilesGenerator> resourceGenerator;
 
+    // Avoid selecting default destinations for PUBLIC_HEADER and
+    // PRIVATE_HEADER if any artifacts are specified.
+    bool artifactsSpecified = false;
+
+    // Track whether this is a namelink-only rule.
+    bool namelinkOnly = false;
+
     auto addTargetExport = [&]() {
       // Add this install rule to an export if one was specified.
       if (!exports.empty()) {
@@ -475,20 +482,13 @@ bool HandleTargetsMode(std::vector<std::string> const& args,
         te->ObjectsGenerator = objectGenerator.get();
         te->InterfaceIncludeDirectories =
           cmJoin(includesArgs.GetIncludeDirs(), ";");
-
+        te->NamelinkOnly = namelinkOnly;
         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;
-
-    // Track whether this is a namelink-only rule.
-    bool namelinkOnly = false;
-
     switch (target.GetType()) {
       case cmStateEnums::SHARED_LIBRARY: {
         // Shared libraries are handled differently on DLL and non-DLL
@@ -497,6 +497,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) {
+            namelinkOnly = true;
             addTargetExport();
             continue;
           }
@@ -529,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) {
+              namelinkOnly = true;
               addTargetExport();
               continue;
             }
@@ -574,6 +576,7 @@ bool HandleTargetsMode(std::vector<std::string> const& args,
         if (target.IsFrameworkOnApple()) {
           // When in namelink only mode skip frameworks.
           if (namelinkMode == cmInstallTargetGenerator::NamelinkModeOnly) {
+            namelinkOnly = true;
             addTargetExport();
             continue;
           }

+ 2 - 0
Source/cmTargetExport.h

@@ -31,4 +31,6 @@ public:
   cmInstallFilesGenerator* HeaderGenerator;
   std::string InterfaceIncludeDirectories;
   ///@}
+
+  bool NamelinkOnly = false;
 };

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

@@ -17,3 +17,4 @@ run_cmake(DependOnNotExport)
 run_cmake(DependOnDoubleExport)
 run_cmake(UnknownExport)
 run_cmake(NamelinkOnlyExport)
+run_cmake(SeparateNamelinkExport)

+ 16 - 0
Tests/RunCMake/export/SeparateNamelinkExport.cmake

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

+ 19 - 0
Tests/RunCMake/install/EXPORT-SeparateNamelink.cmake

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

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

@@ -78,6 +78,7 @@ run_cmake(TARGETS-DESTINATION-bad)
 run_cmake(EXPORT-OldIFace)
 run_cmake(EXPORT-UnknownExport)
 run_cmake(EXPORT-NamelinkOnly)
+run_cmake(EXPORT-SeparateNamelink)
 run_cmake(CMP0062-OLD)
 run_cmake(CMP0062-NEW)
 run_cmake(CMP0062-WARN)