summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2017-07-10 20:37:31 (GMT)
committerBrad King <brad.king@kitware.com>2017-07-11 14:41:28 (GMT)
commit5cf9c3d0cc654ba1a84f8bd65edbd09945c909a4 (patch)
tree036212ad96d3bbe65a6590e640a0dacd70e3f1a7
parent372de3f8039f69b3a2edcf7120083ec4097f8bd3 (diff)
downloadCMake-5cf9c3d0cc654ba1a84f8bd65edbd09945c909a4.zip
CMake-5cf9c3d0cc654ba1a84f8bd65edbd09945c909a4.tar.gz
CMake-5cf9c3d0cc654ba1a84f8bd65edbd09945c909a4.tar.bz2
VS: Add SolutionGuid to generated .sln files
Visual Studio 2017 Update 3 adds a SolutionGuid to its `.sln` files. Fixes: #17041
-rw-r--r--Help/prop_dir/VS_GLOBAL_SECTION_POST_section.rst4
-rw-r--r--Source/cmGlobalVisualStudio7Generator.cxx20
-rw-r--r--Tests/RunCMake/VSSolution/MorePost-check.cmake2
-rw-r--r--Tests/RunCMake/VSSolution/MorePre-check.cmake2
-rw-r--r--Tests/RunCMake/VSSolution/OnePost-check.cmake2
-rw-r--r--Tests/RunCMake/VSSolution/OnePre-check.cmake2
-rw-r--r--Tests/RunCMake/VSSolution/Override1-check.cmake2
-rw-r--r--Tests/RunCMake/VSSolution/Override2-check.cmake2
-rw-r--r--Tests/RunCMake/VSSolution/Override3-check.cmake3
-rw-r--r--Tests/RunCMake/VSSolution/Override3.cmake4
-rw-r--r--Tests/RunCMake/VSSolution/PrePost-check.cmake2
-rw-r--r--Tests/RunCMake/VSSolution/RunCMakeTest.cmake1
-rw-r--r--Tests/RunCMake/VSSolution/solution_parsing.cmake3
13 files changed, 37 insertions, 12 deletions
diff --git a/Help/prop_dir/VS_GLOBAL_SECTION_POST_section.rst b/Help/prop_dir/VS_GLOBAL_SECTION_POST_section.rst
index dcd2a4e..a316abe 100644
--- a/Help/prop_dir/VS_GLOBAL_SECTION_POST_section.rst
+++ b/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.
diff --git a/Source/cmGlobalVisualStudio7Generator.cxx b/Source/cmGlobalVisualStudio7Generator.cxx
index f067d8f..b155f5b 100644
--- a/Source/cmGlobalVisualStudio7Generator.cxx
+++ b/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";
diff --git a/Tests/RunCMake/VSSolution/MorePost-check.cmake b/Tests/RunCMake/VSSolution/MorePost-check.cmake
index 0f7e370..d239b28 100644
--- a/Tests/RunCMake/VSSolution/MorePost-check.cmake
+++ b/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)
diff --git a/Tests/RunCMake/VSSolution/MorePre-check.cmake b/Tests/RunCMake/VSSolution/MorePre-check.cmake
index 45e7419..89b3c7e 100644
--- a/Tests/RunCMake/VSSolution/MorePre-check.cmake
+++ b/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)
diff --git a/Tests/RunCMake/VSSolution/OnePost-check.cmake b/Tests/RunCMake/VSSolution/OnePost-check.cmake
index 6af5156..f7d3712 100644
--- a/Tests/RunCMake/VSSolution/OnePost-check.cmake
+++ b/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)
diff --git a/Tests/RunCMake/VSSolution/OnePre-check.cmake b/Tests/RunCMake/VSSolution/OnePre-check.cmake
index 70b18b2..c5db139 100644
--- a/Tests/RunCMake/VSSolution/OnePre-check.cmake
+++ b/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)
diff --git a/Tests/RunCMake/VSSolution/Override1-check.cmake b/Tests/RunCMake/VSSolution/Override1-check.cmake
index a19e2e1..5905204 100644
--- a/Tests/RunCMake/VSSolution/Override1-check.cmake
+++ b/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)
diff --git a/Tests/RunCMake/VSSolution/Override2-check.cmake b/Tests/RunCMake/VSSolution/Override2-check.cmake
index d9656e1..c981ec0 100644
--- a/Tests/RunCMake/VSSolution/Override2-check.cmake
+++ b/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)
diff --git a/Tests/RunCMake/VSSolution/Override3-check.cmake b/Tests/RunCMake/VSSolution/Override3-check.cmake
new file mode 100644
index 0000000..baee9ed
--- /dev/null
+++ b/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)
diff --git a/Tests/RunCMake/VSSolution/Override3.cmake b/Tests/RunCMake/VSSolution/Override3.cmake
new file mode 100644
index 0000000..a59ce19
--- /dev/null
+++ b/Tests/RunCMake/VSSolution/Override3.cmake
@@ -0,0 +1,4 @@
+set_property(DIRECTORY PROPERTY VS_GLOBAL_SECTION_POST_ExtensibilityGlobals
+ Key1=Value1
+ SolutionGuid={custom-guid}
+ )
diff --git a/Tests/RunCMake/VSSolution/PrePost-check.cmake b/Tests/RunCMake/VSSolution/PrePost-check.cmake
index 322a689..957c964 100644
--- a/Tests/RunCMake/VSSolution/PrePost-check.cmake
+++ b/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)
diff --git a/Tests/RunCMake/VSSolution/RunCMakeTest.cmake b/Tests/RunCMake/VSSolution/RunCMakeTest.cmake
index 3a04db4..c25833d 100644
--- a/Tests/RunCMake/VSSolution/RunCMakeTest.cmake
+++ b/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)
diff --git a/Tests/RunCMake/VSSolution/solution_parsing.cmake b/Tests/RunCMake/VSSolution/solution_parsing.cmake
index 4e5bb59..4b27550 100644
--- a/Tests/RunCMake/VSSolution/solution_parsing.cmake
+++ b/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()