ENH: add link library stuff
This commit is contained in:
parent
25cc03fd6f
commit
f6f765e86f
@ -25,17 +25,32 @@
|
|||||||
|
|
||||||
//TODO
|
//TODO
|
||||||
// per file flags
|
// per file flags
|
||||||
|
// 115281011528101152810000 = {
|
||||||
|
// fileEncoding = 4;
|
||||||
|
// isa = PBXFileReference;
|
||||||
|
// lastKnownFileType = sourcecode.cpp.cpp;
|
||||||
|
// path = /Users/kitware/Bill/CMake/Source/cmakemain.cxx;
|
||||||
|
// refType = 0;
|
||||||
|
// sourceTree = "<absolute>";
|
||||||
|
// };
|
||||||
|
// 115285011528501152850000 = {
|
||||||
|
// fileRef = 115281011528101152810000;
|
||||||
|
// isa = PBXBuildFile;
|
||||||
|
// settings = {
|
||||||
|
// COMPILER_FLAGS = "-Dcmakemakeindefflag";
|
||||||
|
// };
|
||||||
|
// };
|
||||||
|
|
||||||
// custom commands and clean up custom targets
|
// custom commands and clean up custom targets
|
||||||
// do I need an ALL_BUILD
|
// do I need an ALL_BUILD yes
|
||||||
// link libraries stuff
|
|
||||||
// exe/lib output paths
|
// exe/lib output paths
|
||||||
// PBXBuildFile can not be reused, or error occurs
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
cmGlobalXCodeGenerator::cmGlobalXCodeGenerator()
|
cmGlobalXCodeGenerator::cmGlobalXCodeGenerator()
|
||||||
{
|
{
|
||||||
m_FindMakeProgramFile = "CMakeFindXCode.cmake";
|
m_FindMakeProgramFile = "CMakeFindXCode.cmake";
|
||||||
m_RootObject = 0;
|
m_RootObject = 0;
|
||||||
|
m_MainGroupChildren = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
@ -171,11 +186,10 @@ cmXCodeObject* cmGlobalXCodeGenerator::CreateObjectReference(cmXCodeObject* ref)
|
|||||||
|
|
||||||
cmXCodeObject*
|
cmXCodeObject*
|
||||||
cmGlobalXCodeGenerator::CreateXCodeSourceFile(cmLocalGenerator* lg,
|
cmGlobalXCodeGenerator::CreateXCodeSourceFile(cmLocalGenerator* lg,
|
||||||
cmSourceFile* sf,
|
cmSourceFile* sf)
|
||||||
cmXCodeObject* mainGroupChildren)
|
|
||||||
{
|
{
|
||||||
cmXCodeObject* fileRef = this->CreateObject(cmXCodeObject::PBXFileReference);
|
cmXCodeObject* fileRef = this->CreateObject(cmXCodeObject::PBXFileReference);
|
||||||
mainGroupChildren->AddObject(fileRef);
|
m_MainGroupChildren->AddObject(fileRef);
|
||||||
cmXCodeObject* buildFile = this->CreateObject(cmXCodeObject::PBXBuildFile);
|
cmXCodeObject* buildFile = this->CreateObject(cmXCodeObject::PBXBuildFile);
|
||||||
buildFile->AddAttribute("fileRef", this->CreateObjectReference(fileRef));
|
buildFile->AddAttribute("fileRef", this->CreateObjectReference(fileRef));
|
||||||
cmXCodeObject* settings = this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP);
|
cmXCodeObject* settings = this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP);
|
||||||
@ -214,8 +228,7 @@ cmGlobalXCodeGenerator::CreateXCodeSourceFile(cmLocalGenerator* lg,
|
|||||||
void
|
void
|
||||||
cmGlobalXCodeGenerator::CreateXCodeTargets(cmLocalGenerator* gen,
|
cmGlobalXCodeGenerator::CreateXCodeTargets(cmLocalGenerator* gen,
|
||||||
std::vector<cmXCodeObject*>&
|
std::vector<cmXCodeObject*>&
|
||||||
targets,
|
targets)
|
||||||
cmXCodeObject* mainGroupChildren)
|
|
||||||
{
|
{
|
||||||
m_CurrentLocalGenerator = gen;
|
m_CurrentLocalGenerator = gen;
|
||||||
m_CurrentMakefile = gen->GetMakefile();
|
m_CurrentMakefile = gen->GetMakefile();
|
||||||
@ -245,8 +258,7 @@ cmGlobalXCodeGenerator::CreateXCodeTargets(cmLocalGenerator* gen,
|
|||||||
for(std::vector<cmSourceFile*>::iterator i = classes.begin();
|
for(std::vector<cmSourceFile*>::iterator i = classes.begin();
|
||||||
i != classes.end(); ++i)
|
i != classes.end(); ++i)
|
||||||
{
|
{
|
||||||
buildFiles->AddObject(this->CreateXCodeSourceFile(gen, *i,
|
buildFiles->AddObject(this->CreateXCodeSourceFile(gen, *i));
|
||||||
mainGroupChildren));
|
|
||||||
}
|
}
|
||||||
// create header build phase
|
// create header build phase
|
||||||
cmXCodeObject* headerBuildPhase =
|
cmXCodeObject* headerBuildPhase =
|
||||||
@ -448,7 +460,6 @@ cmGlobalXCodeGenerator::CreateXCodeTarget(cmTarget& cmtarget,
|
|||||||
cmXCodeObject* fileRef = this->CreateObject(cmXCodeObject::PBXFileReference);
|
cmXCodeObject* fileRef = this->CreateObject(cmXCodeObject::PBXFileReference);
|
||||||
fileRef->AddAttribute("explicitFileType",
|
fileRef->AddAttribute("explicitFileType",
|
||||||
this->CreateString(fileTypeString.c_str()));
|
this->CreateString(fileTypeString.c_str()));
|
||||||
// fileRef->AddAttribute("includedInIndex", this->CreateString("0"));
|
|
||||||
fileRef->AddAttribute("path", this->CreateString(productName.c_str()));
|
fileRef->AddAttribute("path", this->CreateString(productName.c_str()));
|
||||||
fileRef->AddAttribute("refType", this->CreateString("3"));
|
fileRef->AddAttribute("refType", this->CreateString("3"));
|
||||||
fileRef->AddAttribute("sourceTree",
|
fileRef->AddAttribute("sourceTree",
|
||||||
@ -535,9 +546,54 @@ void cmGlobalXCodeGenerator::AddLinkTarget(cmXCodeObject* target ,
|
|||||||
files->AddObject(buildfile);
|
files->AddObject(buildfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmGlobalXCodeGenerator::AddLinkFlag(cmXCodeObject* ,
|
void cmGlobalXCodeGenerator::AddLinkFlag(cmXCodeObject* target,
|
||||||
const char*)
|
const char* flag)
|
||||||
{
|
{
|
||||||
|
if(cmSystemTools::FileIsFullPath(flag))
|
||||||
|
{
|
||||||
|
std::string libPath = flag;
|
||||||
|
cmXCodeObject* fileRef =
|
||||||
|
this->CreateObject(cmXCodeObject::PBXFileReference);
|
||||||
|
if(libPath[libPath.size()-1] == 'a')
|
||||||
|
{
|
||||||
|
fileRef->AddAttribute("lastKnownFileType",
|
||||||
|
this->CreateString("archive.ar"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fileRef->AddAttribute("lastKnownFileType",
|
||||||
|
this->CreateString("compiled.mach-o.dylib"));
|
||||||
|
}
|
||||||
|
fileRef->AddAttribute("name",
|
||||||
|
this->CreateString(
|
||||||
|
cmSystemTools::GetFilenameName(libPath).c_str()));
|
||||||
|
|
||||||
|
fileRef->AddAttribute("path", this->CreateString(libPath.c_str()));
|
||||||
|
fileRef->AddAttribute("refType", this->CreateString("0"));
|
||||||
|
fileRef->AddAttribute("sourceTree", this->CreateString("<absolute>"));
|
||||||
|
cmXCodeObject* buildfile = this->CreateObject(cmXCodeObject::PBXBuildFile);
|
||||||
|
buildfile->AddAttribute("fileRef", this->CreateObjectReference(fileRef));
|
||||||
|
cmXCodeObject* settings =
|
||||||
|
this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP);
|
||||||
|
buildfile->AddAttribute("settings", settings);
|
||||||
|
// get the framework build phase from the target
|
||||||
|
cmXCodeObject* buildPhases = target->GetObject("buildPhases");
|
||||||
|
cmXCodeObject* frameworkBuildPhase =
|
||||||
|
buildPhases->GetObject(cmXCodeObject::PBXFrameworksBuildPhase);
|
||||||
|
cmXCodeObject* files = frameworkBuildPhase->GetObject("files");
|
||||||
|
files->AddObject(buildfile);
|
||||||
|
m_MainGroupChildren->AddObject(fileRef);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cmXCodeObject* settings = target->GetObject("buildSettings");
|
||||||
|
cmXCodeObject* ldflags = settings->GetObject("OTHER_LDFLAGS");
|
||||||
|
std::string link = ldflags->GetString();
|
||||||
|
cmSystemTools::ReplaceString(link, "\"", "");
|
||||||
|
link += " -l";
|
||||||
|
link += flag;
|
||||||
|
ldflags->SetString(link.c_str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmGlobalXCodeGenerator::AddDependAndLinkInformation(cmXCodeObject* target)
|
void cmGlobalXCodeGenerator::AddDependAndLinkInformation(cmXCodeObject* target)
|
||||||
@ -566,7 +622,10 @@ void cmGlobalXCodeGenerator::AddDependAndLinkInformation(cmXCodeObject* target)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this->AddLinkFlag(target, j->first.c_str());
|
if(cmtarget->GetType() != cmTarget::STATIC_LIBRARY)
|
||||||
|
{
|
||||||
|
this->AddLinkFlag(target, j->first.c_str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
std::set<cmStdString>::const_iterator i, end;
|
std::set<cmStdString>::const_iterator i, end;
|
||||||
@ -606,6 +665,7 @@ void cmGlobalXCodeGenerator::CreateXCodeObjects(cmLocalGenerator* ,
|
|||||||
{
|
{
|
||||||
this->ClearXCodeObjects();
|
this->ClearXCodeObjects();
|
||||||
m_RootObject = 0;
|
m_RootObject = 0;
|
||||||
|
m_MainGroupChildren = 0;
|
||||||
cmXCodeObject* group = this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP);
|
cmXCodeObject* group = this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP);
|
||||||
group->AddAttribute("COPY_PHASE_STRIP", this->CreateString("NO"));
|
group->AddAttribute("COPY_PHASE_STRIP", this->CreateString("NO"));
|
||||||
cmXCodeObject* developBuildStyle = this->CreateObject(cmXCodeObject::PBXBuildStyle);
|
cmXCodeObject* developBuildStyle = this->CreateObject(cmXCodeObject::PBXBuildStyle);
|
||||||
@ -623,9 +683,9 @@ void cmGlobalXCodeGenerator::CreateXCodeObjects(cmLocalGenerator* ,
|
|||||||
listObjs->AddObject(deployBuildStyle);
|
listObjs->AddObject(deployBuildStyle);
|
||||||
|
|
||||||
cmXCodeObject* mainGroup = this->CreateObject(cmXCodeObject::PBXGroup);
|
cmXCodeObject* mainGroup = this->CreateObject(cmXCodeObject::PBXGroup);
|
||||||
cmXCodeObject* mainGroupChildren =
|
m_MainGroupChildren =
|
||||||
this->CreateObject(cmXCodeObject::OBJECT_LIST);
|
this->CreateObject(cmXCodeObject::OBJECT_LIST);
|
||||||
mainGroup->AddAttribute("children", mainGroupChildren);
|
mainGroup->AddAttribute("children", m_MainGroupChildren);
|
||||||
mainGroup->AddAttribute("refType", this->CreateString("4"));
|
mainGroup->AddAttribute("refType", this->CreateString("4"));
|
||||||
mainGroup->AddAttribute("sourceTree", this->CreateString("<group>"));
|
mainGroup->AddAttribute("sourceTree", this->CreateString("<group>"));
|
||||||
|
|
||||||
@ -636,7 +696,7 @@ void cmGlobalXCodeGenerator::CreateXCodeObjects(cmLocalGenerator* ,
|
|||||||
cmXCodeObject* productGroupChildren =
|
cmXCodeObject* productGroupChildren =
|
||||||
this->CreateObject(cmXCodeObject::OBJECT_LIST);
|
this->CreateObject(cmXCodeObject::OBJECT_LIST);
|
||||||
productGroup->AddAttribute("children", productGroupChildren);
|
productGroup->AddAttribute("children", productGroupChildren);
|
||||||
mainGroupChildren->AddObject(productGroup);
|
m_MainGroupChildren->AddObject(productGroup);
|
||||||
|
|
||||||
|
|
||||||
m_RootObject = this->CreateObject(cmXCodeObject::PBXProject);
|
m_RootObject = this->CreateObject(cmXCodeObject::PBXProject);
|
||||||
@ -651,7 +711,7 @@ void cmGlobalXCodeGenerator::CreateXCodeObjects(cmLocalGenerator* ,
|
|||||||
for(std::vector<cmLocalGenerator*>::iterator i = generators.begin();
|
for(std::vector<cmLocalGenerator*>::iterator i = generators.begin();
|
||||||
i != generators.end(); ++i)
|
i != generators.end(); ++i)
|
||||||
{
|
{
|
||||||
this->CreateXCodeTargets(*i, targets, mainGroupChildren);
|
this->CreateXCodeTargets(*i, targets);
|
||||||
}
|
}
|
||||||
cmXCodeObject* allTargets = this->CreateObject(cmXCodeObject::OBJECT_LIST);
|
cmXCodeObject* allTargets = this->CreateObject(cmXCodeObject::OBJECT_LIST);
|
||||||
for(std::vector<cmXCodeObject*>::iterator i = targets.begin();
|
for(std::vector<cmXCodeObject*>::iterator i = targets.begin();
|
||||||
|
@ -92,10 +92,9 @@ private:
|
|||||||
void WriteXCodePBXProj(std::ostream& fout,
|
void WriteXCodePBXProj(std::ostream& fout,
|
||||||
cmLocalGenerator* root,
|
cmLocalGenerator* root,
|
||||||
std::vector<cmLocalGenerator*>& generators);
|
std::vector<cmLocalGenerator*>& generators);
|
||||||
cmXCodeObject* CreateXCodeSourceFile(cmLocalGenerator* gen, cmSourceFile* sf,
|
cmXCodeObject* CreateXCodeSourceFile(cmLocalGenerator* gen,
|
||||||
cmXCodeObject* mainGroupChildren);
|
cmSourceFile* sf);
|
||||||
void CreateXCodeTargets(cmLocalGenerator* gen, std::vector<cmXCodeObject*>&,
|
void CreateXCodeTargets(cmLocalGenerator* gen, std::vector<cmXCodeObject*>&);
|
||||||
cmXCodeObject* mainGroupChildren);
|
|
||||||
void AddDependTarget(cmXCodeObject* target,
|
void AddDependTarget(cmXCodeObject* target,
|
||||||
cmXCodeObject* dependTarget);
|
cmXCodeObject* dependTarget);
|
||||||
void AddLinkTarget(cmXCodeObject* target,
|
void AddLinkTarget(cmXCodeObject* target,
|
||||||
@ -105,6 +104,7 @@ private:
|
|||||||
private:
|
private:
|
||||||
std::vector<cmXCodeObject*> m_XCodeObjects;
|
std::vector<cmXCodeObject*> m_XCodeObjects;
|
||||||
cmXCodeObject* m_RootObject;
|
cmXCodeObject* m_RootObject;
|
||||||
|
cmXCodeObject* m_MainGroupChildren;
|
||||||
cmMakefile* m_CurrentMakefile;
|
cmMakefile* m_CurrentMakefile;
|
||||||
cmLocalGenerator* m_CurrentLocalGenerator;
|
cmLocalGenerator* m_CurrentLocalGenerator;
|
||||||
};
|
};
|
||||||
|
@ -27,6 +27,10 @@ public:
|
|||||||
m_String += s;
|
m_String += s;
|
||||||
m_String += "\"";
|
m_String += "\"";
|
||||||
}
|
}
|
||||||
|
const char* GetString()
|
||||||
|
{
|
||||||
|
return m_String.c_str();
|
||||||
|
}
|
||||||
|
|
||||||
void AddAttribute(const char* name, cmXCodeObject* value)
|
void AddAttribute(const char* name, cmXCodeObject* value)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user