Browse Source

install(): Properly ignore FILE_SETs that don't exist

Fixes: #22960
Kyle Edwards 3 years ago
parent
commit
058b8a0bfb

+ 22 - 21
Source/cmInstallCommand.cxx

@@ -1077,29 +1077,30 @@ bool HandleTargetsMode(std::vector<std::string> const& args,
 
     if (!namelinkOnly) {
       for (std::size_t i = 0; i < fileSetArgs.size(); i++) {
-        auto* fileSet = target.GetFileSet(fileSetArgs[i].GetFileSet());
-        auto interfaceFileSetEntries = cmExpandedList(target.GetSafeProperty(
-          cmTarget::GetInterfaceFileSetsPropertyName(fileSet->GetType())));
-        if (fileSet &&
-            std::find(
-              interfaceFileSetEntries.begin(), interfaceFileSetEntries.end(),
-              fileSetArgs[i].GetFileSet()) != interfaceFileSetEntries.end()) {
-          std::string destination;
-          if (fileSet->GetType() == "HEADERS"_s) {
-            destination = helper.GetIncludeDestination(&fileSetArgs[i]);
-          } else {
-            destination = fileSetArgs[i].GetDestination();
-            if (destination.empty()) {
-              status.SetError(
-                cmStrCat("TARGETS given no FILE_SET DESTINATION for target \"",
-                         target.GetName(), "\" file set \"",
-                         fileSet->GetName(), "\"."));
-              return false;
+        if (auto* fileSet = target.GetFileSet(fileSetArgs[i].GetFileSet())) {
+          auto interfaceFileSetEntries = cmExpandedList(target.GetSafeProperty(
+            cmTarget::GetInterfaceFileSetsPropertyName(fileSet->GetType())));
+          if (std::find(interfaceFileSetEntries.begin(),
+                        interfaceFileSetEntries.end(),
+                        fileSetArgs[i].GetFileSet()) !=
+              interfaceFileSetEntries.end()) {
+            std::string destination;
+            if (fileSet->GetType() == "HEADERS"_s) {
+              destination = helper.GetIncludeDestination(&fileSetArgs[i]);
+            } else {
+              destination = fileSetArgs[i].GetDestination();
+              if (destination.empty()) {
+                status.SetError(cmStrCat(
+                  "TARGETS given no FILE_SET DESTINATION for target \"",
+                  target.GetName(), "\" file set \"", fileSet->GetName(),
+                  "\"."));
+                return false;
+              }
             }
+            fileSetGenerators.push_back(CreateInstallFileSetGenerator(
+              helper, target, fileSet, destination, fileSetArgs[i]));
+            installsFileSet[i] = true;
           }
-          fileSetGenerators.push_back(CreateInstallFileSetGenerator(
-            helper, target, fileSet, destination, fileSetArgs[i]));
-          installsFileSet[i] = true;
         }
       }
     }

+ 4 - 0
Tests/RunCMake/target_sources/FileSetNoExistInstall.cmake

@@ -0,0 +1,4 @@
+enable_language(C)
+
+add_library(lib1 STATIC empty.c)
+install(TARGETS lib1 FILE_SET a)

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

@@ -36,6 +36,7 @@ run_cmake(FileSetInstallMissingSetsInterface)
 run_cmake(FileSetNoScope)
 run_cmake(FileSetNoExistPrivate)
 run_cmake(FileSetNoExistInterface)
+run_cmake(FileSetNoExistInstall)
 run_cmake(FileSetDirectories)
 
 set(RunCMake_TEST_OPTIONS -DCMAKE_POLICY_DEFAULT_CMP0115=NEW)