From 8b7091a0a6a056278f17a57b96c4694b43dc7bbb Mon Sep 17 00:00:00 2001 From: Bill Hoffman Date: Wed, 16 Nov 2005 13:13:39 -0500 Subject: ENH: fixes for xcode21 and build styles and comments in the generated project --- Source/cmGlobalXCodeGenerator.cxx | 84 +++++++++++++++++++++++++++------- Source/cmXCode21Object.cxx | 19 ++++++-- Source/cmXCodeObject.cxx | 94 ++++++++++++++++++++++++++++++--------- Source/cmXCodeObject.h | 12 ++--- 4 files changed, 163 insertions(+), 46 deletions(-) (limited to 'Source') diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index 51d396aca8..42bb337e76 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -462,11 +462,20 @@ cmGlobalXCodeGenerator::CreateXCodeSourceFile(cmLocalGenerator* lg, lg->AppendFlags(flags, sf->GetProperty("COMPILE_FLAGS")); cmXCodeObject* fileRef = this->CreateObject(cmXCodeObject::PBXFileReference); + cmXCodeObject* group = m_GroupMap[sf]; cmXCodeObject* children = group->GetObject("children"); children->AddObject(fileRef); -// m_SourcesGroupChildren->AddObject(fileRef); cmXCodeObject* buildFile = this->CreateObject(cmXCodeObject::PBXBuildFile); + std::string fname = sf->GetSourceName(); + fname += "."; + fname += sf->GetSourceExtension(); + std::string comment = fname; + comment += " in "; + std::string gname = group->GetObject("name")->GetString(); + comment += gname.substr(1, gname.size()-2); + buildFile->SetComment(comment.c_str()); + fileRef->SetComment(fname.c_str()); buildFile->AddAttribute("fileRef", this->CreateObjectReference(fileRef)); cmXCodeObject* settings = this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP); settings->AddAttribute("COMPILER_FLAGS", this->CreateString(flags.c_str())); @@ -518,7 +527,10 @@ cmGlobalXCodeGenerator::CreateXCodeSourceFile(cmLocalGenerator* lg, fileRef->AddAttribute("name", this->CreateString(file.c_str())); fileRef->AddAttribute("path", this->CreateString(path.c_str())); - fileRef->AddAttribute("refType", this->CreateString("4")); + if(m_XcodeVersion == 15) + { + fileRef->AddAttribute("refType", this->CreateString("4")); + } if(path.size() > 1 && path[0] == '.' && path[1] == '.') { fileRef->AddAttribute("sourceTree", this->CreateString("")); @@ -590,6 +602,7 @@ cmGlobalXCodeGenerator::CreateXCodeTargets(cmLocalGenerator* gen, this->CreateObject(cmXCodeObject::PBXSourcesBuildPhase); sourceBuildPhase->AddAttribute("buildActionMask", this->CreateString("2147483647")); + sourceBuildPhase->SetComment("Sources"); cmXCodeObject* buildFiles = this->CreateObject(cmXCodeObject::OBJECT_LIST); sourceBuildPhase->AddAttribute("files", buildFiles); sourceBuildPhase->AddAttribute("runOnlyForDeploymentPostprocessing", @@ -621,6 +634,7 @@ cmGlobalXCodeGenerator::CreateXCodeTargets(cmLocalGenerator* gen, // create header build phase cmXCodeObject* headerBuildPhase = this->CreateObject(cmXCodeObject::PBXHeadersBuildPhase); + headerBuildPhase->SetComment("Headers"); headerBuildPhase->AddAttribute("buildActionMask", this->CreateString("2147483647")); buildFiles = this->CreateObject(cmXCodeObject::OBJECT_LIST); @@ -636,6 +650,7 @@ cmGlobalXCodeGenerator::CreateXCodeTargets(cmLocalGenerator* gen, // create framework build phase cmXCodeObject* frameworkBuildPhase = this->CreateObject(cmXCodeObject::PBXFrameworksBuildPhase); + frameworkBuildPhase->SetComment("Frameworks"); frameworkBuildPhase->AddAttribute("buildActionMask", this->CreateString("2147483647")); buildFiles = this->CreateObject(cmXCodeObject::OBJECT_LIST); @@ -1235,6 +1250,7 @@ cmGlobalXCodeGenerator::CreateUtilityTarget(cmTarget& cmtarget) "# shell script goes here\nexit 0")); cmXCodeObject* target = this->CreateObject(cmXCodeObject::PBXAggregateTarget); + target->SetComment(cmtarget.GetName()); cmXCodeObject* buildPhases = this->CreateObject(cmXCodeObject::OBJECT_LIST); this->CreateCustomCommands(buildPhases, 0, 0, 0, cmtarget); @@ -1269,11 +1285,16 @@ void cmGlobalXCodeGenerator::AddConfigurations(cmXCodeObject* target, std::vector configVector; configVectorIn.push_back(configTypes); cmSystemTools::ExpandList(configVectorIn, configVector); - configVector.push_back("Default"); cmXCodeObject* configlist = this->CreateObject(cmXCodeObject::XCConfigurationList); cmXCodeObject* buildConfigurations = this->CreateObject(cmXCodeObject::OBJECT_LIST); configlist->AddAttribute("buildConfigurations", buildConfigurations); + std::string comment = "Build configuration list for "; + comment += cmXCodeObject::PBXTypeNames[target->GetIsA()]; + comment += " \""; + comment += cmtarget.GetName(); + comment += "\""; + configlist->SetComment(comment.c_str()); target->AddAttribute("buildConfigurationList", this->CreateObjectReference(configlist)); for(unsigned int i = 0; i < configVector.size(); ++i) @@ -1290,8 +1311,15 @@ void cmGlobalXCodeGenerator::AddConfigurations(cmXCodeObject* target, buildSettings, fileTypeString, productTypeString, productName, buildtype.c_str()); config->AddAttribute("name", this->CreateString(configVector[i].c_str())); + config->SetComment(configVector[i].c_str()); config->AddAttribute("buildSettings", buildSettings); } + if(configVector.size()) + { + configlist->AddAttribute("defaultConfigurationName", + this->CreateString(configVector[0].c_str())); + configlist->AddAttribute("defaultConfigurationIsVisible", this->CreateString("0")); + } } //---------------------------------------------------------------------------- @@ -1329,7 +1357,7 @@ cmGlobalXCodeGenerator::CreateXCodeTarget(cmTarget& cmtarget, fileRef->AddAttribute("refType", this->CreateString("0")); fileRef->AddAttribute("sourceTree", this->CreateString("BUILT_PRODUCTS_DIR")); - + fileRef->SetComment(cmtarget.GetName()); target->AddAttribute("productReference", this->CreateObjectReference(fileRef)); target->AddAttribute("productType", @@ -1383,6 +1411,7 @@ void cmGlobalXCodeGenerator::AddDependTarget(cmXCodeObject* target, { cmXCodeObject* container = this->CreateObject(cmXCodeObject::PBXContainerItemProxy); + container->SetComment("PBXContainerItemProxy"); container->AddAttribute("containerPortal", this->CreateObjectReference(m_RootObject)); container->AddAttribute("proxyType", this->CreateString("1")); @@ -1393,6 +1422,7 @@ void cmGlobalXCodeGenerator::AddDependTarget(cmXCodeObject* target, dependTarget->GetcmTarget()->GetName())); targetdep = this->CreateObject(cmXCodeObject::PBXTargetDependency); + targetdep->SetComment("PBXTargetDependency"); targetdep->AddAttribute("target", this->CreateObjectReference(dependTarget)); targetdep->AddAttribute("targetProxy", @@ -1713,7 +1743,10 @@ cmXCodeObject* cmGlobalXCodeGenerator::CreateOrGetPBXGroup(cmTarget& cmtarget, this->CreateObject(cmXCodeObject::OBJECT_LIST); tgroup->AddAttribute("name", this->CreateString(cmtarget.GetName())); tgroup->AddAttribute("children", tgroupChildren); - tgroup->AddAttribute("refType", this->CreateString("4")); + if(m_XcodeVersion == 15) + { + tgroup->AddAttribute("refType", this->CreateString("4")); + } tgroup->AddAttribute("sourceTree", this->CreateString("")); m_SourcesGroupChildren->AddObject(tgroup); } @@ -1724,7 +1757,10 @@ cmXCodeObject* cmGlobalXCodeGenerator::CreateOrGetPBXGroup(cmTarget& cmtarget, this->CreateObject(cmXCodeObject::OBJECT_LIST); group->AddAttribute("name", this->CreateString(sg->GetName())); group->AddAttribute("children", groupChildren); - group->AddAttribute("refType", this->CreateString("4")); + if(m_XcodeVersion == 15) + { + group->AddAttribute("refType", this->CreateString("4")); + } group->AddAttribute("sourceTree", this->CreateString("")); tgroupChildren->AddObject(group); m_GroupNameMap[s] = group; @@ -1752,6 +1788,7 @@ void cmGlobalXCodeGenerator::CreateXCodeObjects(cmLocalGenerator* root, else { developBuildStyle->AddAttribute("name", this->CreateString("Debug")); + developBuildStyle->SetComment("Debug"); } developBuildStyle->AddAttribute("buildSettings", group); @@ -1766,6 +1803,7 @@ void cmGlobalXCodeGenerator::CreateXCodeObjects(cmLocalGenerator* root, else { deployBuildStyle->AddAttribute("name", this->CreateString("Release")); + deployBuildStyle->SetComment("Release"); } deployBuildStyle->AddAttribute("buildSettings", group); @@ -1773,12 +1811,14 @@ void cmGlobalXCodeGenerator::CreateXCodeObjects(cmLocalGenerator* root, cmXCodeObject* listObjs = this->CreateObject(cmXCodeObject::OBJECT_LIST); listObjs->AddObject(developBuildStyle); listObjs->AddObject(deployBuildStyle); - cmXCodeObject* mainGroup = this->CreateObject(cmXCodeObject::PBXGroup); m_MainGroupChildren = this->CreateObject(cmXCodeObject::OBJECT_LIST); mainGroup->AddAttribute("children", m_MainGroupChildren); - mainGroup->AddAttribute("refType", this->CreateString("4")); + if(m_XcodeVersion == 15) + { + mainGroup->AddAttribute("refType", this->CreateString("4")); + } mainGroup->AddAttribute("sourceTree", this->CreateString("")); cmXCodeObject* sourcesGroup = this->CreateObject(cmXCodeObject::PBXGroup); @@ -1786,7 +1826,10 @@ void cmGlobalXCodeGenerator::CreateXCodeObjects(cmLocalGenerator* root, this->CreateObject(cmXCodeObject::OBJECT_LIST); sourcesGroup->AddAttribute("name", this->CreateString("Sources")); sourcesGroup->AddAttribute("children", m_SourcesGroupChildren); - sourcesGroup->AddAttribute("refType", this->CreateString("4")); + if(m_XcodeVersion == 15) + { + sourcesGroup->AddAttribute("refType", this->CreateString("4")); + } sourcesGroup->AddAttribute("sourceTree", this->CreateString("")); m_MainGroupChildren->AddObject(sourcesGroup); // now create the cmake groups @@ -1794,7 +1837,10 @@ void cmGlobalXCodeGenerator::CreateXCodeObjects(cmLocalGenerator* root, cmXCodeObject* productGroup = this->CreateObject(cmXCodeObject::PBXGroup); productGroup->AddAttribute("name", this->CreateString("Products")); - productGroup->AddAttribute("refType", this->CreateString("4")); + if(m_XcodeVersion == 15) + { + productGroup->AddAttribute("refType", this->CreateString("4")); + } productGroup->AddAttribute("sourceTree", this->CreateString("")); cmXCodeObject* productGroupChildren = this->CreateObject(cmXCodeObject::OBJECT_LIST); @@ -1803,31 +1849,35 @@ void cmGlobalXCodeGenerator::CreateXCodeObjects(cmLocalGenerator* root, m_RootObject = this->CreateObject(cmXCodeObject::PBXProject); + m_RootObject->SetComment("Project object"); group = this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP); m_RootObject->AddAttribute("mainGroup", this->CreateObjectReference(mainGroup)); m_RootObject->AddAttribute("buildSettings", group); - m_RootObject->AddAttribute("buildSyles", listObjs); + m_RootObject->AddAttribute("buildStyles", listObjs); m_RootObject->AddAttribute("hasScannedForEncodings", this->CreateString("0")); cmXCodeObject* configlist = this->CreateObject(cmXCodeObject::XCConfigurationList); cmXCodeObject* configDebug = this->CreateObject(cmXCodeObject::XCBuildConfiguration); cmXCodeObject* configRelease = this->CreateObject(cmXCodeObject::XCBuildConfiguration); - cmXCodeObject* configDefault = this->CreateObject(cmXCodeObject::XCBuildConfiguration); cmXCodeObject* buildConfigurations = this->CreateObject(cmXCodeObject::OBJECT_LIST); buildConfigurations->AddObject(configDebug); buildConfigurations->AddObject(configRelease); - buildConfigurations->AddObject(configDefault); configlist->AddAttribute("buildConfigurations", buildConfigurations); + std::string comment = "Build configuration list for PBXProject "; + comment += " \""; + comment += m_CurrentProject; + comment += "\""; + configlist->SetComment(comment.c_str()); + configlist->AddAttribute("defaultConfigurationIsVisible", this->CreateString("0")); + configlist->AddAttribute("defaultConfigurationName", this->CreateString("Debug")); cmXCodeObject* buildSettings = this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP); configDebug->AddAttribute("name", this->CreateString("Debug")); configDebug->AddAttribute("buildSettings", buildSettings); configRelease->AddAttribute("name", this->CreateString("Release")); configRelease->AddAttribute("buildSettings", buildSettings); - configDefault->AddAttribute("name", this->CreateString("Default")); - configDefault->AddAttribute("buildSettings", buildSettings); m_RootObject->AddAttribute("buildConfigurationList", this->CreateObjectReference(configlist)); @@ -1972,8 +2022,8 @@ cmGlobalXCodeGenerator::OutputXCodeProject(cmLocalGenerator* root, xcodeDir += "proj"; } cmSystemTools::MakeDirectory(xcodeDir.c_str()); - xcodeDir += "/project.pbxproj"; - cmGeneratedFileStream fout(xcodeDir.c_str()); + std::string xcodeProjFile = xcodeDir + "/project.pbxproj"; + cmGeneratedFileStream fout(xcodeProjFile.c_str()); fout.SetCopyIfDifferent(true); if(!fout) { diff --git a/Source/cmXCode21Object.cxx b/Source/cmXCode21Object.cxx index 84a2bd0e0d..43db6d1616 100644 --- a/Source/cmXCode21Object.cxx +++ b/Source/cmXCode21Object.cxx @@ -1,14 +1,27 @@ #include "cmXCode21Object.h" +#include "cmSystemTools.h" cmXCode21Object::cmXCode21Object(PBXType ptype, Type type) :cmXCodeObject(ptype, type) { + m_Version = 21; } //---------------------------------------------------------------------------- void cmXCode21Object::PrintComment(std::ostream& out) { - out << "/* */"; + if(m_Comment.size() == 0) + { + cmXCodeObject* n = this->GetObject("name"); + if(n) + { + m_Comment = n->GetString(); + cmSystemTools::ReplaceString(m_Comment, "\"", ""); + } + } + out << "/* "; + out << m_Comment; + out << " */"; } @@ -29,7 +42,7 @@ void cmXCode21Object::PrintList(std::vector const& v, std::ostre { return; } - out << "/* Begin " << PBXTypeNames[t] << " section */\n"; + out << "\n/* Begin " << PBXTypeNames[t] << " section */\n"; for(std::vector::const_iterator i = v.begin(); i != v.end(); ++i) { @@ -56,9 +69,9 @@ void cmXCode21Object::PrintList(std::vector const& v, std::ostre cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXHeadersBuildPhase); cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXNativeTarget); cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXProject); - cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXSourcesBuildPhase); cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXShellScriptBuildPhase); cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXResourcesBuildPhase); + cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXSourcesBuildPhase); cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXApplicationReference); cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXExecutableFileReference); cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXLibraryReference); diff --git a/Source/cmXCodeObject.cxx b/Source/cmXCodeObject.cxx index 02cf977549..2fddf66b91 100644 --- a/Source/cmXCodeObject.cxx +++ b/Source/cmXCodeObject.cxx @@ -14,12 +14,14 @@ const char* cmXCodeObject::PBXTypeNames[] = { cmXCodeObject::~cmXCodeObject() { + m_Version = 15; } //---------------------------------------------------------------------------- cmXCodeObject::cmXCodeObject(PBXType ptype, Type type) { + m_Version = 15; m_PBXTargetDependency = 0; m_cmTarget = 0; m_Object =0; @@ -67,56 +69,84 @@ void cmXCodeObject::Indent(int level, std::ostream& out) //---------------------------------------------------------------------------- void cmXCodeObject::Print(std::ostream& out) { - cmXCodeObject::Indent(2, out); + std::string separator = "\n"; + int indentFactor = 1; + if(m_Version > 15 && (m_IsA == PBXFileReference || m_IsA == PBXBuildFile)) + { + separator = " "; + indentFactor = 0; + } + cmXCodeObject::Indent(2*indentFactor, out); out << m_Id << " "; - this->PrintComment(out); - out << " = {\n"; + if(!(this->m_IsA == PBXGroup && this->m_Comment.size() == 0)) + { + this->PrintComment(out); + } + out << " = {"; + if(separator == "\n") + { + out << separator; + } std::map::iterator i; + cmXCodeObject::Indent(3*indentFactor, out); + out << "isa = " << PBXTypeNames[m_IsA] << ";" << separator; for(i = m_ObjectAttributes.begin(); i != m_ObjectAttributes.end(); ++i) { cmXCodeObject* object = i->second; - cmXCodeObject::Indent(3, out); - if(i->first == "isa") + if(i->first != "isa") { - out << i->first << " = " << PBXTypeNames[m_IsA] << ";\n"; + cmXCodeObject::Indent(3*indentFactor, out); } - else if(object->m_Type == OBJECT_LIST) + else + { + continue; + } + if(object->m_Type == OBJECT_LIST) { - out << i->first << " = (\n"; + out << i->first << " = (" << separator; for(unsigned int k = 0; k < i->second->m_List.size(); k++) { - cmXCodeObject::Indent(4, out); - out << i->second->m_List[k]->m_Id << ",\n"; + cmXCodeObject::Indent(4*indentFactor, out); + out << i->second->m_List[k]->m_Id << " "; + i->second->m_List[k]->PrintComment(out); + out << "," << separator; } - cmXCodeObject::Indent(3, out); - out << ");\n"; + cmXCodeObject::Indent(3*indentFactor, out); + out << ");" << separator; } else if(object->m_Type == ATTRIBUTE_GROUP) { std::map::iterator j; - out << i->first << " = {\n"; + out << i->first << " = {" << separator; for(j = object->m_ObjectAttributes.begin(); j != object->m_ObjectAttributes.end(); ++j) { - cmXCodeObject::Indent(4, out); - out << j->first << " = " << j->second->m_String << ";\n"; + cmXCodeObject::Indent(4 *indentFactor, out); + out << j->first << " = " << j->second->m_String << ";"; + out << separator; } - cmXCodeObject::Indent(3, out); - out << "};\n"; + cmXCodeObject::Indent(3 *indentFactor, out); + out << "};" << separator; } else if(object->m_Type == OBJECT_REF) { - out << i->first << " = " << object->m_Object->m_Id << ";\n"; + out << i->first << " = " << object->m_Object->m_Id; + if(object->m_Object->HasComment() && i->first != "remoteGlobalIDString") + { + out << " "; + object->m_Object->PrintComment(out); + } + out << ";" << separator; } else if(object->m_Type == STRING) { - out << i->first << " = " << object->m_String << ";\n"; + out << i->first << " = " << object->m_String << ";" << separator; } else { out << "what is this?? " << i->first << "\n"; } } - cmXCodeObject::Indent(2, out); + cmXCodeObject::Indent(2*indentFactor, out); out << "};\n"; } @@ -146,3 +176,27 @@ void cmXCodeObject::CopyAttributes(cmXCodeObject* copy) this->m_Object = copy->m_Object; } +void cmXCodeObject::SetString(const char* s) +{ + std::string ss = s; + if(ss.size() == 0) + { + m_String = "\"\""; + return; + } + bool needQuote = false; + m_String = ""; + if(ss.find_first_of(" <>.+") != ss.npos) + { + needQuote = true; + } + if(needQuote) + { + m_String = "\""; + } + m_String += s; + if(needQuote) + { + m_String += "\""; + } +} diff --git a/Source/cmXCodeObject.h b/Source/cmXCodeObject.h index 4bee8992d6..5e6a9e1926 100644 --- a/Source/cmXCodeObject.h +++ b/Source/cmXCodeObject.h @@ -24,12 +24,7 @@ public: Type GetType() { return m_Type;} PBXType GetIsA() { return m_IsA;} - void SetString(const char* s) - { - m_String = "\""; - m_String += s; - m_String += "\""; - } + void SetString(const char* s); const char* GetString() { return m_String.c_str(); @@ -80,6 +75,8 @@ public: { m_cmTarget = t; } + const char* GetComment() {return m_Comment.c_str();} + bool HasComment() { return (m_Comment.size() != 0);} cmXCodeObject* GetObject(const char* name) { if(m_ObjectAttributes.count(name)) @@ -122,11 +119,14 @@ public: return m_DependLibraries; } std::vector const& GetObjectList() { return m_List;} + void SetComment(const char* c) { m_Comment = c;} protected: cmTarget* m_cmTarget; Type m_Type; cmStdString m_Id; PBXType m_IsA; + int m_Version; + cmStdString m_Comment; cmStdString m_String; cmXCodeObject* m_Object; cmXCodeObject* m_PBXTargetDependency; -- cgit v1.2.1