Explorar el Código

FILE_SET: Fix source group detection

Call MatchChildrenFiles() instead of MatchesFiles() in order to
account for files being in subgroups of source groups.

Fixes: #23880
Kyle Edwards hace 3 años
padre
commit
970052fedd

+ 1 - 1
Source/cmGeneratorTarget.cxx

@@ -1702,7 +1702,7 @@ void addFileSetEntry(cmGeneratorTarget const* headTarget,
       }
       bool found = false;
       for (auto const& sg : headTarget->Makefile->GetSourceGroups()) {
-        if (sg.MatchesFiles(path)) {
+        if (sg.MatchChildrenFiles(path)) {
           found = true;
           break;
         }

+ 15 - 0
Source/cmSourceGroup.cxx

@@ -124,6 +124,21 @@ cmSourceGroup* cmSourceGroup::MatchChildrenFiles(const std::string& name)
   return nullptr;
 }
 
+const cmSourceGroup* cmSourceGroup::MatchChildrenFiles(
+  const std::string& name) const
+{
+  if (this->MatchesFiles(name)) {
+    return this;
+  }
+  for (const cmSourceGroup& group : this->Internal->GroupChildren) {
+    const cmSourceGroup* result = group.MatchChildrenFiles(name);
+    if (result) {
+      return result;
+    }
+  }
+  return nullptr;
+}
+
 cmSourceGroup* cmSourceGroup::MatchChildrenRegex(const std::string& name)
 {
   for (cmSourceGroup& group : this->Internal->GroupChildren) {

+ 6 - 0
Source/cmSourceGroup.h

@@ -79,6 +79,12 @@ public:
    */
   cmSourceGroup* MatchChildrenFiles(const std::string& name);
 
+  /**
+   * Check if the given name matches this group's explicit file list
+   * in children.
+   */
+  const cmSourceGroup* MatchChildrenFiles(const std::string& name) const;
+
   /**
    * Check if the given name matches this group's regex in children.
    */

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

@@ -16,6 +16,7 @@ run_cmake(NoImpLib)
 run_cmake(RuntimeLibrary)
 run_cmake(SourceGroupCMakeLists)
 run_cmake(SourceGroupTreeCMakeLists)
+run_cmake(SourceGroupFileSet)
 run_cmake(VsConfigurationType)
 run_cmake(VsTargetsFileReferences)
 run_cmake(VsCustomProps)

+ 13 - 0
Tests/RunCMake/VS10Project/SourceGroupFileSet-check.cmake

@@ -0,0 +1,13 @@
+cmake_policy(SET CMP0011 NEW)
+
+set(vcFiltersFile "${RunCMake_TEST_BINARY_DIR}/SourceGroupFileSet.vcxproj.filters")
+if(NOT EXISTS "${vcFiltersFile}")
+  set(RunCMake_TEST_FAILED "Filters file ${vcFiltersFile} does not exist.")
+  return()
+endif()
+
+file(STRINGS "${vcFiltersFile}" lines)
+
+include(${RunCMake_TEST_SOURCE_DIR}/SourceGroupHelpers.cmake)
+
+find_source_group("${lines}" "Header Files\\SourceGroupFileSet")

+ 3 - 0
Tests/RunCMake/VS10Project/SourceGroupFileSet.cmake

@@ -0,0 +1,3 @@
+add_library(SourceGroupFileSet INTERFACE)
+target_sources(SourceGroupFileSet PUBLIC FILE_SET HEADERS FILES iface.h)
+source_group("Header Files/SourceGroupFileSet" FILES iface.h)