فهرست منبع

BUG: fix #5326: source files with the same name in different groups lead to colliding object file names

Alex
Alexander Neundorf 18 سال پیش
والد
کامیت
94f0eca689
2فایلهای تغییر یافته به همراه43 افزوده شده و 22 حذف شده
  1. 38 22
      Source/cmLocalVisualStudioGenerator.cxx
  2. 5 0
      Source/cmLocalVisualStudioGenerator.h

+ 38 - 22
Source/cmLocalVisualStudioGenerator.cxx

@@ -51,18 +51,13 @@ bool cmLocalVisualStudioGenerator::SourceFileCompiles(const cmSourceFile* sf)
 }
 }
 
 
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------
-void cmLocalVisualStudioGenerator::ComputeObjectNameRequirements
-(std::vector<cmSourceGroup> const& sourceGroups)
+void cmLocalVisualStudioGenerator::CountObjectNames(
+    const std::vector<cmSourceGroup>& groups,
+    std::map<cmStdString, int>& counts)
 {
 {
-  // Clear the current set of requirements.
-  this->NeedObjectName.clear();
-
-  // Count the number of object files with each name.  Note that
-  // windows file names are not case sensitive.
-  std::map<cmStdString, int> objectNameCounts;
-  for(unsigned int i = 0; i < sourceGroups.size(); ++i)
+  for(unsigned int i = 0; i < groups.size(); ++i)
     {
     {
-    cmSourceGroup sg = sourceGroups[i];
+    cmSourceGroup sg = groups[i];
     std::vector<const cmSourceFile*> const& srcs = sg.GetSourceFiles();
     std::vector<const cmSourceFile*> const& srcs = sg.GetSourceFiles();
     for(std::vector<const cmSourceFile*>::const_iterator s = srcs.begin();
     for(std::vector<const cmSourceFile*>::const_iterator s = srcs.begin();
         s != srcs.end(); ++s)
         s != srcs.end(); ++s)
@@ -70,21 +65,25 @@ void cmLocalVisualStudioGenerator::ComputeObjectNameRequirements
       const cmSourceFile* sf = *s;
       const cmSourceFile* sf = *s;
       if(this->SourceFileCompiles(sf))
       if(this->SourceFileCompiles(sf))
         {
         {
-        std::string objectName =
-          cmSystemTools::LowerCase(
+        std::string objectName = cmSystemTools::LowerCase(
             cmSystemTools::GetFilenameWithoutLastExtension(
             cmSystemTools::GetFilenameWithoutLastExtension(
               sf->GetFullPath()));
               sf->GetFullPath()));
         objectName += ".obj";
         objectName += ".obj";
-        objectNameCounts[objectName] += 1;
+        counts[objectName] += 1;
         }
         }
       }
       }
+    this->CountObjectNames(sg.GetGroupChildren(), counts);
     }
     }
+}
 
 
-  // For all source files producing duplicate names we need unique
-  // object name computation.
-  for(unsigned int i = 0; i < sourceGroups.size(); ++i)
+//----------------------------------------------------------------------------
+void cmLocalVisualStudioGenerator::InsertNeedObjectNames(
+   const std::vector<cmSourceGroup>& groups,
+    std::map<cmStdString, int>& count)
+{
+  for(unsigned int i = 0; i < groups.size(); ++i)
     {
     {
-    cmSourceGroup sg = sourceGroups[i];
+    cmSourceGroup sg = groups[i];
     std::vector<const cmSourceFile*> const& srcs = sg.GetSourceFiles();
     std::vector<const cmSourceFile*> const& srcs = sg.GetSourceFiles();
     for(std::vector<const cmSourceFile*>::const_iterator s = srcs.begin();
     for(std::vector<const cmSourceFile*>::const_iterator s = srcs.begin();
         s != srcs.end(); ++s)
         s != srcs.end(); ++s)
@@ -92,20 +91,37 @@ void cmLocalVisualStudioGenerator::ComputeObjectNameRequirements
       const cmSourceFile* sf = *s;
       const cmSourceFile* sf = *s;
       if(this->SourceFileCompiles(sf))
       if(this->SourceFileCompiles(sf))
         {
         {
-        std::string objectName =
-          cmSystemTools::LowerCase(
-            cmSystemTools::GetFilenameWithoutLastExtension(
-              sf->GetFullPath()));
+        std::string objectName = cmSystemTools::LowerCase(
+           cmSystemTools::GetFilenameWithoutLastExtension(sf->GetFullPath()));
         objectName += ".obj";
         objectName += ".obj";
-        if(objectNameCounts[objectName] > 1)
+        if(count[objectName] > 1)
           {
           {
           this->NeedObjectName.insert(sf);
           this->NeedObjectName.insert(sf);
           }
           }
         }
         }
       }
       }
+    this->InsertNeedObjectNames(sg.GetGroupChildren(), count);
     }
     }
 }
 }
 
 
+
+//----------------------------------------------------------------------------
+void cmLocalVisualStudioGenerator::ComputeObjectNameRequirements
+(std::vector<cmSourceGroup> const& sourceGroups)
+{
+  // Clear the current set of requirements.
+  this->NeedObjectName.clear();
+
+  // Count the number of object files with each name.  Note that
+  // windows file names are not case sensitive.
+  std::map<cmStdString, int> objectNameCounts;
+  this->CountObjectNames(sourceGroups, objectNameCounts);
+
+  // For all source files producing duplicate names we need unique
+  // object name computation.
+  this->InsertNeedObjectNames(sourceGroups, objectNameCounts);
+}
+
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------
 std::string
 std::string
 cmLocalVisualStudioGenerator
 cmLocalVisualStudioGenerator

+ 5 - 0
Source/cmLocalVisualStudioGenerator.h

@@ -46,6 +46,11 @@ protected:
   // Safe object file name generation.
   // Safe object file name generation.
   void ComputeObjectNameRequirements(std::vector<cmSourceGroup> const&);
   void ComputeObjectNameRequirements(std::vector<cmSourceGroup> const&);
   bool SourceFileCompiles(const cmSourceFile* sf);
   bool SourceFileCompiles(const cmSourceFile* sf);
+  void CountObjectNames(const std::vector<cmSourceGroup>& groups,
+                        std::map<cmStdString, int>& count);
+  void InsertNeedObjectNames(const std::vector<cmSourceGroup>& groups,
+                             std::map<cmStdString, int>& count);
+
   std::set<const cmSourceFile*> NeedObjectName;
   std::set<const cmSourceFile*> NeedObjectName;
 };
 };