Browse Source

VS: Fix default target support for targets nested inside a folder

It's not actually the first target in a `.sln` file that is treated as
the default startup project, but rather the first fully defined target.
Taylor Braun-Jones 9 years ago
parent
commit
f069be0548

+ 18 - 1
Source/cmGlobalVisualStudio71Generator.cxx

@@ -97,14 +97,31 @@ void cmGlobalVisualStudio71Generator
   OrderedTargetDependSet orderedProjectTargets(
     projectTargets, this->GetStartupProjectName(root));
 
-  this->WriteTargetsToSolution(fout, root, orderedProjectTargets);
+  // Generate the targets specification to a string.  We will put this in
+  // the actual .sln file later.  As a side effect, this method also
+  // populates the set of folders.
+  std::ostringstream targetsSlnString;
+  this->WriteTargetsToSolution(targetsSlnString, root, orderedProjectTargets);
+
+  // VS 7 does not support folders specified first.
+  if (this->GetVersion() <= VS71)
+    {
+    fout << targetsSlnString.str();
+    }
 
+  // Generate folder specification.
   bool useFolderProperty = this->UseFolderProperty();
   if (useFolderProperty)
     {
     this->WriteFolders(fout);
     }
 
+  // Now write the actual target specification content.
+  if (this->GetVersion() > VS71)
+    {
+    fout << targetsSlnString.str();
+    }
+
   // Write out the configurations information for the solution
   fout << "Global\n";
   // Write out the configurations for the solution

+ 4 - 1
Tests/RunCMake/CMakeLists.txt

@@ -234,7 +234,10 @@ endif()
 
 if("${CMAKE_GENERATOR}" MATCHES "Visual Studio")
   add_RunCMake_test(include_external_msproject)
-  add_RunCMake_test(VSSolution)
+  if("${CMAKE_GENERATOR}" MATCHES "Visual Studio ([789]|10)" AND NOT CMAKE_VS_DEVENV_COMMAND)
+    set(NO_USE_FOLDERS 1)
+  endif()
+  add_RunCMake_test(VSSolution -DNO_USE_FOLDERS=${NO_USE_FOLDERS})
 endif()
 
 if("${CMAKE_GENERATOR}" MATCHES "Visual Studio ([^789]|[789][0-9])")

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

@@ -10,3 +10,7 @@ run_cmake(Override1)
 run_cmake(Override2)
 run_cmake(StartupProject)
 run_cmake(StartupProjectMissing)
+
+if(RunCMake_GENERATOR MATCHES "Visual Studio ([^7]|[7][0-9])" AND NOT NO_USE_FOLDERS)
+  run_cmake(StartupProjectUseFolders)
+endif()

+ 9 - 0
Tests/RunCMake/VSSolution/StartupProjectUseFolders-check.cmake

@@ -0,0 +1,9 @@
+getProjectNames(projects)
+list(GET projects 0 first_project)
+if(NOT first_project STREQUAL "CMakePredefinedTargets")
+  error("CMakePredefinedTargets is not the first project")
+endif()
+list(GET projects 1 second_project)
+if(NOT second_project STREQUAL "TestStartup")
+  error("TestStartup does not immediately follow the CMakePredefinedTargets project")
+endif()

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

@@ -0,0 +1,3 @@
+add_custom_target(TestStartup)
+set_property(GLOBAL PROPERTY USE_FOLDERS ON)
+set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT "TestStartup")