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)
|
||||
|
||||
|
||||
# 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)
|
||||
# Really, I just want this to be an "if(TARGET ${tgt})" ...
|
||||
# but I'm not sure that our min req'd., CMake 2.4.5 can handle
|
||||
# that... so I'm just activating this for now, with a version
|
||||
# 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}")
|
||||
IF(CMAKE_USE_FOLDERS)
|
||||
SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||
|
||||
# Really, I just want this to be an "if(TARGET ${tgt})" ...
|
||||
# but I'm not sure that our min req'd., CMake 2.4.5 can handle
|
||||
# that... so I'm just activating this for now, with a version
|
||||
# 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()
|
||||
ELSE()
|
||||
SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS OFF)
|
||||
ENDIF()
|
||||
ENDMACRO(CMAKE_SET_TARGET_FOLDER)
|
||||
|
||||
|
|
|
@ -1863,9 +1863,10 @@ bool cmGlobalGenerator::UseFolderProperty()
|
|||
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())
|
||||
{
|
||||
cumulativePath = *iter;
|
||||
cumulativePath = "CMAKE_FOLDER_GUID_" + *iter;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -431,14 +431,22 @@ void cmGlobalVisualStudio7Generator
|
|||
//----------------------------------------------------------------------------
|
||||
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";
|
||||
for(std::map<std::string,std::set<std::string> >::iterator iter =
|
||||
VisualStudioFolders.begin(); iter != VisualStudioFolders.end(); ++iter)
|
||||
{
|
||||
std::string fullName = iter->first;
|
||||
std::string guid = this->GetGUID(fullName.c_str());
|
||||
std::string nameOnly = cmSystemTools::GetFilenameName(fullName);
|
||||
|
||||
cmSystemTools::ReplaceString(fullName, "/", "\\");
|
||||
if (cmSystemTools::StringStartsWith(fullName.c_str(), prefix))
|
||||
{
|
||||
fullName = fullName.substr(skip_prefix);
|
||||
}
|
||||
|
||||
std::string nameOnly = cmSystemTools::GetFilenameName(fullName);
|
||||
|
||||
fout << "Project(\"{" <<
|
||||
guidProjectTypeFolder << "}\") = \"" <<
|
||||
|
|
|
@ -3486,7 +3486,7 @@ void cmake::DefineProperties(cmake *cm)
|
|||
cm->DefineProperty
|
||||
("USE_FOLDERS", cmProperty::GLOBAL,
|
||||
"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 "
|
||||
"hierarchy of folders use the values of the FOLDER target "
|
||||
"property to name those folders. See also the documentation "
|
||||
|
|
|
@ -7,6 +7,13 @@ find_package(CVS)
|
|||
find_package(Subversion)
|
||||
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
|
||||
"CMakePredefinedTargets-in-ExternalProjectTest")
|
||||
|
||||
|
@ -60,6 +67,15 @@ ExternalProject_Add(${proj}
|
|||
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)
|
||||
ExternalProject_Add(${proj}
|
||||
BUILD_COMMAND ""
|
||||
|
|
Loading…
Reference in New Issue