Browse Source

VS: Add SolutionGuid to generated .sln files

Visual Studio 2017 Update 3 adds a SolutionGuid to its `.sln` files.

Fixes: #17041
Brad King 8 years ago
parent
commit
5cf9c3d0cc

+ 3 - 1
Help/prop_dir/VS_GLOBAL_SECTION_POST_section.rst

@@ -26,4 +26,6 @@ and ExtensibilityAddIns by default.  If you set the corresponding
 property, it will override the default section.  For example, setting
 VS_GLOBAL_SECTION_POST_ExtensibilityGlobals will override the default
 contents of the ExtensibilityGlobals section, while keeping
-ExtensibilityAddIns on its default.
+ExtensibilityAddIns on its default.  However, CMake will always
+add a ``SolutionGuid`` to the ``ExtensibilityGlobals`` section
+if it is not specified explicitly.

+ 16 - 4
Source/cmGlobalVisualStudio7Generator.cxx

@@ -520,6 +520,7 @@ std::string cmGlobalVisualStudio7Generator::ConvertToSolutionPath(
 void cmGlobalVisualStudio7Generator::WriteSLNGlobalSections(
   std::ostream& fout, cmLocalGenerator* root)
 {
+  std::string const guid = this->GetGUID(root->GetProjectName() + ".sln");
   bool extensibilityGlobalsOverridden = false;
   bool extensibilityAddInsOverridden = false;
   const std::vector<std::string> propKeys =
@@ -538,11 +539,14 @@ void cmGlobalVisualStudio7Generator::WriteSLNGlobalSections(
       } else
         continue;
       if (!name.empty()) {
-        if (name == "ExtensibilityGlobals" && sectionType == "postSolution")
+        bool addGuid = false;
+        if (name == "ExtensibilityGlobals" && sectionType == "postSolution") {
+          addGuid = true;
           extensibilityGlobalsOverridden = true;
-        else if (name == "ExtensibilityAddIns" &&
-                 sectionType == "postSolution")
+        } else if (name == "ExtensibilityAddIns" &&
+                   sectionType == "postSolution") {
           extensibilityAddInsOverridden = true;
+        }
         fout << "\tGlobalSection(" << name << ") = " << sectionType << "\n";
         std::vector<std::string> keyValuePairs;
         cmSystemTools::ExpandListArgument(
@@ -557,15 +561,23 @@ void cmGlobalVisualStudio7Generator::WriteSLNGlobalSections(
             const std::string value =
               cmSystemTools::TrimWhitespace(itPair->substr(posEqual + 1));
             fout << "\t\t" << key << " = " << value << "\n";
+            if (key == "SolutionGuid") {
+              addGuid = false;
+            }
           }
         }
+        if (addGuid) {
+          fout << "\t\tSolutionGuid = {" << guid << "}\n";
+        }
         fout << "\tEndGlobalSection\n";
       }
     }
   }
-  if (!extensibilityGlobalsOverridden)
+  if (!extensibilityGlobalsOverridden) {
     fout << "\tGlobalSection(ExtensibilityGlobals) = postSolution\n"
+         << "\t\tSolutionGuid = {" << guid << "}\n"
          << "\tEndGlobalSection\n";
+  }
   if (!extensibilityAddInsOverridden)
     fout << "\tGlobalSection(ExtensibilityAddIns) = postSolution\n"
          << "\tEndGlobalSection\n";

+ 1 - 1
Tests/RunCMake/VSSolution/MorePost-check.cmake

@@ -1,5 +1,5 @@
 parseGlobalSections(pre post MorePost)
 testGlobalSection(post TestSec2 Key1=Value1 "Key2=Value with spaces")
 testGlobalSection(post TestSec4 Key6=Value1 "Key7=Value with spaces" Key8=ValueWithoutSpaces)
-testGlobalSection(post ExtensibilityGlobals)
+testGlobalSection(post ExtensibilityGlobals "SolutionGuid={00000000-0000-0000-0000-000000000000}")
 testGlobalSection(post ExtensibilityAddIns)

+ 1 - 1
Tests/RunCMake/VSSolution/MorePre-check.cmake

@@ -1,5 +1,5 @@
 parseGlobalSections(pre post MorePre)
 testGlobalSection(pre TestSec1 Key1=Value1 "Key2=Value with spaces")
 testGlobalSection(pre TestSec3 Key3=Value1 "Key4=Value with spaces" Key5=ValueWithoutSpaces)
-testGlobalSection(post ExtensibilityGlobals)
+testGlobalSection(post ExtensibilityGlobals "SolutionGuid={00000000-0000-0000-0000-000000000000}")
 testGlobalSection(post ExtensibilityAddIns)

+ 1 - 1
Tests/RunCMake/VSSolution/OnePost-check.cmake

@@ -1,4 +1,4 @@
 parseGlobalSections(pre post OnePost)
 testGlobalSection(post TestSec2 Key1=Value1 "Key2=Value with spaces")
-testGlobalSection(post ExtensibilityGlobals)
+testGlobalSection(post ExtensibilityGlobals "SolutionGuid={00000000-0000-0000-0000-000000000000}")
 testGlobalSection(post ExtensibilityAddIns)

+ 1 - 1
Tests/RunCMake/VSSolution/OnePre-check.cmake

@@ -1,4 +1,4 @@
 parseGlobalSections(pre post OnePre)
 testGlobalSection(pre TestSec1 Key1=Value1 "Key2=Value with spaces")
-testGlobalSection(post ExtensibilityGlobals)
+testGlobalSection(post ExtensibilityGlobals "SolutionGuid={00000000-0000-0000-0000-000000000000}")
 testGlobalSection(post ExtensibilityAddIns)

+ 1 - 1
Tests/RunCMake/VSSolution/Override1-check.cmake

@@ -1,4 +1,4 @@
 parseGlobalSections(pre post Override1)
 testGlobalSection(post TestSec Key2=Value2 Key3=Value3)
-testGlobalSection(post ExtensibilityGlobals Key1=Value1)
+testGlobalSection(post ExtensibilityGlobals Key1=Value1 "SolutionGuid={00000000-0000-0000-0000-000000000000}")
 testGlobalSection(post ExtensibilityAddIns)

+ 1 - 1
Tests/RunCMake/VSSolution/Override2-check.cmake

@@ -1,4 +1,4 @@
 parseGlobalSections(pre post Override2)
 testGlobalSection(pre TestSec Key2=Value2 Key3=Value3)
-testGlobalSection(post ExtensibilityGlobals)
+testGlobalSection(post ExtensibilityGlobals "SolutionGuid={00000000-0000-0000-0000-000000000000}")
 testGlobalSection(post ExtensibilityAddIns Key1=Value1)

+ 3 - 0
Tests/RunCMake/VSSolution/Override3-check.cmake

@@ -0,0 +1,3 @@
+parseGlobalSections(pre post Override3)
+testGlobalSection(post ExtensibilityGlobals Key1=Value1 "SolutionGuid={custom-guid}")
+testGlobalSection(post ExtensibilityAddIns)

+ 4 - 0
Tests/RunCMake/VSSolution/Override3.cmake

@@ -0,0 +1,4 @@
+set_property(DIRECTORY PROPERTY VS_GLOBAL_SECTION_POST_ExtensibilityGlobals
+  Key1=Value1
+  SolutionGuid={custom-guid}
+  )

+ 1 - 1
Tests/RunCMake/VSSolution/PrePost-check.cmake

@@ -2,5 +2,5 @@ parseGlobalSections(pre post PrePost)
 testGlobalSection(post Postsec Key1=Value2)
 testGlobalSection(pre Presec Key1=Value1 "Key2=Value with some spaces")
 testGlobalSection(post Emptysec)
-testGlobalSection(post ExtensibilityGlobals)
+testGlobalSection(post ExtensibilityGlobals "SolutionGuid={00000000-0000-0000-0000-000000000000}")
 testGlobalSection(post ExtensibilityAddIns)

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

@@ -8,6 +8,7 @@ run_cmake(MorePost)
 run_cmake(PrePost)
 run_cmake(Override1)
 run_cmake(Override2)
+run_cmake(Override3)
 run_cmake(StartupProject)
 run_cmake(StartupProjectMissing)
 run_cmake(AddPackageToDefault)

+ 3 - 0
Tests/RunCMake/VSSolution/solution_parsing.cmake

@@ -44,6 +44,9 @@ macro(parseGlobalSections arg_out_pre arg_out_post testName)
       endif()
       string(STRIP "${CMAKE_MATCH_1}" key)
       string(STRIP "${CMAKE_MATCH_2}" value)
+      if(key STREQUAL "SolutionGuid" AND value MATCHES "^{[0-9A-F-]+}$")
+        set(value "{00000000-0000-0000-0000-000000000000}")
+      endif()
       list(APPEND ${out_${sectionType}}_${sectionName} "${key}=${value}")
     endif()
   endforeach()