Parcourir la source

Restore support for a custom source group for CMakeLists.txt

Since commit v3.11.0-rc1~467^2 (VS,Xcode: Add CMakeLists.txt sources
without mutating targets, 2017-10-18) we do not add `CMakeLists.txt` to
target sources but instead generate references to them directly.  This
accidentally dropped generation of the `.vcxproj.filters` entry for a
source group in which `CMakeLists.txt` is the only member.

Fixes: #18795
Brad King il y a 7 ans
Parent
commit
77303314dc

+ 8 - 0
Source/cmVisualStudio10TargetGenerator.cxx

@@ -1419,6 +1419,14 @@ void cmVisualStudio10TargetGenerator::WriteGroups()
     groupsUsed.insert(sourceGroup);
   }
 
+  if (cmSourceFile const* srcCMakeLists =
+        this->LocalGenerator->CreateVCProjBuildRule()) {
+    std::string const& source = srcCMakeLists->GetFullPath();
+    cmSourceGroup* sourceGroup =
+      this->Makefile->FindSourceGroup(source, sourceGroups);
+    groupsUsed.insert(sourceGroup);
+  }
+
   this->AddMissingSourceGroups(groupsUsed, sourceGroups);
 
   // Write out group file

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

@@ -1,6 +1,7 @@
 include(RunCMake)
 
 run_cmake(ExplicitCMakeLists)
+run_cmake(SourceGroupCMakeLists)
 
 run_cmake(VsConfigurationType)
 run_cmake(VsTargetsFileReferences)

+ 33 - 0
Tests/RunCMake/VS10Project/SourceGroupCMakeLists-check.cmake

@@ -0,0 +1,33 @@
+set(vcFiltersFile "${RunCMake_TEST_BINARY_DIR}/foo.vcxproj.filters")
+if(NOT EXISTS "${vcFiltersFile}")
+  set(RunCMake_TEST_FAILED "Filters file ${vcFiltersFile} does not exist.")
+  return()
+endif()
+
+set(foundFileFilter 0)
+set(foundFilter 0)
+file(STRINGS "${vcFiltersFile}" lines)
+foreach(line IN LISTS lines)
+  if(line MATCHES "<Filter>CMakeListsSourceGroup</Filter>")
+    set(rule "${CMAKE_MATCH_1}")
+    if(foundFileFilter)
+      set(RunCMake_TEST_FAILED "Multiple files listed with filter for CMakeListsSourceGroup.")
+      return()
+    endif()
+    set(foundFileFilter 1)
+  endif()
+  if(line MATCHES "<Filter.*Include=\"CMakeListsSourceGroup\"")
+    set(rule "${CMAKE_MATCH_1}")
+    if(foundFilter)
+      set(RunCMake_TEST_FAILED "Multiple copies of CMakeListsSourceGroup filter listed.")
+      return()
+    endif()
+    set(foundFilter 1)
+  endif()
+endforeach()
+if(NOT foundFileFilter)
+  set(RunCMake_TEST_FAILED "File filter for CMakeListsSourceGroup not found.")
+endif()
+if(NOT foundFilter)
+  set(RunCMake_TEST_FAILED "Filter CMakeListsSourceGroup not found.")
+endif()

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

@@ -0,0 +1,3 @@
+set(CMAKE_CONFIGURATION_TYPES Debug)
+add_custom_target(foo)
+source_group("CMakeListsSourceGroup" FILES CMakeLists.txt)