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.
This commit is contained in:
Taylor Braun-Jones 2016-03-21 16:01:20 -04:00 committed by Brad King
parent c05ea48545
commit f069be0548
5 changed files with 38 additions and 2 deletions

View File

@ -97,14 +97,31 @@ void cmGlobalVisualStudio71Generator
OrderedTargetDependSet orderedProjectTargets( OrderedTargetDependSet orderedProjectTargets(
projectTargets, this->GetStartupProjectName(root)); 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(); bool useFolderProperty = this->UseFolderProperty();
if (useFolderProperty) if (useFolderProperty)
{ {
this->WriteFolders(fout); 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 // Write out the configurations information for the solution
fout << "Global\n"; fout << "Global\n";
// Write out the configurations for the solution // Write out the configurations for the solution

View File

@ -234,7 +234,10 @@ endif()
if("${CMAKE_GENERATOR}" MATCHES "Visual Studio") if("${CMAKE_GENERATOR}" MATCHES "Visual Studio")
add_RunCMake_test(include_external_msproject) 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() endif()
if("${CMAKE_GENERATOR}" MATCHES "Visual Studio ([^789]|[789][0-9])") if("${CMAKE_GENERATOR}" MATCHES "Visual Studio ([^789]|[789][0-9])")

View File

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

View File

@ -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()

View File

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