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

Alex
This commit is contained in:
Alexander Neundorf 2007-08-27 17:05:43 -04:00
parent 8302ea66d2
commit 94f0eca689
2 changed files with 62 additions and 41 deletions

View File

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

View File

@ -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;
}; };