[Cmake-commits] CMake branch, next, updated. v2.8.2-666-g1c1cdcc

David Cole david.cole at kitware.com
Fri Sep 3 14:04:10 EDT 2010


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".

The branch, next has been updated
       via  1c1cdcca2d2b51c4d4e0ce81dd18d66f44668e89 (commit)
       via  e6ac0aacf6c3ce17141870e252fda77d994782d3 (commit)
      from  91309fcaee1e481732f2ba216d371a70b8e27afc (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=1c1cdcca2d2b51c4d4e0ce81dd18d66f44668e89
commit 1c1cdcca2d2b51c4d4e0ce81dd18d66f44668e89
Merge: 91309fc e6ac0aa
Author:     David Cole <david.cole at kitware.com>
AuthorDate: Fri Sep 3 14:04:07 2010 -0400
Commit:     CMake Topic Stage <kwrobot at kitware.com>
CommitDate: Fri Sep 3 14:04:07 2010 -0400

    Merge topic 'vs-project-groups' into next
    
    e6ac0aa Add FOLDER target property, for IDEs (#3796)

diff --cc CMakeLists.txt
index b318a0c,dec502b..6e8b928
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@@ -269,21 -288,11 +295,22 @@@ MACRO (CMAKE_BUILD_UTILITIES
        "${CMAKE_CURRENT_SOURCE_DIR}/Utilities/cmbzip2")
      SET(BZIP2_LIBRARIES cmbzip2)
      ADD_SUBDIRECTORY(Utilities/cmbzip2)
+     CMAKE_SET_TARGET_FOLDER(cmbzip2 "Utilities/3rdParty")
    ENDIF()
 +
 +  #---------------------------------------------------------------------
 +  # Build or use system libarchive for CMake and CTest.
    IF(CMAKE_USE_SYSTEM_LIBARCHIVE)
 -    FIND_PACKAGE(libarchive)
 -    SET(CMAKE_TAR_LIBRARIES libarchive)
 +    IF(EXISTS ${CMAKE_ROOT}/Modules/FindLibArchive.cmake)
 +      FIND_PACKAGE(LibArchive)
 +    ELSE()
 +      CMAKE_MINIMUM_REQUIRED(VERSION 2.8.0 FATAL_ERROR)
 +      INCLUDE(${CMake_SOURCE_DIR}/Modules/FindLibArchive.cmake)
 +    ENDIF()
 +    IF(NOT LibArchive_FOUND)
 +      MESSAGE(FATAL_ERROR "CMAKE_USE_SYSTEM_LIBARCHIVE is ON but LibArchive is not found!")
 +    ENDIF()
 +    SET(CMAKE_TAR_LIBRARIES ${LibArchive_LIBRARIES})
    ELSE(CMAKE_USE_SYSTEM_LIBARCHIVE)
      SET(HAVE_LIBZ 1)
      SET(HAVE_ZLIB_H 1)
diff --cc Tests/ExternalProject/CMakeLists.txt
index 587cf57,00db5d4..bf90a52
--- a/Tests/ExternalProject/CMakeLists.txt
+++ b/Tests/ExternalProject/CMakeLists.txt
@@@ -81,8 -99,8 +101,9 @@@ if(can_build_tutorial_step5
      URL "${CMAKE_CURRENT_SOURCE_DIR}/../Tutorial/Step5"
      CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -G ${CMAKE_GENERATOR} <SOURCE_DIR>
      TEST_BEFORE_INSTALL 1
 +    LOG_INSTALL 1
    )
+   set_property(TARGET ${proj} PROPERTY FOLDER "Local")
    ExternalProject_Get_Property(${proj} install_dir)
    set(TutorialStep5_install_dir ${install_dir})
  
@@@ -91,8 -109,8 +112,9 @@@
      URL "${CMAKE_CURRENT_SOURCE_DIR}/../Tutorial/Step5"
      CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -G ${CMAKE_GENERATOR} <SOURCE_DIR>
      TEST_AFTER_INSTALL 1
 +    LOG_TEST 1
    )
+   set_property(TARGET ${proj} PROPERTY FOLDER "Local")
  endif()
  
  
@@@ -108,8 -126,8 +130,9 @@@ ExternalProject_Add(${proj
    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
               -DTEST_LIST:STRING=A::B::C
    INSTALL_COMMAND ""
 +  LOG_CONFIGURE 1
  )
+ set_property(TARGET ${proj} PROPERTY FOLDER "Local/TAR")
  
  set(proj TutorialStep1-LocalNoDirTAR)
  ExternalProject_Add(${proj}
@@@ -137,8 -156,8 +161,9 @@@ ExternalProject_Add(${proj
    URL_MD5 38c648e817339c356f6be00eeed79bd0
    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -G ${CMAKE_GENERATOR} <SOURCE_DIR>
    INSTALL_COMMAND ""
 +  LOG_BUILD 1
  )
+ set_property(TARGET ${proj} PROPERTY FOLDER "Local/TGZ")
  
  set(proj TutorialStep1-LocalNoDirTGZ)
  ExternalProject_Add(${proj}
@@@ -362,8 -395,8 +401,9 @@@ if(do_svn_tests
      CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
      INSTALL_COMMAND ""
      DEPENDS "SetupLocalSVNRepository"
 +    LOG_DOWNLOAD 1
    )
+   set_property(TARGET ${proj} PROPERTY FOLDER "SVN")
  endif()
  
  
@@@ -437,8 -474,8 +481,9 @@@ if(do_git_tests
      CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
      INSTALL_COMMAND ""
      DEPENDS "SetupLocalGITRepository"
 +    LOG_UPDATE 1
    )
+   set_property(TARGET ${proj} PROPERTY FOLDER "GIT")
  endif()
  
  

http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=e6ac0aacf6c3ce17141870e252fda77d994782d3
commit e6ac0aacf6c3ce17141870e252fda77d994782d3
Author:     David Cole <david.cole at kitware.com>
AuthorDate: Fri Sep 3 13:53:22 2010 -0400
Commit:     David Cole <david.cole at kitware.com>
CommitDate: Fri Sep 3 13:53:22 2010 -0400

    Add FOLDER target property, for IDEs (#3796)
    
    This work was started from a patch by Thomas Schiffer.
    Thanks, Thomas!
    
    See the newly added documentation of the FOLDER target
    property for details.
    
    Also added global properties, USE_FOLDERS and
    PREDEFINED_TARGETS_FOLDER. See new docs here, too.
    
    By default, the FOLDER target property is used to organize
    targets into folders in IDEs that have support for such
    organization.
    
    This commit adds "solution folder" support to the Visual
    Studio generators. Currently works with versions 7 through
    10.
    
    Also, use the new FOLDER property in the ExternalProject
    test and in the CMake project itself.

diff --git a/CMakeLists.txt b/CMakeLists.txt
index c6ad85e..dec502b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -173,6 +173,18 @@ MACRO(CMAKE_SETUP_TESTING)
 ENDMACRO(CMAKE_SETUP_TESTING)
 
 
+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}")
+    ENDIF()
+  ENDIF()
+ENDMACRO(CMAKE_SET_TARGET_FOLDER)
+
 
 #-----------------------------------------------------------------------
 # a macro to build the utilities used by CMake
@@ -192,7 +204,17 @@ MACRO (CMAKE_BUILD_UTILITIES)
   SET(KWSYS_HEADER_ROOT ${CMake_BINARY_DIR}/Source)
   SET(KWSYS_INSTALL_DOC_DIR "${CMake_DOC_DEST}")
   ADD_SUBDIRECTORY(Source/kwsys)
-  
+  SET(kwsys_folder "Utilities/KWSys")
+  CMAKE_SET_TARGET_FOLDER(${KWSYS_NAMESPACE} "${kwsys_folder}")
+  CMAKE_SET_TARGET_FOLDER(${KWSYS_NAMESPACE}_c "${kwsys_folder}")
+  CMAKE_SET_TARGET_FOLDER(${KWSYS_NAMESPACE}EncodeExecutable "${kwsys_folder}")
+  CMAKE_SET_TARGET_FOLDER(${KWSYS_NAMESPACE}ProcessFwd9x "${kwsys_folder}")
+  CMAKE_SET_TARGET_FOLDER(${KWSYS_NAMESPACE}TestDynload "${kwsys_folder}")
+  CMAKE_SET_TARGET_FOLDER(${KWSYS_NAMESPACE}TestProcess "${kwsys_folder}")
+  CMAKE_SET_TARGET_FOLDER(${KWSYS_NAMESPACE}TestsC "${kwsys_folder}")
+  CMAKE_SET_TARGET_FOLDER(${KWSYS_NAMESPACE}TestsCxx "${kwsys_folder}")
+  CMAKE_SET_TARGET_FOLDER(${KWSYS_NAMESPACE}TestSharedForward "${kwsys_folder}")
+
   #---------------------------------------------------------------------
   # Setup third-party libraries.
   # Everything in the tree should be able to include files from the
@@ -221,6 +243,7 @@ MACRO (CMAKE_BUILD_UTILITIES)
     SET(CMAKE_ZLIB_INCLUDES)
     SET(CMAKE_ZLIB_LIBRARIES cmzlib)
     ADD_SUBDIRECTORY(Utilities/cmzlib)
+    CMAKE_SET_TARGET_FOLDER(cmzlib "Utilities/3rdParty")
   ENDIF(CMAKE_USE_SYSTEM_ZLIB)
   
   #---------------------------------------------------------------------
@@ -247,6 +270,8 @@ MACRO (CMAKE_BUILD_UTILITIES)
       SET(CMAKE_CURL_TEST_URL "${CMAKE_TESTS_CDASH_SERVER}/user.php")
     ENDIF(CMAKE_TESTS_CDASH_SERVER)
     ADD_SUBDIRECTORY(Utilities/cmcurl)
+    CMAKE_SET_TARGET_FOLDER(cmcurl "Utilities/3rdParty")
+    CMAKE_SET_TARGET_FOLDER(LIBCURL "Utilities/3rdParty")
   ENDIF(CMAKE_USE_SYSTEM_CURL)
 
   #---------------------------------------------------------------------
@@ -255,6 +280,7 @@ MACRO (CMAKE_BUILD_UTILITIES)
     "${CMAKE_CURRENT_BINARY_DIR}/Utilities/cmcompress")
   SET(CMAKE_COMPRESS_LIBRARIES "cmcompress")
   ADD_SUBDIRECTORY(Utilities/cmcompress)
+  CMAKE_SET_TARGET_FOLDER(cmcompress "Utilities/3rdParty")
   IF(CMAKE_USE_SYSTEM_BZIP2)
     FIND_PACKAGE(BZip2)
   ELSE()
@@ -262,6 +288,7 @@ MACRO (CMAKE_BUILD_UTILITIES)
       "${CMAKE_CURRENT_SOURCE_DIR}/Utilities/cmbzip2")
     SET(BZIP2_LIBRARIES cmbzip2)
     ADD_SUBDIRECTORY(Utilities/cmbzip2)
+    CMAKE_SET_TARGET_FOLDER(cmbzip2 "Utilities/3rdParty")
   ENDIF()
   IF(CMAKE_USE_SYSTEM_LIBARCHIVE)
     FIND_PACKAGE(libarchive)
@@ -275,6 +302,7 @@ MACRO (CMAKE_BUILD_UTILITIES)
     SET(BUILD_ARCHIVE_WITHIN_CMAKE TRUE)
     ADD_DEFINITIONS(-DLIBARCHIVE_STATIC)
     ADD_SUBDIRECTORY(Utilities/cmlibarchive)
+    CMAKE_SET_TARGET_FOLDER(cmlibarchive "Utilities/3rdParty")
     SET(CMAKE_TAR_LIBRARIES cmlibarchive ${BZIP2_LIBRARIES})
   ENDIF(CMAKE_USE_SYSTEM_LIBARCHIVE)
 
@@ -292,6 +320,7 @@ MACRO (CMAKE_BUILD_UTILITIES)
     SET(CMAKE_EXPAT_INCLUDES)
     SET(CMAKE_EXPAT_LIBRARIES cmexpat)
     ADD_SUBDIRECTORY(Utilities/cmexpat)
+    CMAKE_SET_TARGET_FOLDER(cmexpat "Utilities/3rdParty")
   ENDIF(CMAKE_USE_SYSTEM_EXPAT)
   
   #---------------------------------------------------------------------
@@ -521,6 +550,10 @@ ADD_SUBDIRECTORY(Source)
 ADD_SUBDIRECTORY(Utilities)
 ADD_SUBDIRECTORY(Tests)
 
+CMAKE_SET_TARGET_FOLDER(CMakeLibTests "Tests")
+CMAKE_SET_TARGET_FOLDER(cmw9xcom "Utilities/Win9xCompat")
+CMAKE_SET_TARGET_FOLDER(documentation "Documentation")
+
 # add a test
 ADD_TEST(SystemInformationNew "${CMAKE_CMAKE_COMMAND}" 
   --system-information  -G "${CMAKE_TEST_GENERATOR}" )
diff --git a/Modules/CTestTargets.cmake b/Modules/CTestTargets.cmake
index fc47ff8..c7f1394 100644
--- a/Modules/CTestTargets.cmake
+++ b/Modules/CTestTargets.cmake
@@ -65,6 +65,7 @@ IF(NOT _CTEST_TARGETS_ADDED)
       ${CMAKE_CTEST_COMMAND} ${__conf_types} -D ${mode}
       )
     SET_PROPERTY(TARGET ${mode} PROPERTY RULE_LAUNCH_CUSTOM "")
+    SET_PROPERTY(TARGET ${mode} PROPERTY FOLDER "CTestDashboardTargets")
   ENDFOREACH(mode)
 
   # For Makefile generators add more granular targets.
@@ -79,6 +80,7 @@ IF(NOT _CTEST_TARGETS_ADDED)
           ${CMAKE_CTEST_COMMAND} ${__conf_types} -D ${mode}${testtype}
           )
         SET_PROPERTY(TARGET ${mode}${testtype} PROPERTY RULE_LAUNCH_CUSTOM "")
+        SET_PROPERTY(TARGET ${mode}${testtype} PROPERTY FOLDER "CTestDashboardTargets")
       ENDFOREACH(testtype)
     ENDFOREACH(mode)
   ENDIF("${CMAKE_GENERATOR}" MATCHES Make)
diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx
index bd26b5f..8e77294 100644
--- a/Source/cmGlobalGenerator.cxx
+++ b/Source/cmGlobalGenerator.cxx
@@ -1837,6 +1837,38 @@ void cmGlobalGenerator::CreateDefaultGlobalTargets(cmTargets* targets)
     }
 }
 
+//----------------------------------------------------------------------------
+const char* cmGlobalGenerator::GetPredefinedTargetsFolder()
+{
+  const char* prop =
+    this->GetCMakeInstance()->GetProperty("PREDEFINED_TARGETS_FOLDER");
+
+  if (prop)
+    {
+    return prop;
+    }
+
+  return "CMakePredefinedTargets";
+}
+
+//----------------------------------------------------------------------------
+bool cmGlobalGenerator::UseFolderProperty()
+{
+  const char* prop = this->GetCMakeInstance()->GetProperty("USE_FOLDERS");
+
+  // If this property is defined, let the setter turn this on or off...
+  //
+  if (prop)
+    {
+    return cmSystemTools::IsOn(prop);
+    }
+
+  // By default, this feature is ON:
+  //
+  return true;
+}
+
+//----------------------------------------------------------------------------
 cmTarget cmGlobalGenerator::CreateGlobalTarget(
   const char* name, const char* message,
   const cmCustomCommandLines* commandLines,
@@ -1866,6 +1898,14 @@ cmTarget cmGlobalGenerator::CreateGlobalTarget(
     {
     target.AddUtility(dit->c_str());
     }
+
+  // Organize in the "predefined targets" folder:
+  //
+  if (this->UseFolderProperty())
+    {
+    target.SetProperty("FOLDER", this->GetPredefinedTargetsFolder());
+    }
+
   return target;
 }
 
diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h
index 878be11..554ee0f 100644
--- a/Source/cmGlobalGenerator.h
+++ b/Source/cmGlobalGenerator.h
@@ -320,6 +320,9 @@ protected:
   // All targets in the entire project.
   std::map<cmStdString,cmTarget *> TotalTargets;
 
+  virtual const char* GetPredefinedTargetsFolder();
+  virtual bool UseFolderProperty();
+
 private:
   float FirstTimeProgress;
   // If you add a new map here, make sure it is copied
diff --git a/Source/cmGlobalVisualStudio71Generator.cxx b/Source/cmGlobalVisualStudio71Generator.cxx
index 1191575..897c3a2 100644
--- a/Source/cmGlobalVisualStudio71Generator.cxx
+++ b/Source/cmGlobalVisualStudio71Generator.cxx
@@ -111,6 +111,13 @@ void cmGlobalVisualStudio71Generator
   OrderedTargetDependSet orderedProjectTargets(projectTargets);
 
   this->WriteTargetsToSolution(fout, root, orderedProjectTargets);
+
+  bool useFolderProperty = this->UseFolderProperty();
+  if (useFolderProperty)
+    {
+    this->WriteFolders(fout);
+    }
+
   // Write out the configurations information for the solution
   fout << "Global\n";
   // Write out the configurations for the solution
@@ -120,6 +127,15 @@ void cmGlobalVisualStudio71Generator
   // Write out the configurations for all the targets in the project
   this->WriteTargetConfigurations(fout, root, orderedProjectTargets);
   fout << "\tEndGlobalSection\n";
+
+  if (useFolderProperty)
+    {
+    // Write out project folders
+    fout << "\tGlobalSection(NestedProjects) = preSolution\n";
+    this->WriteFoldersContent(fout);
+    fout << "\tEndGlobalSection\n";
+    }
+
   // Write the footer for the SLN file
   this->WriteSLNFooter(fout);
 }
diff --git a/Source/cmGlobalVisualStudio7Generator.cxx b/Source/cmGlobalVisualStudio7Generator.cxx
index 9631e9a..f455810 100644
--- a/Source/cmGlobalVisualStudio7Generator.cxx
+++ b/Source/cmGlobalVisualStudio7Generator.cxx
@@ -300,6 +300,48 @@ void cmGlobalVisualStudio7Generator::WriteTargetsToSolution(
                             cmLocalGenerator::START_OUTPUT);
         this->WriteProject(fout, vcprojName, dir.c_str(),
                            *target);
+
+        // Create "solution folder" information from FOLDER target property
+        //
+        if (this->UseFolderProperty())
+          {
+          const char *targetFolder = target->GetProperty("FOLDER");
+          if (targetFolder)
+            {
+            std::vector<cmsys::String> tokens =
+              cmSystemTools::SplitString(targetFolder, '/', false);
+
+            std::string cumulativePath = "";
+
+            for(std::vector<cmsys::String>::iterator iter = tokens.begin();
+                iter != tokens.end(); ++iter)
+              {
+              if(!iter->size())
+                {
+                continue;
+                }
+
+              if (cumulativePath.empty())
+                {
+                cumulativePath = *iter;
+                }
+              else
+                {
+                VisualStudioFolders[cumulativePath].insert(
+                  cumulativePath + "/" + *iter);
+
+                cumulativePath = cumulativePath + "/" + *iter;
+                }
+
+              this->CreateGUID(cumulativePath.c_str());
+              }
+
+            if (!cumulativePath.empty())
+              {
+              VisualStudioFolders[cumulativePath].insert(target->GetName());
+              }
+            }
+          }
         }
       }
     }
@@ -327,6 +369,7 @@ void cmGlobalVisualStudio7Generator::WriteTargetDepends(
     }
 }
 
+//----------------------------------------------------------------------------
 // Write a SLN file to the stream
 void cmGlobalVisualStudio7Generator
 ::WriteSLNFile(std::ostream& fout,
@@ -344,6 +387,13 @@ void cmGlobalVisualStudio7Generator
   OrderedTargetDependSet orderedProjectTargets(projectTargets);
 
   this->WriteTargetsToSolution(fout, root, orderedProjectTargets);
+
+  bool useFolderProperty = this->UseFolderProperty();
+  if (useFolderProperty)
+    {
+    this->WriteFolders(fout);
+    }
+
   // Write out the configurations information for the solution
   fout << "Global\n"
        << "\tGlobalSection(SolutionConfiguration) = preSolution\n";
@@ -361,6 +411,14 @@ void cmGlobalVisualStudio7Generator
   this->WriteTargetDepends(fout, orderedProjectTargets);
   fout << "\tEndGlobalSection\n";
 
+  if (useFolderProperty)
+    {
+    // Write out project folders
+    fout << "\tGlobalSection(NestedProjects) = preSolution\n";
+    this->WriteFoldersContent(fout);
+    fout << "\tEndGlobalSection\n";
+    }
+
   // Write out the configurations for all the targets in the project
   fout << "\tGlobalSection(ProjectConfiguration) = postSolution\n";
   this->WriteTargetConfigurations(fout, root, orderedProjectTargets);
@@ -371,6 +429,47 @@ void cmGlobalVisualStudio7Generator
 }
 
 //----------------------------------------------------------------------------
+void cmGlobalVisualStudio7Generator::WriteFolders(std::ostream& fout)
+{
+  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, "/", "\\");
+
+    fout << "Project(\"{" <<
+      guidProjectTypeFolder << "}\") = \"" <<
+      nameOnly << "\", \"" <<
+      fullName << "\", \"{" <<
+      guid <<
+      "}\"\nEndProject\n";
+    }
+}
+
+//----------------------------------------------------------------------------
+void cmGlobalVisualStudio7Generator::WriteFoldersContent(std::ostream& fout)
+{
+  for(std::map<std::string,std::set<std::string> >::iterator iter =
+    VisualStudioFolders.begin(); iter != VisualStudioFolders.end(); ++iter)
+    {
+    std::string key(iter->first);
+    std::string guidParent(this->GetGUID(key.c_str()));
+
+    for(std::set<std::string>::iterator it = iter->second.begin();
+        it != iter->second.end(); ++it)
+      {
+      std::string value(*it);
+      std::string guid(this->GetGUID(value.c_str()));
+
+      fout << "\t\t{" << guid << "} = {" << guidParent << "}\n";
+      }
+    }
+}
+
+//----------------------------------------------------------------------------
 std::string
 cmGlobalVisualStudio7Generator::ConvertToSolutionPath(const char* path)
 {
diff --git a/Source/cmGlobalVisualStudio7Generator.h b/Source/cmGlobalVisualStudio7Generator.h
index 85ba244..b2c7141 100644
--- a/Source/cmGlobalVisualStudio7Generator.h
+++ b/Source/cmGlobalVisualStudio7Generator.h
@@ -142,6 +142,10 @@ protected:
   std::vector<std::string> Configurations;
   std::map<cmStdString, cmStdString> GUIDMap;
 
+  virtual void WriteFolders(std::ostream& fout);
+  virtual void WriteFoldersContent(std::ostream& fout);
+  std::map<std::string,std::set<std::string> > VisualStudioFolders;
+
   // Set during OutputSLNFile with the name of the current project.
   // There is one SLN file per project.
   std::string CurrentProject;
diff --git a/Source/cmGlobalVisualStudio8Generator.cxx b/Source/cmGlobalVisualStudio8Generator.cxx
index 6e0f048..7a979f8 100644
--- a/Source/cmGlobalVisualStudio8Generator.cxx
+++ b/Source/cmGlobalVisualStudio8Generator.cxx
@@ -136,6 +136,13 @@ void cmGlobalVisualStudio8Generator::AddCheckTarget()
                           no_working_directory, no_depends,
                           noCommandLines);
 
+  // Organize in the "predefined targets" folder:
+  //
+  if (this->UseFolderProperty())
+    {
+    tgt->SetProperty("FOLDER", this->GetPredefinedTargetsFolder());
+    }
+
   // Create a list of all stamp files for this project.
   std::vector<std::string> stamps;
   std::string stampList = cmake::GetCMakeFilesDirectoryPostSlash();
diff --git a/Source/cmGlobalVisualStudioGenerator.cxx b/Source/cmGlobalVisualStudioGenerator.cxx
index 85b4a71..e8a00bb 100644
--- a/Source/cmGlobalVisualStudioGenerator.cxx
+++ b/Source/cmGlobalVisualStudioGenerator.cxx
@@ -56,6 +56,21 @@ void cmGlobalVisualStudioGenerator::Generate()
         AddUtilityCommand("ALL_BUILD", true, no_working_dir,
                           no_depends, no_commands, false,
                           "Build all projects");
+
+#if 0
+      // Can't activate this code because we want ALL_BUILD
+      // selected as the default "startup project" when first
+      // opened in Visual Studio... And if it's nested in a
+      // folder, then that doesn't happen.
+      //
+      // Organize in the "predefined targets" folder:
+      //
+      if (this->UseFolderProperty())
+        {
+        allBuild->SetProperty("FOLDER", this->GetPredefinedTargetsFolder());
+        }
+#endif
+
       // Now make all targets depend on the ALL_BUILD target
       cmTargets targets;
       for(std::vector<cmLocalGenerator*>::iterator i = gen.begin();
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index 45ba358..9611912 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -854,10 +854,19 @@ void cmTarget::DefineProperties(cmake *cm)
      "set_source_files_properties command.");
 
   cm->DefineProperty
+    ("FOLDER", cmProperty::TARGET,
+     "Set the folder name. Use to organize targets in an IDE.",
+     "Targets with no FOLDER property will appear as top level "
+     "entities in IDEs like Visual Studio. Targets with the same "
+     "FOLDER property value will appear next to each other in a "
+     "folder of that name. To nest folders, use FOLDER values such "
+     "as 'GUI/Dialogs' with '/' characters separating folder levels.");
+
+  cm->DefineProperty
     ("PROJECT_LABEL", cmProperty::TARGET,
      "Change the name of a target in an IDE.",
      "Can be used to change the name of the target in an IDE "
-     "like visual stuido. ");
+     "like Visual Studio. ");
   cm->DefineProperty
     ("VS_KEYWORD", cmProperty::TARGET,
      "Visual Studio project keyword.",
diff --git a/Source/cmake.cxx b/Source/cmake.cxx
index cb20069..37ff7c5 100644
--- a/Source/cmake.cxx
+++ b/Source/cmake.cxx
@@ -3483,6 +3483,23 @@ void cmake::DefineProperties(cmake *cm)
      "the value of this property.  "
      "Non-Makefile generators currently ignore this property.");
 
+  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. "
+     "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 "
+     "for the FOLDER target property.");
+
+  cm->DefineProperty
+    ("PREDEFINED_TARGETS_FOLDER", cmProperty::GLOBAL,
+     "Name of FOLDER for targets that are added automatically by CMake.",
+     "If not set, CMake uses \"CMakePredefinedTargets\" as a default "
+     "value for this property. Targets such as INSTALL, PACKAGE and "
+     "RUN_TESTS will be organized into this FOLDER. See also the "
+     "documentation for the FOLDER target property.");
+
   // ================================================================
   // define variables as well
   // ================================================================
diff --git a/Tests/ExternalProject/CMakeLists.txt b/Tests/ExternalProject/CMakeLists.txt
index 99da9c4..00db5d4 100644
--- a/Tests/ExternalProject/CMakeLists.txt
+++ b/Tests/ExternalProject/CMakeLists.txt
@@ -7,6 +7,9 @@ find_package(CVS)
 find_package(Subversion)
 find_package(Git)
 
+set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER
+  "CMakePredefinedTargets-in-ExternalProjectTest")
+
 set(base "${CMAKE_BINARY_DIR}/CMakeExternals")
 set(binary_base "${base}/Build")
 set_property(DIRECTORY PROPERTY EP_BASE ${base})
@@ -41,6 +44,22 @@ endif()
 
 # Empty projects that test all the known ExternalProject_Add argument key words:
 #
+set(proj AAA-TestAlphabetization)
+ExternalProject_Add(${proj}
+  BUILD_COMMAND ""
+  CONFIGURE_COMMAND ""
+  DOWNLOAD_COMMAND ""
+  INSTALL_COMMAND ""
+)
+
+set(proj ZZZ-TestAlphabetization)
+ExternalProject_Add(${proj}
+  BUILD_COMMAND ""
+  CONFIGURE_COMMAND ""
+  DOWNLOAD_COMMAND ""
+  INSTALL_COMMAND ""
+)
+
 set(proj MinimalNoOpProject)
 ExternalProject_Add(${proj}
   BUILD_COMMAND ""
@@ -69,6 +88,7 @@ ExternalProject_Add(${proj}
   URL_MD5 ""
   UPDATE_COMMAND ""
 )
+set_property(TARGET ${proj} PROPERTY FOLDER "")
 
 
 # Local DIR:
@@ -80,6 +100,7 @@ if(can_build_tutorial_step5)
     CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -G ${CMAKE_GENERATOR} <SOURCE_DIR>
     TEST_BEFORE_INSTALL 1
   )
+  set_property(TARGET ${proj} PROPERTY FOLDER "Local")
   ExternalProject_Get_Property(${proj} install_dir)
   set(TutorialStep5_install_dir ${install_dir})
 
@@ -89,6 +110,7 @@ if(can_build_tutorial_step5)
     CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -G ${CMAKE_GENERATOR} <SOURCE_DIR>
     TEST_AFTER_INSTALL 1
   )
+  set_property(TARGET ${proj} PROPERTY FOLDER "Local")
 endif()
 
 
@@ -105,6 +127,7 @@ ExternalProject_Add(${proj}
              -DTEST_LIST:STRING=A::B::C
   INSTALL_COMMAND ""
 )
+set_property(TARGET ${proj} PROPERTY FOLDER "Local/TAR")
 
 set(proj TutorialStep1-LocalNoDirTAR)
 ExternalProject_Add(${proj}
@@ -115,6 +138,7 @@ ExternalProject_Add(${proj}
              -DTEST_LIST:STRING=1@@2@@3
   INSTALL_COMMAND ""
 )
+set_property(TARGET ${proj} PROPERTY FOLDER "Local/TAR")
 ExternalProject_Add_Step(${proj} mypatch
   COMMAND ${CMAKE_COMMAND} -E echo "This is a custom external project step."
   COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/Step1Patch.cmake
@@ -133,6 +157,7 @@ ExternalProject_Add(${proj}
   CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -G ${CMAKE_GENERATOR} <SOURCE_DIR>
   INSTALL_COMMAND ""
 )
+set_property(TARGET ${proj} PROPERTY FOLDER "Local/TGZ")
 
 set(proj TutorialStep1-LocalNoDirTGZ)
 ExternalProject_Add(${proj}
@@ -142,6 +167,7 @@ ExternalProject_Add(${proj}
   CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
   INSTALL_COMMAND ""
 )
+set_property(TARGET ${proj} PROPERTY FOLDER "Local/TGZ")
 
 
 # Local BZ2:
@@ -158,6 +184,7 @@ ExternalProject_Add(${proj}
   BUILD_COMMAND ""
   INSTALL_COMMAND ""
 )
+set_property(TARGET ${proj} PROPERTY FOLDER "Local/BZ2")
 
 set(proj TutorialStep1-LocalNoDirBZ2)
 ExternalProject_Add(${proj}
@@ -166,6 +193,7 @@ ExternalProject_Add(${proj}
   BUILD_COMMAND ""
   INSTALL_COMMAND ""
 )
+set_property(TARGET ${proj} PROPERTY FOLDER "Local/BZ2")
 
 
 # Local ZIP:
@@ -182,6 +210,7 @@ ExternalProject_Add(${proj}
   BUILD_COMMAND ""
   INSTALL_COMMAND ""
 )
+set_property(TARGET ${proj} PROPERTY FOLDER "Local/ZIP")
 
 set(proj TutorialStep1-LocalNoDirZIP)
 ExternalProject_Add(${proj}
@@ -190,6 +219,7 @@ ExternalProject_Add(${proj}
   BUILD_COMMAND ""
   INSTALL_COMMAND ""
 )
+set_property(TARGET ${proj} PROPERTY FOLDER "Local/ZIP")
 
 
 # CVS-based tests:
@@ -221,6 +251,8 @@ if(do_cvs_tests)
     CONFIGURE_COMMAND "${CVS_EXECUTABLE}" --version
     INSTALL_COMMAND ""
   )
+  set_property(TARGET ${proj}
+    PROPERTY FOLDER "SetupRepos/Local/Deeply/Nested/For/Testing")
 
   # CVS by date stamp:
   #
@@ -235,6 +267,7 @@ if(do_cvs_tests)
     INSTALL_COMMAND ""
     DEPENDS "SetupLocalCVSRepository"
   )
+  set_property(TARGET ${proj} PROPERTY FOLDER "CVS")
 
   # CVS by tag:
   #
@@ -249,6 +282,7 @@ if(do_cvs_tests)
     INSTALL_COMMAND ""
     DEPENDS "SetupLocalCVSRepository"
   )
+  set_property(TARGET ${proj} PROPERTY FOLDER "CVS")
 
   # Live CVS / HEAD (no CVS_TAG):
   #
@@ -268,6 +302,7 @@ if(do_cvs_tests)
     DEPENDS "TutorialStep1-CVS-20090626"
     DEPENDS "TutorialStep1-CVS-testtag1"
   )
+  set_property(TARGET ${proj} PROPERTY FOLDER "CVS")
 endif()
 
 
@@ -320,6 +355,8 @@ if(do_svn_tests)
     CONFIGURE_COMMAND "${Subversion_SVN_EXECUTABLE}" --version
     INSTALL_COMMAND ""
   )
+  set_property(TARGET ${proj}
+    PROPERTY FOLDER "SetupRepos/Local/Deeply/Nested/For/Testing")
 
   # SVN by date stamp:
   #
@@ -333,6 +370,7 @@ if(do_svn_tests)
     INSTALL_COMMAND ""
     DEPENDS "SetupLocalSVNRepository"
   )
+  set_property(TARGET ${proj} PROPERTY FOLDER "SVN")
 
   # SVN by revision number:
   #
@@ -346,6 +384,7 @@ if(do_svn_tests)
     INSTALL_COMMAND ""
     DEPENDS "SetupLocalSVNRepository"
   )
+  set_property(TARGET ${proj} PROPERTY FOLDER "SVN")
 
   # Live SVN / trunk (no SVN_REVISION):
   #
@@ -357,6 +396,7 @@ if(do_svn_tests)
     INSTALL_COMMAND ""
     DEPENDS "SetupLocalSVNRepository"
   )
+  set_property(TARGET ${proj} PROPERTY FOLDER "SVN")
 endif()
 
 
@@ -394,6 +434,8 @@ if(do_git_tests)
     CONFIGURE_COMMAND "${GIT_EXECUTABLE}" --version
     INSTALL_COMMAND ""
   )
+  set_property(TARGET ${proj}
+    PROPERTY FOLDER "SetupRepos/Local/Deeply/Nested/For/Testing")
 
   # git by commit id:
   #
@@ -407,6 +449,7 @@ if(do_git_tests)
     INSTALL_COMMAND ""
     DEPENDS "SetupLocalGITRepository"
   )
+  set_property(TARGET ${proj} PROPERTY FOLDER "GIT")
 
   # git by explicit branch/tag name:
   #
@@ -420,6 +463,7 @@ if(do_git_tests)
     INSTALL_COMMAND ""
     DEPENDS "SetupLocalGITRepository"
   )
+  set_property(TARGET ${proj} PROPERTY FOLDER "GIT")
 
   # Live git / master (no GIT_TAG):
   #
@@ -431,6 +475,7 @@ if(do_git_tests)
     INSTALL_COMMAND ""
     DEPENDS "SetupLocalGITRepository"
   )
+  set_property(TARGET ${proj} PROPERTY FOLDER "GIT")
 endif()
 
 

-----------------------------------------------------------------------

Summary of changes:
 CMakeLists.txt                             |   35 ++++++++++-
 Modules/CTestTargets.cmake                 |    2 +
 Source/cmGlobalGenerator.cxx               |   40 +++++++++++
 Source/cmGlobalGenerator.h                 |    3 +
 Source/cmGlobalVisualStudio71Generator.cxx |   16 +++++
 Source/cmGlobalVisualStudio7Generator.cxx  |   99 ++++++++++++++++++++++++++++
 Source/cmGlobalVisualStudio7Generator.h    |    4 +
 Source/cmGlobalVisualStudio8Generator.cxx  |    7 ++
 Source/cmGlobalVisualStudioGenerator.cxx   |   15 ++++
 Source/cmTarget.cxx                        |   11 +++-
 Source/cmake.cxx                           |   17 +++++
 Tests/ExternalProject/CMakeLists.txt       |   45 +++++++++++++
 12 files changed, 292 insertions(+), 2 deletions(-)


hooks/post-receive
-- 
CMake


More information about the Cmake-commits mailing list