Pre-compute object file names before Xcode generation
This commit is contained in:
parent
247a132422
commit
8045e17119
|
@ -19,6 +19,7 @@
|
||||||
#include "cmComputeLinkInformation.h"
|
#include "cmComputeLinkInformation.h"
|
||||||
#include "cmSourceFile.h"
|
#include "cmSourceFile.h"
|
||||||
#include "cmCustomCommandGenerator.h"
|
#include "cmCustomCommandGenerator.h"
|
||||||
|
#include "cmGeneratorTarget.h"
|
||||||
|
|
||||||
#include <cmsys/auto_ptr.hxx>
|
#include <cmsys/auto_ptr.hxx>
|
||||||
|
|
||||||
|
@ -3611,3 +3612,51 @@ bool cmGlobalXCodeGenerator::IsMultiConfig()
|
||||||
// Newer Xcode versions are multi config:
|
// Newer Xcode versions are multi config:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
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<cmStdString, int> counts;
|
||||||
|
for(std::vector<cmSourceFile*>::const_iterator
|
||||||
|
si = gt->ObjectSources.begin();
|
||||||
|
si != gt->ObjectSources.end(); ++si)
|
||||||
|
{
|
||||||
|
cmSourceFile* sf = *si;
|
||||||
|
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?
|
||||||
|
}
|
||||||
|
|
||||||
|
gt->Objects[sf] = objectName;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* configName = this->GetCMakeCFGIntDir();
|
||||||
|
std::string dir = this->GetObjectsNormalDirectory(
|
||||||
|
this->CurrentProject, configName, gt->Target);
|
||||||
|
if(this->XcodeVersion >= 21)
|
||||||
|
{
|
||||||
|
dir += "$(CURRENT_ARCH)/";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#ifdef __ppc__
|
||||||
|
dir += "ppc/";
|
||||||
|
#endif
|
||||||
|
#ifdef __i386
|
||||||
|
dir += "i386/";
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
gt->ObjectDirectory = dir;
|
||||||
|
}
|
||||||
|
|
|
@ -206,6 +206,8 @@ protected:
|
||||||
std::vector<cmXCodeObject*> XCodeObjects;
|
std::vector<cmXCodeObject*> XCodeObjects;
|
||||||
cmXCodeObject* RootObject;
|
cmXCodeObject* RootObject;
|
||||||
private:
|
private:
|
||||||
|
void ComputeTargetObjects(cmGeneratorTarget* gt) const;
|
||||||
|
|
||||||
std::string GetObjectsNormalDirectory(
|
std::string GetObjectsNormalDirectory(
|
||||||
const std::string &projName,
|
const std::string &projName,
|
||||||
const std::string &configName,
|
const std::string &configName,
|
||||||
|
|
Loading…
Reference in New Issue