Browse Source

VS: Fix regression in C# source links

Fix logic used since commit ac6b18cd90 (CSharp: Add support for source
groups with out-of-source builds, 2020-02-18, v3.18.0-rc1~645^2).
Add a check of the physical file location for C# source groups.
Kinan Mahdi 5 years ago
parent
commit
8d87cfdbf3

+ 8 - 1
Source/cmVisualStudio10TargetGenerator.cxx

@@ -4927,6 +4927,7 @@ std::string cmVisualStudio10TargetGenerator::GetCSharpSourceLink(
   // for this file exists, otherwise we check if the path relative to current
   // source- or binary-dir is used within the link and return that
   std::string link;
+  std::string sourceGroupedFile;
   std::string const& fullFileName = source->GetFullPath();
   std::string const& srcDir = this->Makefile->GetCurrentSourceDirectory();
   std::string const& binDir = this->Makefile->GetCurrentBinaryDirectory();
@@ -4936,8 +4937,14 @@ std::string cmVisualStudio10TargetGenerator::GetCSharpSourceLink(
   cmSourceGroup* sourceGroup =
     this->Makefile->FindSourceGroup(fullFileName, sourceGroups);
   if (sourceGroup && !sourceGroup->GetFullName().empty()) {
-    link = sourceGroup->GetFullName() + "/" +
+    sourceGroupedFile = sourceGroup->GetFullName() + "/" +
       cmsys::SystemTools::GetFilenameName(fullFileName);
+    cmsys::SystemTools::ConvertToUnixSlashes(sourceGroupedFile);
+  }
+
+  if (!sourceGroupedFile.empty() &&
+      cmHasSuffix(fullFileName, sourceGroupedFile)) {
+    link = sourceGroupedFile;
   } else if (cmHasPrefix(fullFileName, srcDir)) {
     link = fullFileName.substr(srcDir.length() + 1);
   } else if (cmHasPrefix(fullFileName, binDir)) {

+ 5 - 4
Tests/RunCMake/VS10Project/VsCsharpSourceGroup-check.cmake

@@ -9,12 +9,13 @@ file(STRINGS "${csProjFile}" lines)
 include(${RunCMake_TEST_SOURCE_DIR}/VsCsharpSourceGroupHelpers.cmake)
 
 set(SOURCE_GROUPS_TO_FIND
-  "CSharpSourceGroup"
-  "CSharpSourceGroup/nested"
-  "Images"
+  "CSharpSourceGroup\\\\foo\\.cs"
+  "CSharpSourceGroup\\\\nested\\\\baz\\.cs"
+  "CSharpSourceGroup\\\\images\\\\empty\\.bmp"
+  "VsCsharpSourceGroup\\.png"
 )
 
-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 ${SOURCE_GROUP_FOUND})
     return()

+ 7 - 1
Tests/RunCMake/VS10Project/VsCsharpSourceGroup.cmake

@@ -9,8 +9,14 @@ set(SRC_FILES
 set(IMAGE_FILES
   ${CMAKE_CURRENT_SOURCE_DIR}/CSharpSourceGroup/Images/empty.bmp
 )
+# We explicitly don't set a source group for a source in the root level
+# because of https://gitlab.kitware.com/cmake/cmake/-/issues/21221
+set(RESOURCE_FILES
+  ${CMAKE_CURRENT_SOURCE_DIR}/VsCsharpSourceGroup.png
+)
+
 
-add_library(VsCsharpSourceGroup SHARED ${SRC_FILES} ${IMAGE_FILES})
+add_library(VsCsharpSourceGroup SHARED ${SRC_FILES} ${IMAGE_FILES} ${RESOURCE_FILES})
 source_group("CSharpSourceGroup" FILES ${CMAKE_CURRENT_SOURCE_DIR}/CSharpSourceGroup/foo.cs)
 source_group("CSharpSourceGroup/nested" FILES ${CMAKE_CURRENT_SOURCE_DIR}/CSharpSourceGroup/nested/baz.cs)
 source_group("Images" FILES ${IMAGE_FILES})

+ 0 - 0
Tests/RunCMake/VS10Project/VsCsharpSourceGroup.png