diff options
author | Bill Hoffman <bill.hoffman@kitware.com> | 2005-01-24 22:35:54 (GMT) |
---|---|---|
committer | Bill Hoffman <bill.hoffman@kitware.com> | 2005-01-24 22:35:54 (GMT) |
commit | e57b17df7ea01e259cbd74590ebfaff7a32d987d (patch) | |
tree | 5cca482fb9f80fefe818c65e7d379c28b24a3fa7 | |
parent | a921ccaa2a590d2f83c6e81c1c41093a73d9abb8 (diff) | |
download | CMake-e57b17df7ea01e259cbd74590ebfaff7a32d987d.zip CMake-e57b17df7ea01e259cbd74590ebfaff7a32d987d.tar.gz CMake-e57b17df7ea01e259cbd74590ebfaff7a32d987d.tar.bz2 |
ENH: initial xcode stuff
-rw-r--r-- | Source/cmGlobalXCodeGenerator.cxx | 179 | ||||
-rw-r--r-- | Source/cmGlobalXCodeGenerator.h | 81 | ||||
-rw-r--r-- | Source/cmLocalXCodeGenerator.cxx | 10 | ||||
-rw-r--r-- | Source/cmLocalXCodeGenerator.h | 40 | ||||
-rw-r--r-- | Source/cmXCodeObject.cxx | 50 | ||||
-rw-r--r-- | Source/cmXCodeObject.h | 10 |
6 files changed, 344 insertions, 26 deletions
diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx new file mode 100644 index 0000000..0031243 --- /dev/null +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -0,0 +1,179 @@ +/*========================================================================= + + Program: CMake - Cross-Platform Makefile Generator + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved. + See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#include "cmGlobalXCodeGenerator.h" +#include "cmLocalXCodeGenerator.h" +#include "cmMakefile.h" +#include "cmXCodeObject.h" +#include "cmake.h" +#include "cmGeneratedFileStream.h" + +//---------------------------------------------------------------------------- +cmGlobalXCodeGenerator::cmGlobalXCodeGenerator() +{ + m_FindMakeProgramFile = "CMakeFindXCode.cmake"; + m_RootObject = 0; +} + +//---------------------------------------------------------------------------- +void cmGlobalXCodeGenerator::EnableLanguage(std::vector<std::string>const& lang, + cmMakefile *mf) +{ + //this->cmGlobalGenerator::EnableLanguage(lang, mf); +} + +//---------------------------------------------------------------------------- +int cmGlobalXCodeGenerator::TryCompile(const char *, + const char *bindir, + const char *projectName, + const char *targetName, + std::string *output, + cmMakefile* mf) +{ + // FIXME + return 1; +} + +//---------------------------------------------------------------------------- +///! Create a local generator appropriate to this Global Generator +cmLocalGenerator *cmGlobalXCodeGenerator::CreateLocalGenerator() +{ + cmLocalGenerator *lg = new cmLocalXCodeGenerator; + lg->SetGlobalGenerator(this); + return lg; +} + +//---------------------------------------------------------------------------- +void cmGlobalXCodeGenerator::Generate() +{ + this->cmGlobalGenerator::Generate(); + std::map<cmStdString, std::vector<cmLocalGenerator*> >::iterator it; + for(it = m_ProjectMap.begin(); it!= m_ProjectMap.end(); ++it) + { + this->OutputXCodeProject(it->second[0], it->second); + } +} + +//---------------------------------------------------------------------------- +void cmGlobalXCodeGenerator::ClearXCodeObjects() +{ + for(unsigned int i = 0; i < m_XCodeObjects.size(); ++i) + { + delete m_XCodeObjects[i]; + } + m_XCodeObjects.clear(); +} + +//---------------------------------------------------------------------------- +cmXCodeObject* cmGlobalXCodeGenerator::CreateObject(cmXCodeObject::PBXType ptype, + cmXCodeObject::Type type) +{ + cmXCodeObject* obj = new cmXCodeObject(ptype, type); + m_XCodeObjects.push_back(obj); + return obj; +} + +//---------------------------------------------------------------------------- +void cmGlobalXCodeGenerator::CreateXCodeObjects(cmLocalGenerator* root, + std::vector<cmLocalGenerator*>& + generators) +{ + delete m_RootObject; + this->ClearXCodeObjects(); + cmXCodeObject* group = this->CreateObject(cmXCodeObject::None, cmXCodeObject::ATTRIBUTE_GROUP); + group->AddAttribute("COPY_PHASE_STRIP", "NO"); + cmXCodeObject* developBuildStyle = this->CreateObject(cmXCodeObject::PBXBuildStyle, + cmXCodeObject::OBJECT); + developBuildStyle->AddAttribute("name", "Development"); + developBuildStyle->AddAttribute("buildSettings", group); + + group = this->CreateObject(cmXCodeObject::None, cmXCodeObject::ATTRIBUTE_GROUP); + group->AddAttribute("COPY_PHASE_STRIP", "YES"); + cmXCodeObject* deployBuildStyle = this->CreateObject(cmXCodeObject::PBXBuildStyle, + cmXCodeObject::OBJECT); + deployBuildStyle->AddAttribute("name", "Deployment"); + deployBuildStyle->AddAttribute("buildSettings", group); + + cmXCodeObject* listObjs = this->CreateObject(cmXCodeObject::None, + cmXCodeObject::OBJECT_LIST); + listObjs->AddObject(developBuildStyle); + listObjs->AddObject(deployBuildStyle); + + + m_RootObject = this->CreateObject(cmXCodeObject::PBXProject, cmXCodeObject::OBJECT); + group = this->CreateObject(cmXCodeObject::None, cmXCodeObject::ATTRIBUTE_GROUP); + m_RootObject->AddAttribute("buildSettings", group); + m_RootObject->AddAttribute("buildSyles", listObjs); + m_RootObject->AddAttribute("hasScannedForEncodings", "0"); + +} + +//---------------------------------------------------------------------------- +void cmGlobalXCodeGenerator::OutputXCodeProject(cmLocalGenerator* root, + std::vector<cmLocalGenerator*>& + generators) +{ + if(generators.size() == 0) + { + return; + } + this->CreateXCodeObjects(root, + generators); + std::string xcodeDir = root->GetMakefile()->GetStartOutputDirectory(); + xcodeDir += "/"; + xcodeDir += root->GetMakefile()->GetProjectName(); + xcodeDir += ".xcode"; + cmSystemTools::MakeDirectory(xcodeDir.c_str()); + xcodeDir += "/project.pbxproj"; + cmGeneratedFileStream fout(xcodeDir.c_str()); + fout.SetCopyIfDifferent(true); + if(!fout) + { + return; + } + this->WriteXCodePBXProj(fout, root, generators); + this->ClearXCodeObjects(); +} + +//---------------------------------------------------------------------------- +void cmGlobalXCodeGenerator::WriteXCodePBXProj(std::ostream& fout, + cmLocalGenerator* root, + std::vector<cmLocalGenerator*>& + generators) +{ + fout << "// !$*UTF8*$!\n"; + fout << "{\n"; + cmXCodeObject::Indent(1, fout); + fout << "archiveVersion = 1;\n"; + cmXCodeObject::Indent(1, fout); + fout << "classes = {\n"; + cmXCodeObject::Indent(1, fout); + fout << "};\n"; + cmXCodeObject::Indent(1, fout); + fout << "objectVersion = 39;\n"; + cmXCodeObject::PrintList(m_XCodeObjects, fout); + cmXCodeObject::Indent(1, fout); + fout << "rootObject = " << m_RootObject->GetId() << ";\n"; + fout << "}\n"; +} + +//---------------------------------------------------------------------------- +void cmGlobalXCodeGenerator::GetDocumentation(cmDocumentationEntry& entry) const +{ + entry.name = this->GetName(); + entry.brief = "NOT YET WORKING, Will generates XCode project files."; + entry.full = ""; +} diff --git a/Source/cmGlobalXCodeGenerator.h b/Source/cmGlobalXCodeGenerator.h new file mode 100644 index 0000000..543fb6f --- /dev/null +++ b/Source/cmGlobalXCodeGenerator.h @@ -0,0 +1,81 @@ +/*========================================================================= + + Program: CMake - Cross-Platform Makefile Generator + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved. + See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#ifndef cmGlobalXCodeGenerator_h +#define cmGlobalXCodeGenerator_h + +#include "cmGlobalGenerator.h" +#include "cmXCodeObject.h" +class cmTarget; + +/** \class cmGlobalXCodeGenerator + * \brief Write a Unix makefiles. + * + * cmGlobalXCodeGenerator manages UNIX build process for a tree + */ +class cmGlobalXCodeGenerator : public cmGlobalGenerator +{ +public: + cmGlobalXCodeGenerator(); + static cmGlobalGenerator* New() { return new cmGlobalXCodeGenerator; } + + ///! Get the name for the generator. + virtual const char* GetName() const { + return cmGlobalXCodeGenerator::GetActualName();} + static const char* GetActualName() {return "XCode";} + + /** Get the documentation entry for this generator. */ + virtual void GetDocumentation(cmDocumentationEntry& entry) const; + + ///! Create a local generator appropriate to this Global Generator + virtual cmLocalGenerator *CreateLocalGenerator(); + + /** + * Try to determine system infomation such as shared library + * extension, pthreads, byte order etc. + */ + virtual void EnableLanguage(std::vector<std::string>const& languages, cmMakefile *); + /** + * Try running cmake and building a file. This is used for dynalically + * loaded commands, not as part of the usual build process. + */ + virtual int TryCompile(const char *srcdir, const char *bindir, + const char *projectName, const char *targetName, + std::string *output, cmMakefile* mf); + + /** + * Generate the all required files for building this project/tree. This + * basically creates a series of LocalGenerators for each directory and + * requests that they Generate. + */ + virtual void Generate(); + +private: + cmXCodeObject* CreateObject(cmXCodeObject::PBXType ptype, cmXCodeObject::Type type); + void ClearXCodeObjects(); + void CreateXCodeObjects(cmLocalGenerator* root, + std::vector<cmLocalGenerator*>& generators); + void OutputXCodeProject(cmLocalGenerator* root, + std::vector<cmLocalGenerator*>& generators); + void WriteXCodePBXProj(std::ostream& fout, + cmLocalGenerator* root, + std::vector<cmLocalGenerator*>& generators); + + std::vector<cmXCodeObject*> m_XCodeObjects; + cmXCodeObject* m_RootObject; +}; + +#endif diff --git a/Source/cmLocalXCodeGenerator.cxx b/Source/cmLocalXCodeGenerator.cxx new file mode 100644 index 0000000..eb709b3 --- /dev/null +++ b/Source/cmLocalXCodeGenerator.cxx @@ -0,0 +1,10 @@ +#include "cmLocalXCodeGenerator.h" + +cmLocalXCodeGenerator::cmLocalXCodeGenerator() +{ +} + +cmLocalXCodeGenerator::~cmLocalXCodeGenerator() +{ +} + diff --git a/Source/cmLocalXCodeGenerator.h b/Source/cmLocalXCodeGenerator.h new file mode 100644 index 0000000..ddc8f46 --- /dev/null +++ b/Source/cmLocalXCodeGenerator.h @@ -0,0 +1,40 @@ +/*========================================================================= + + Program: CMake - Cross-Platform Makefile Generator + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved. + See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#ifndef cmLocalXCodeGenerator_h +#define cmLocalXCodeGenerator_h + +#include "cmLocalGenerator.h" + +/** \class cmLocalXCodeGenerator + * \brief Write a local Xcode project + * + * cmLocalXCodeGenerator produces a LocalUnix makefile from its + * member m_Makefile. + */ +class cmLocalXCodeGenerator : public cmLocalGenerator +{ +public: + ///! Set cache only and recurse to false by default. + cmLocalXCodeGenerator(); + + virtual ~cmLocalXCodeGenerator(); +private: + +}; + +#endif + diff --git a/Source/cmXCodeObject.cxx b/Source/cmXCodeObject.cxx index a218b53..9104ca4 100644 --- a/Source/cmXCodeObject.cxx +++ b/Source/cmXCodeObject.cxx @@ -8,8 +8,7 @@ const char* cmXCodeObject::PBXTypeNames[] = { "None" }; -std::vector<cmXCodeObject*> cmXCodeObject::s_AllObjects; - +//---------------------------------------------------------------------------- cmXCodeObject::cmXCodeObject(PBXType ptype, Type type) { m_IsA = ptype; @@ -17,10 +16,13 @@ cmXCodeObject::cmXCodeObject(PBXType ptype, Type type) str << (void*)this; m_Id = str.str(); m_Type = type; - cmXCodeObject::s_AllObjects.push_back(this); + if(m_Type == OBJECT) + { + this->AddAttribute("isa", PBXTypeNames[m_IsA]); + } } - +//---------------------------------------------------------------------------- void cmXCodeObject::Indent(int level, std::ostream& out) { while(level) @@ -30,9 +32,10 @@ void cmXCodeObject::Indent(int level, std::ostream& out) } } +//---------------------------------------------------------------------------- void cmXCodeObject::Print(std::ostream& out) { - this->Indent(1, out); + cmXCodeObject::Indent(2, out); out << m_Id << " = {\n"; std::map<cmStdString, cmXCodeObject*>::iterator i; for(i = m_ObjectAttributes.begin(); i != m_ObjectAttributes.end(); ++i) @@ -40,58 +43,59 @@ void cmXCodeObject::Print(std::ostream& out) cmXCodeObject* object = i->second; if(object->m_Type == OBJECT_LIST) { - this->Indent(2, out); + cmXCodeObject::Indent(3, out); out << i->first << " = {\n"; for(unsigned int k = 0; k < i->second->m_List.size(); k++) { - this->Indent(3, out); + cmXCodeObject::Indent(4, out); out << i->second->m_List[k]->m_Id << ",\n"; } - this->Indent(2, out); + cmXCodeObject::Indent(3, out); out << "};\n"; } else if(object->m_Type == ATTRIBUTE_GROUP) { std::map<cmStdString, cmStdString>::iterator j; - this->Indent(2, out); + cmXCodeObject::Indent(3, out); out << i->first << " = {\n"; for(j = object->m_StringAttributes.begin(); j != object->m_StringAttributes.end(); ++j) { - this->Indent(3, out); + cmXCodeObject::Indent(4, out); out << j->first << " = " << j->second << ";\n"; } - this->Indent(2, out); - out << " }\n"; + cmXCodeObject::Indent(3, out); + out << "}\n"; } else if(object->m_Type == OBJECT_REF) { - this->Indent(2, out); + cmXCodeObject::Indent(3, out); out << i->first << " = " << object->m_Object->m_Id << ";\n"; } } - - this->Indent(2, out); - out << "isa = " << PBXTypeNames[m_IsA] << ";\n"; std::map<cmStdString, cmStdString>::iterator j; for(j = m_StringAttributes.begin(); j != m_StringAttributes.end(); ++j) { - this->Indent(2, out); + cmXCodeObject::Indent(3, out); out << j->first << " = " << j->second << ";\n"; } - this->Indent(1, out); + cmXCodeObject::Indent(2, out); out << "};\n"; } -void cmXCodeObject::PrintAll(std::ostream& out) -{ +//---------------------------------------------------------------------------- +void cmXCodeObject::PrintList(std::vector<cmXCodeObject*> const& objs, + std::ostream& out) +{ + cmXCodeObject::Indent(1, out); out << "objects = {\n"; - for(unsigned int i = 0; i < s_AllObjects.size(); ++i) + for(unsigned int i = 0; i < objs.size(); ++i) { - if(s_AllObjects[i]->m_Type == OBJECT) + if(objs[i]->m_Type == OBJECT) { - s_AllObjects[i]->Print(out); + objs[i]->Print(out); } } + cmXCodeObject::Indent(1, out); out << "};\n"; } diff --git a/Source/cmXCodeObject.h b/Source/cmXCodeObject.h index 0dc6790..819e3a5 100644 --- a/Source/cmXCodeObject.h +++ b/Source/cmXCodeObject.h @@ -1,3 +1,6 @@ +#ifndef cmXCodeObject_h +#define cmXCodeObject_h + #include "cmStandardIncludes.h" class cmXCodeObject @@ -31,13 +34,14 @@ public: { m_List.push_back(value); } - void Indent(int level, std::ostream& out); + static void Indent(int level, std::ostream& out); void Print(std::ostream& out); - static void PrintAll(std::ostream& out); + static void PrintList(std::vector<cmXCodeObject*> const&, std::ostream& out); const char* GetId() { return m_Id.c_str(); } +private: Type m_Type; cmStdString m_Id; PBXType m_IsA; @@ -45,5 +49,5 @@ public: std::vector<cmXCodeObject*> m_List; std::map<cmStdString, cmXCodeObject*> m_ObjectAttributes; std::map<cmStdString, cmStdString> m_StringAttributes; - static std::vector<cmXCodeObject*> s_AllObjects; }; +#endif |