Browse Source

Merge topic 'file-set-source-group'

970052fedd FILE_SET: Fix source group detection
bcc3965813 Tests: Fix VS10Project SourceGroupTreeCMakeLists check

Acked-by: Kitware Robot <[email protected]>
Acked-by: buildbot <[email protected]>
Merge-request: !7609
Kyle Edwards 3 years ago
parent
commit
2ef64745c8

+ 1 - 1
Source/cmGeneratorTarget.cxx

@@ -1715,7 +1715,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)

+ 3 - 2
Tests/RunCMake/VS10Project/SourceGroupHelpers.cmake

@@ -1,8 +1,9 @@
 function(find_source_group LINES NAME)
   set(foundFileFilter 0)
   set(foundFilter 0)
+  string(REPLACE "\\" "\\\\" regexName "${NAME}")
   foreach(line IN LISTS LINES)
-    if(line MATCHES "<Filter>${NAME}</Filter>")
+    if(line MATCHES "<Filter>${regexName}</Filter>")
       if(foundFileFilter)
         set(RunCMake_TEST_FAILED "Multiple files listed with filter for ${NAME}." PARENT_SCOPE)
         set(FILTER_FOUND 0 PARENT_SCOPE)
@@ -10,7 +11,7 @@ function(find_source_group LINES NAME)
       endif()
       set(foundFileFilter 1)
     endif()
-    if(line MATCHES "<Filter.*Include=\"${NAME}\"")
+    if(line MATCHES "<Filter.*Include=\"${regexName}\"")
       if(foundFilter)
         set(RunCMake_TEST_FAILED "Multiple copies of ${NAME} filter listed." PARENT_SCOPE)
         set(FILTER_FOUND 0 PARENT_SCOPE)

+ 2 - 2
Tests/RunCMake/VS10Project/SourceGroupTreeCMakeLists-check.cmake

@@ -18,9 +18,9 @@ set(SOURCE_GROUPS_TO_FIND
   "SourcesPrefix\\PrefixedNested"
 )
 
-foreach(GROUP_NAME IN LISTS ${SOURCE_GROUPS_TO_FIND})
+foreach(GROUP_NAME IN LISTS SOURCE_GROUPS_TO_FIND)
   find_source_group("${lines}" ${GROUP_NAME})
-  if(NOT ${FILTER_FOUND})
+  if(NOT FILTER_FOUND)
     return()
   endif()
 endforeach()