Browse Source

Honor FOLDER on include_external_msproject targets (#11436)

Add FOLDER property usage to the VSExternalInclude test
and inspect results manually to verify behavior.

Thanks to Jens Auer for the bug report.
David Cole 15 years ago
parent
commit
b3cf739e2c
2 changed files with 49 additions and 37 deletions
  1. 41 37
      Source/cmGlobalVisualStudio7Generator.cxx
  2. 8 0
      Tests/VSExternalInclude/CMakeLists.txt

+ 41 - 37
Source/cmGlobalVisualStudio7Generator.cxx

@@ -279,6 +279,8 @@ void cmGlobalVisualStudio7Generator::WriteTargetsToSolution(
         projectTargets.begin(); tt != projectTargets.end(); ++tt)
         projectTargets.begin(); tt != projectTargets.end(); ++tt)
     {
     {
     cmTarget* target = *tt;
     cmTarget* target = *tt;
+    bool written = false;
+
     // handle external vc project files
     // handle external vc project files
     const char* expath = target->GetProperty("EXTERNAL_MSPROJECT");
     const char* expath = target->GetProperty("EXTERNAL_MSPROJECT");
     if(expath)
     if(expath)
@@ -287,6 +289,7 @@ void cmGlobalVisualStudio7Generator::WriteTargetsToSolution(
       std::string location = expath;
       std::string location = expath;
       this->WriteExternalProject(fout, project.c_str(), 
       this->WriteExternalProject(fout, project.c_str(), 
                                  location.c_str(), target->GetUtilities());
                                  location.c_str(), target->GetUtilities());
+      written = true;
       }
       }
     else
     else
       {
       {
@@ -300,47 +303,48 @@ void cmGlobalVisualStudio7Generator::WriteTargetsToSolution(
                             cmLocalGenerator::START_OUTPUT);
                             cmLocalGenerator::START_OUTPUT);
         this->WriteProject(fout, vcprojName, dir.c_str(),
         this->WriteProject(fout, vcprojName, dir.c_str(),
                            *target);
                            *target);
+        written = true;
+        }
+      }
 
 
-        // Create "solution folder" information from FOLDER target property
-        //
-        if (this->UseFolderProperty())
+    // Create "solution folder" information from FOLDER target property
+    //
+    if (written && 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)
           {
           {
-          const char *targetFolder = target->GetProperty("FOLDER");
-          if (targetFolder)
+          if(!iter->size())
             {
             {
-            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 = "CMAKE_FOLDER_GUID_" + *iter;
-                }
-              else
-                {
-                VisualStudioFolders[cumulativePath].insert(
-                  cumulativePath + "/" + *iter);
-
-                cumulativePath = cumulativePath + "/" + *iter;
-                }
-
-              this->CreateGUID(cumulativePath.c_str());
-              }
-
-            if (!cumulativePath.empty())
-              {
-              VisualStudioFolders[cumulativePath].insert(target->GetName());
-              }
+            continue;
             }
             }
+
+          if (cumulativePath.empty())
+            {
+            cumulativePath = "CMAKE_FOLDER_GUID_" + *iter;
+            }
+          else
+            {
+            VisualStudioFolders[cumulativePath].insert(
+              cumulativePath + "/" + *iter);
+
+            cumulativePath = cumulativePath + "/" + *iter;
+            }
+
+          this->CreateGUID(cumulativePath.c_str());
+          }
+
+        if (!cumulativePath.empty())
+          {
+          VisualStudioFolders[cumulativePath].insert(target->GetName());
           }
           }
         }
         }
       }
       }

+ 8 - 0
Tests/VSExternalInclude/CMakeLists.txt

@@ -50,3 +50,11 @@ IF(MSVC10)
   ADD_DEPENDENCIES(VSExternalInclude lib1)
   ADD_DEPENDENCIES(VSExternalInclude lib1)
 ENDIF()
 ENDIF()
 
 
+# Interaction testing between the FOLDER target property and
+# INCLUDE_EXTERNAL_MSPROJECT targets:
+set_target_properties(VSExternalInclude PROPERTIES FOLDER folder1/folder2)
+set_target_properties(lib1 PROPERTIES FOLDER folder1/folder2)
+set_target_properties(lib2 PROPERTIES FOLDER folder1/folder2)
+add_custom_target(EmptyCustomTarget)
+set_target_properties(EmptyCustomTarget PROPERTIES FOLDER folder1/folder2)
+set_property(GLOBAL PROPERTY USE_FOLDERS ON)