New USE_FOLDERS property OFF by default. (#3796)
Visual Studio Express editions do not support solution folders, so default behavior should be as if USE_FOLDERS global property is OFF. Also, allow folder names to be the same as target names: internally, use a prefix to distinguish folder GUIDs from target GUIDs. Add a target and folder with the same name in the ExternalProject test to exercise this code. For CMake itself, provide a new option CMAKE_USE_FOLDERS that defaults to ON so that Visual Studio users get a nicely organized CMake project. Express edition users will have to turn off the CMAKE_USE_FOLDERS option in order to build CMake in the VS Express IDE.
This commit is contained in:
parent
e6ac0aacf6
commit
fd3249e11a
|
@ -173,15 +173,33 @@ MACRO(CMAKE_SETUP_TESTING)
|
||||||
ENDMACRO(CMAKE_SETUP_TESTING)
|
ENDMACRO(CMAKE_SETUP_TESTING)
|
||||||
|
|
||||||
|
|
||||||
|
# Provide a way for Visual Studio Express users to turn OFF the new FOLDER
|
||||||
|
# organization feature. Default to ON for non-Express users. Express users must
|
||||||
|
# explicitly turn off this option to build CMake in the Express IDE...
|
||||||
|
#
|
||||||
|
OPTION(CMAKE_USE_FOLDERS "Enable folder grouping of projects in IDEs." ON)
|
||||||
|
MARK_AS_ADVANCED(CMAKE_USE_FOLDERS)
|
||||||
|
|
||||||
|
|
||||||
|
#-----------------------------------------------------------------------
|
||||||
|
# a macro that only sets the FOLDER target property if it's
|
||||||
|
# "appropriate"
|
||||||
|
#-----------------------------------------------------------------------
|
||||||
MACRO(CMAKE_SET_TARGET_FOLDER tgt folder)
|
MACRO(CMAKE_SET_TARGET_FOLDER tgt folder)
|
||||||
# Really, I just want this to be an "if(TARGET ${tgt})" ...
|
IF(CMAKE_USE_FOLDERS)
|
||||||
# but I'm not sure that our min req'd., CMake 2.4.5 can handle
|
SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||||
# that... so I'm just activating this for now, with a version
|
|
||||||
# compare, and only for MSVC builds.
|
# Really, I just want this to be an "if(TARGET ${tgt})" ...
|
||||||
IF(MSVC)
|
# but I'm not sure that our min req'd., CMake 2.4.5 can handle
|
||||||
IF(NOT ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} LESS 2.8)
|
# that... so I'm just activating this for now, with a version
|
||||||
SET_PROPERTY(TARGET "${tgt}" PROPERTY FOLDER "${folder}")
|
# compare, and only for MSVC builds.
|
||||||
|
IF(MSVC)
|
||||||
|
IF(NOT ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} LESS 2.8)
|
||||||
|
SET_PROPERTY(TARGET "${tgt}" PROPERTY FOLDER "${folder}")
|
||||||
|
ENDIF()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
ELSE()
|
||||||
|
SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS OFF)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDMACRO(CMAKE_SET_TARGET_FOLDER)
|
ENDMACRO(CMAKE_SET_TARGET_FOLDER)
|
||||||
|
|
||||||
|
|
|
@ -1863,9 +1863,10 @@ bool cmGlobalGenerator::UseFolderProperty()
|
||||||
return cmSystemTools::IsOn(prop);
|
return cmSystemTools::IsOn(prop);
|
||||||
}
|
}
|
||||||
|
|
||||||
// By default, this feature is ON:
|
// By default, this feature is OFF, since it is not supported in the
|
||||||
|
// Visual Studio Express editions:
|
||||||
//
|
//
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
|
|
@ -323,7 +323,7 @@ void cmGlobalVisualStudio7Generator::WriteTargetsToSolution(
|
||||||
|
|
||||||
if (cumulativePath.empty())
|
if (cumulativePath.empty())
|
||||||
{
|
{
|
||||||
cumulativePath = *iter;
|
cumulativePath = "CMAKE_FOLDER_GUID_" + *iter;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -431,14 +431,22 @@ void cmGlobalVisualStudio7Generator
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
void cmGlobalVisualStudio7Generator::WriteFolders(std::ostream& fout)
|
void cmGlobalVisualStudio7Generator::WriteFolders(std::ostream& fout)
|
||||||
{
|
{
|
||||||
|
const char *prefix = "CMAKE_FOLDER_GUID_";
|
||||||
|
const std::string::size_type skip_prefix = strlen(prefix);
|
||||||
std::string guidProjectTypeFolder = "2150E333-8FDC-42A3-9474-1A3956D46DE8";
|
std::string guidProjectTypeFolder = "2150E333-8FDC-42A3-9474-1A3956D46DE8";
|
||||||
for(std::map<std::string,std::set<std::string> >::iterator iter =
|
for(std::map<std::string,std::set<std::string> >::iterator iter =
|
||||||
VisualStudioFolders.begin(); iter != VisualStudioFolders.end(); ++iter)
|
VisualStudioFolders.begin(); iter != VisualStudioFolders.end(); ++iter)
|
||||||
{
|
{
|
||||||
std::string fullName = iter->first;
|
std::string fullName = iter->first;
|
||||||
std::string guid = this->GetGUID(fullName.c_str());
|
std::string guid = this->GetGUID(fullName.c_str());
|
||||||
std::string nameOnly = cmSystemTools::GetFilenameName(fullName);
|
|
||||||
cmSystemTools::ReplaceString(fullName, "/", "\\");
|
cmSystemTools::ReplaceString(fullName, "/", "\\");
|
||||||
|
if (cmSystemTools::StringStartsWith(fullName.c_str(), prefix))
|
||||||
|
{
|
||||||
|
fullName = fullName.substr(skip_prefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string nameOnly = cmSystemTools::GetFilenameName(fullName);
|
||||||
|
|
||||||
fout << "Project(\"{" <<
|
fout << "Project(\"{" <<
|
||||||
guidProjectTypeFolder << "}\") = \"" <<
|
guidProjectTypeFolder << "}\") = \"" <<
|
||||||
|
|
|
@ -3486,7 +3486,7 @@ void cmake::DefineProperties(cmake *cm)
|
||||||
cm->DefineProperty
|
cm->DefineProperty
|
||||||
("USE_FOLDERS", cmProperty::GLOBAL,
|
("USE_FOLDERS", cmProperty::GLOBAL,
|
||||||
"Use the FOLDER target property to organize targets into folders.",
|
"Use the FOLDER target property to organize targets into folders.",
|
||||||
"If not set, CMake treats this property as ON by default. "
|
"If not set, CMake treats this property as OFF by default. "
|
||||||
"CMake generators that are capable of organizing into a "
|
"CMake generators that are capable of organizing into a "
|
||||||
"hierarchy of folders use the values of the FOLDER target "
|
"hierarchy of folders use the values of the FOLDER target "
|
||||||
"property to name those folders. See also the documentation "
|
"property to name those folders. See also the documentation "
|
||||||
|
|
|
@ -7,6 +7,13 @@ find_package(CVS)
|
||||||
find_package(Subversion)
|
find_package(Subversion)
|
||||||
find_package(Git)
|
find_package(Git)
|
||||||
|
|
||||||
|
option(ExternalProjectTest_USE_FOLDERS "Enable folder grouping in IDEs." ON)
|
||||||
|
if(ExternalProjectTest_USE_FOLDERS)
|
||||||
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||||
|
else()
|
||||||
|
set_property(GLOBAL PROPERTY USE_FOLDERS OFF)
|
||||||
|
endif()
|
||||||
|
|
||||||
set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER
|
set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER
|
||||||
"CMakePredefinedTargets-in-ExternalProjectTest")
|
"CMakePredefinedTargets-in-ExternalProjectTest")
|
||||||
|
|
||||||
|
@ -60,6 +67,15 @@ ExternalProject_Add(${proj}
|
||||||
INSTALL_COMMAND ""
|
INSTALL_COMMAND ""
|
||||||
)
|
)
|
||||||
|
|
||||||
|
set(proj TargetNameSameAsFolder)
|
||||||
|
ExternalProject_Add(${proj}
|
||||||
|
BUILD_COMMAND ""
|
||||||
|
CONFIGURE_COMMAND ""
|
||||||
|
DOWNLOAD_COMMAND ""
|
||||||
|
INSTALL_COMMAND ""
|
||||||
|
)
|
||||||
|
set_property(TARGET ${proj} PROPERTY FOLDER "${proj}")
|
||||||
|
|
||||||
set(proj MinimalNoOpProject)
|
set(proj MinimalNoOpProject)
|
||||||
ExternalProject_Add(${proj}
|
ExternalProject_Add(${proj}
|
||||||
BUILD_COMMAND ""
|
BUILD_COMMAND ""
|
||||||
|
|
Loading…
Reference in New Issue