cmLocalGenerator: Add ComputeObjectFilenames interface.
Implement it in the local generators and use it in the global generators.
This commit is contained in:
parent
9ad804ac7b
commit
f6da044080
|
@ -19,6 +19,7 @@
|
|||
#include "cmVersion.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <assert.h>
|
||||
|
||||
const char* cmGlobalNinjaGenerator::NINJA_BUILD_FILE = "build.ninja";
|
||||
const char* cmGlobalNinjaGenerator::NINJA_RULES_FILE = "rules.ninja";
|
||||
|
@ -636,15 +637,21 @@ void cmGlobalNinjaGenerator::ComputeTargetObjects(cmGeneratorTarget* gt) const
|
|||
{
|
||||
std::vector<cmSourceFile const*> objectSources;
|
||||
gt->GetObjectSources(objectSources);
|
||||
// Compute the name of each object file.
|
||||
for(std::vector<cmSourceFile const*>::iterator
|
||||
si = objectSources.begin();
|
||||
si != objectSources.end(); ++si)
|
||||
|
||||
std::map<cmSourceFile const*, std::string> mapping;
|
||||
for(std::vector<cmSourceFile const*>::const_iterator it
|
||||
= objectSources.begin(); it != objectSources.end(); ++it)
|
||||
{
|
||||
cmSourceFile const* sf = *si;
|
||||
std::string objectName = gt->LocalGenerator
|
||||
->GetObjectFileNameWithoutTarget(*sf, gt->ObjectDirectory);
|
||||
gt->AddObject(sf, objectName);
|
||||
mapping[*it];
|
||||
}
|
||||
|
||||
gt->LocalGenerator->ComputeObjectFilenames(mapping, gt);
|
||||
|
||||
for(std::map<cmSourceFile const*, std::string>::const_iterator it
|
||||
= mapping.begin(); it != mapping.end(); ++it)
|
||||
{
|
||||
assert(!it->second.empty());
|
||||
gt->AddObject(it->first, it->second);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -110,15 +110,20 @@ cmGlobalUnixMakefileGenerator3
|
|||
{
|
||||
std::vector<cmSourceFile const*> objectSources;
|
||||
gt->GetObjectSources(objectSources);
|
||||
// Compute the name of each object file.
|
||||
for(std::vector<cmSourceFile const*>::iterator
|
||||
si = objectSources.begin();
|
||||
si != objectSources.end(); ++si)
|
||||
|
||||
std::map<cmSourceFile const*, std::string> mapping;
|
||||
for(std::vector<cmSourceFile const*>::const_iterator it
|
||||
= objectSources.begin(); it != objectSources.end(); ++it)
|
||||
{
|
||||
cmSourceFile const* sf = *si;
|
||||
std::string objectName = gt->LocalGenerator
|
||||
->GetObjectFileNameWithoutTarget(*sf, gt->ObjectDirectory);
|
||||
gt->AddObject(sf, objectName);
|
||||
mapping[*it];
|
||||
}
|
||||
|
||||
gt->LocalGenerator->ComputeObjectFilenames(mapping, gt);
|
||||
|
||||
for(std::map<cmSourceFile const*, std::string>::const_iterator it
|
||||
= mapping.begin(); it != mapping.end(); ++it)
|
||||
{
|
||||
gt->AddObject(it->first, it->second);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -122,42 +122,22 @@ void
|
|||
cmGlobalVisualStudioGenerator
|
||||
::ComputeTargetObjects(cmGeneratorTarget* gt) const
|
||||
{
|
||||
cmLocalVisualStudioGenerator* lg =
|
||||
static_cast<cmLocalVisualStudioGenerator*>(gt->LocalGenerator);
|
||||
std::string dir_max = lg->ComputeLongestObjectDirectory(*gt->Target);
|
||||
|
||||
// Count the number of object files with each name. Note that
|
||||
// windows file names are not case sensitive.
|
||||
std::map<std::string, int> counts;
|
||||
std::vector<cmSourceFile const*> objectSources;
|
||||
gt->GetObjectSources(objectSources);
|
||||
for(std::vector<cmSourceFile const*>::const_iterator
|
||||
si = objectSources.begin();
|
||||
si != objectSources.end(); ++si)
|
||||
|
||||
std::map<cmSourceFile const*, std::string> mapping;
|
||||
for(std::vector<cmSourceFile const*>::const_iterator it
|
||||
= objectSources.begin(); it != objectSources.end(); ++it)
|
||||
{
|
||||
cmSourceFile const* sf = *si;
|
||||
std::string objectNameLower = cmSystemTools::LowerCase(
|
||||
cmSystemTools::GetFilenameWithoutLastExtension(sf->GetFullPath()));
|
||||
objectNameLower += ".obj";
|
||||
counts[objectNameLower] += 1;
|
||||
mapping[*it];
|
||||
}
|
||||
|
||||
// For all source files producing duplicate names we need unique
|
||||
// object name computation.
|
||||
for(std::vector<cmSourceFile const*>::const_iterator
|
||||
si = objectSources.begin();
|
||||
si != objectSources.end(); ++si)
|
||||
gt->LocalGenerator->ComputeObjectFilenames(mapping, gt);
|
||||
|
||||
for(std::map<cmSourceFile const*, std::string>::const_iterator it
|
||||
= mapping.begin(); it != mapping.end(); ++it)
|
||||
{
|
||||
cmSourceFile const* sf = *si;
|
||||
std::string objectName =
|
||||
cmSystemTools::GetFilenameWithoutLastExtension(sf->GetFullPath());
|
||||
objectName += ".obj";
|
||||
if(counts[cmSystemTools::LowerCase(objectName)] > 1)
|
||||
{
|
||||
gt->AddExplicitObjectName(sf);
|
||||
objectName = lg->GetObjectFileNameWithoutTarget(*sf, dir_max);
|
||||
}
|
||||
gt->AddObject(sf, objectName);
|
||||
gt->AddObject(it->first, it->second);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3939,30 +3939,22 @@ void
|
|||
cmGlobalXCodeGenerator
|
||||
::ComputeTargetObjects(cmGeneratorTarget* gt) const
|
||||
{
|
||||
// Count the number of object files with each name. Warn about duplicate
|
||||
// names since Xcode names them uniquely automatically with a numeric suffix
|
||||
// to avoid exact duplicate file names. Note that Mac file names are not
|
||||
// typically case sensitive, hence the LowerCase.
|
||||
std::map<std::string, int> counts;
|
||||
std::vector<cmSourceFile const*> objectSources;
|
||||
gt->GetObjectSources(objectSources);
|
||||
for(std::vector<cmSourceFile const*>::const_iterator
|
||||
si = objectSources.begin();
|
||||
si != objectSources.end(); ++si)
|
||||
|
||||
std::map<cmSourceFile const*, std::string> mapping;
|
||||
for(std::vector<cmSourceFile const*>::const_iterator it
|
||||
= objectSources.begin(); it != objectSources.end(); ++it)
|
||||
{
|
||||
cmSourceFile const* sf = *si;
|
||||
std::string objectName =
|
||||
cmSystemTools::GetFilenameWithoutLastExtension(sf->GetFullPath());
|
||||
objectName += ".o";
|
||||
mapping[*it];
|
||||
}
|
||||
|
||||
std::string objectNameLower = cmSystemTools::LowerCase(objectName);
|
||||
counts[objectNameLower] += 1;
|
||||
if (2 == counts[objectNameLower])
|
||||
{
|
||||
// TODO: emit warning about duplicate name?
|
||||
}
|
||||
gt->LocalGenerator->ComputeObjectFilenames(mapping, gt);
|
||||
|
||||
gt->AddObject(sf, objectName);
|
||||
for(std::map<cmSourceFile const*, std::string>::const_iterator it
|
||||
= mapping.begin(); it != mapping.end(); ++it)
|
||||
{
|
||||
gt->AddObject(it->first, it->second);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3080,6 +3080,14 @@ cmLocalGenerator
|
|||
return it->second;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void cmLocalGenerator::ComputeObjectFilenames(
|
||||
std::map<cmSourceFile const*, std::string>&,
|
||||
cmGeneratorTarget const*)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
std::string
|
||||
cmLocalGenerator
|
||||
|
|
|
@ -372,6 +372,10 @@ public:
|
|||
std::string& linkPath,
|
||||
cmGeneratorTarget* target);
|
||||
|
||||
virtual void ComputeObjectFilenames(
|
||||
std::map<cmSourceFile const*, std::string>& mapping,
|
||||
cmGeneratorTarget const* gt = 0);
|
||||
|
||||
protected:
|
||||
///! put all the libraries for a target on into the given stream
|
||||
virtual void OutputLinkLibraries(std::string& linkLibraries,
|
||||
|
|
|
@ -267,6 +267,20 @@ void cmLocalNinjaGenerator::SetConfigName()
|
|||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void cmLocalNinjaGenerator::ComputeObjectFilenames(
|
||||
std::map<cmSourceFile const*, std::string>& mapping,
|
||||
cmGeneratorTarget const* gt)
|
||||
{
|
||||
for(std::map<cmSourceFile const*, std::string>::iterator
|
||||
si = mapping.begin(); si != mapping.end(); ++si)
|
||||
{
|
||||
cmSourceFile const* sf = si->first;
|
||||
si->second = this->GetObjectFileNameWithoutTarget(*sf,
|
||||
gt->ObjectDirectory);
|
||||
}
|
||||
}
|
||||
|
||||
void cmLocalNinjaGenerator::WriteProcessedMakefile(std::ostream& os)
|
||||
{
|
||||
cmGlobalNinjaGenerator::WriteDivider(os);
|
||||
|
|
|
@ -101,6 +101,10 @@ public:
|
|||
virtual std::string ConvertToLinkReference(std::string const& lib,
|
||||
OutputFormat format = SHELL);
|
||||
|
||||
virtual void ComputeObjectFilenames(
|
||||
std::map<cmSourceFile const*, std::string>& mapping,
|
||||
cmGeneratorTarget const* gt = 0);
|
||||
|
||||
|
||||
protected:
|
||||
virtual std::string ConvertToIncludeReference(std::string const& path,
|
||||
|
|
|
@ -171,6 +171,20 @@ void cmLocalUnixMakefileGenerator3::Generate()
|
|||
this->WriteDirectoryInformationFile();
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void cmLocalUnixMakefileGenerator3::ComputeObjectFilenames(
|
||||
std::map<cmSourceFile const*, std::string>& mapping,
|
||||
cmGeneratorTarget const* gt)
|
||||
{
|
||||
for(std::map<cmSourceFile const*, std::string>::iterator
|
||||
si = mapping.begin(); si != mapping.end(); ++si)
|
||||
{
|
||||
cmSourceFile const* sf = si->first;
|
||||
si->second = this->GetObjectFileNameWithoutTarget(*sf,
|
||||
gt->ObjectDirectory);
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void cmLocalUnixMakefileGenerator3::
|
||||
GetLocalObjectFiles(std::map<std::string, LocalObjectInfo> &localObjectFiles)
|
||||
|
|
|
@ -313,6 +313,10 @@ private:
|
|||
std::string MakeLauncher(cmCustomCommandGenerator const& ccg,
|
||||
cmTarget* target, RelativeRoot relative);
|
||||
|
||||
virtual void ComputeObjectFilenames(
|
||||
std::map<cmSourceFile const*, std::string>& mapping,
|
||||
cmGeneratorTarget const* gt = 0);
|
||||
|
||||
friend class cmMakefileTargetGenerator;
|
||||
friend class cmMakefileExecutableTargetGenerator;
|
||||
friend class cmMakefileLibraryTargetGenerator;
|
||||
|
|
|
@ -30,6 +30,46 @@ cmLocalVisualStudioGenerator::~cmLocalVisualStudioGenerator()
|
|||
{
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void cmLocalVisualStudioGenerator::ComputeObjectFilenames(
|
||||
std::map<cmSourceFile const*, std::string>& mapping,
|
||||
cmGeneratorTarget const* gt)
|
||||
{
|
||||
std::string dir_max = this->ComputeLongestObjectDirectory(*gt->Target);
|
||||
|
||||
// Count the number of object files with each name. Note that
|
||||
// windows file names are not case sensitive.
|
||||
std::map<std::string, int> counts;
|
||||
|
||||
for(std::map<cmSourceFile const*, std::string>::iterator
|
||||
si = mapping.begin(); si != mapping.end(); ++si)
|
||||
{
|
||||
cmSourceFile const* sf = si->first;
|
||||
std::string objectNameLower = cmSystemTools::LowerCase(
|
||||
cmSystemTools::GetFilenameWithoutLastExtension(sf->GetFullPath()));
|
||||
objectNameLower += ".obj";
|
||||
counts[objectNameLower] += 1;
|
||||
}
|
||||
|
||||
// For all source files producing duplicate names we need unique
|
||||
// object name computation.
|
||||
|
||||
for(std::map<cmSourceFile const*, std::string>::iterator
|
||||
si = mapping.begin(); si != mapping.end(); ++si)
|
||||
{
|
||||
cmSourceFile const* sf = si->first;
|
||||
std::string objectName =
|
||||
cmSystemTools::GetFilenameWithoutLastExtension(sf->GetFullPath());
|
||||
objectName += ".obj";
|
||||
if(counts[cmSystemTools::LowerCase(objectName)] > 1)
|
||||
{
|
||||
const_cast<cmGeneratorTarget*>(gt)->AddExplicitObjectName(sf);
|
||||
objectName = this->GetObjectFileNameWithoutTarget(*sf, dir_max);
|
||||
}
|
||||
si->second = objectName;
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
cmsys::auto_ptr<cmCustomCommand>
|
||||
cmLocalVisualStudioGenerator::MaybeCreateImplibDir(cmTarget& target,
|
||||
|
|
|
@ -61,6 +61,10 @@ public:
|
|||
|
||||
virtual void AddCMakeListsRules() = 0;
|
||||
|
||||
virtual void ComputeObjectFilenames(
|
||||
std::map<cmSourceFile const*, std::string>& mapping,
|
||||
cmGeneratorTarget const* = 0);
|
||||
|
||||
protected:
|
||||
virtual const char* ReportErrorLabel() const;
|
||||
virtual bool CustomCommandUseLocal() const { return false; }
|
||||
|
|
|
@ -71,3 +71,31 @@ void cmLocalXCodeGenerator::GenerateInstallRules()
|
|||
t->HasMacOSXRpathInstallNameDir("");
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void cmLocalXCodeGenerator::ComputeObjectFilenames(
|
||||
std::map<cmSourceFile const*, std::string>& mapping,
|
||||
cmGeneratorTarget const*)
|
||||
{
|
||||
// Count the number of object files with each name. Warn about duplicate
|
||||
// names since Xcode names them uniquely automatically with a numeric suffix
|
||||
// to avoid exact duplicate file names. Note that Mac file names are not
|
||||
// typically case sensitive, hence the LowerCase.
|
||||
std::map<std::string, int> counts;
|
||||
for(std::map<cmSourceFile const*, std::string>::iterator
|
||||
si = mapping.begin(); si != mapping.end(); ++si)
|
||||
{
|
||||
cmSourceFile const* sf = si->first;
|
||||
std::string objectName =
|
||||
cmSystemTools::GetFilenameWithoutLastExtension(sf->GetFullPath());
|
||||
objectName += ".o";
|
||||
|
||||
std::string objectNameLower = cmSystemTools::LowerCase(objectName);
|
||||
counts[objectNameLower] += 1;
|
||||
if (2 == counts[objectNameLower])
|
||||
{
|
||||
// TODO: emit warning about duplicate name?
|
||||
}
|
||||
si->second = objectName;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,6 +32,9 @@ public:
|
|||
const std::string& rawFlag);
|
||||
virtual void Generate();
|
||||
virtual void GenerateInstallRules();
|
||||
virtual void ComputeObjectFilenames(
|
||||
std::map<cmSourceFile const*, std::string>& mapping,
|
||||
cmGeneratorTarget const* gt = 0);
|
||||
private:
|
||||
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue