1 /*============================================================================
2 CMake - Cross Platform Makefile Generator
3 Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
5 Distributed under the OSI-approved BSD License (the "License");
6 see accompanying file Copyright.txt for details.
8 This software is distributed WITHOUT ANY WARRANTY; without even the
9 implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10 See the License for more information.
11 ============================================================================*/
12 #include "cmXCodeObject.h"
13 #include "cmSystemTools.h"
15 #include <CoreFoundation/CoreFoundation.h> // CFUUIDCreate
17 //----------------------------------------------------------------------------
18 const char* cmXCodeObject::PBXTypeNames[] = {
19 "PBXGroup", "PBXBuildStyle", "PBXProject", "PBXHeadersBuildPhase",
20 "PBXSourcesBuildPhase", "PBXFrameworksBuildPhase", "PBXNativeTarget",
21 "PBXFileReference", "PBXBuildFile", "PBXContainerItemProxy",
22 "PBXTargetDependency", "PBXShellScriptBuildPhase",
23 "PBXResourcesBuildPhase", "PBXApplicationReference",
24 "PBXExecutableFileReference", "PBXLibraryReference", "PBXToolTarget",
25 "PBXLibraryTarget", "PBXAggregateTarget", "XCBuildConfiguration",
26 "XCConfigurationList",
27 "PBXCopyFilesBuildPhase",
31 //----------------------------------------------------------------------------
32 cmXCodeObject::~cmXCodeObject()
37 //----------------------------------------------------------------------------
38 cmXCodeObject::cmXCodeObject(PBXType ptype, Type type)
41 this->PBXTargetDependencyValue = 0;
49 // Set the Id of an Xcode object to a unique string for each instance.
50 // However the Xcode user file references certain Ids: for those cases,
51 // override the generated Id using SetId().
54 CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
55 CFStringRef s = CFUUIDCreateString(kCFAllocatorDefault, uuid);
56 CFStringGetCString(s, cUuid, sizeof(cUuid), kCFStringEncodingUTF8);
64 "Temporary cmake object, should not be referred to in Xcode file";
67 cmSystemTools::ReplaceString(this->Id, "-", "");
68 if(this->Id.size() > 24)
70 this->Id = this->Id.substr(0, 24);
73 this->TypeValue = type;
74 if(this->TypeValue == OBJECT)
76 this->AddAttribute("isa", 0);
80 //----------------------------------------------------------------------------
81 void cmXCodeObject::Indent(int level, std::ostream& out)
90 //----------------------------------------------------------------------------
91 void cmXCodeObject::Print(std::ostream& out)
93 std::string separator = "\n";
96 && (this->IsA == PBXFileReference || this->IsA == PBXBuildFile))
101 cmXCodeObject::Indent(2*indentFactor, out);
102 out << this->Id << " ";
103 if(!(this->IsA == PBXGroup && this->Comment.size() == 0))
105 this->PrintComment(out);
108 if(separator == "\n")
112 std::map<cmStdString, cmXCodeObject*>::iterator i;
113 cmXCodeObject::Indent(3*indentFactor, out);
114 out << "isa = " << PBXTypeNames[this->IsA] << ";" << separator;
115 for(i = this->ObjectAttributes.begin();
116 i != this->ObjectAttributes.end(); ++i)
118 cmXCodeObject* object = i->second;
119 if(i->first != "isa")
121 cmXCodeObject::Indent(3*indentFactor, out);
127 if(object->TypeValue == OBJECT_LIST)
129 out << i->first << " = (" << separator;
130 for(unsigned int k = 0; k < i->second->List.size(); k++)
132 cmXCodeObject::Indent(4*indentFactor, out);
133 out << i->second->List[k]->Id << " ";
134 i->second->List[k]->PrintComment(out);
135 out << "," << separator;
137 cmXCodeObject::Indent(3*indentFactor, out);
138 out << ");" << separator;
140 else if(object->TypeValue == ATTRIBUTE_GROUP)
142 std::map<cmStdString, cmXCodeObject*>::iterator j;
143 out << i->first << " = {" << separator;
144 for(j = object->ObjectAttributes.begin(); j !=
145 object->ObjectAttributes.end(); ++j)
147 cmXCodeObject::Indent(4 *indentFactor, out);
149 if(j->second->TypeValue == STRING)
151 cmXCodeObject::PrintString(out,j->first);
153 j->second->PrintString(out);
156 else if(j->second->TypeValue == OBJECT_LIST)
158 cmXCodeObject::PrintString(out,j->first);
160 for(unsigned int k = 0; k < j->second->List.size(); k++)
162 if(j->second->List[k]->TypeValue == STRING)
164 j->second->List[k]->PrintString(out);
169 out << "List_" << k << "_TypeValue_IS_NOT_STRING, ";
176 cmXCodeObject::PrintString(out,j->first);
177 out << " = error_unexpected_TypeValue_" <<
178 j->second->TypeValue << ";";
183 cmXCodeObject::Indent(3 *indentFactor, out);
184 out << "};" << separator;
186 else if(object->TypeValue == OBJECT_REF)
188 cmXCodeObject::PrintString(out,i->first);
189 out << " = " << object->Object->Id;
190 if(object->Object->HasComment() && i->first != "remoteGlobalIDString")
193 object->Object->PrintComment(out);
195 out << ";" << separator;
197 else if(object->TypeValue == STRING)
199 cmXCodeObject::PrintString(out,i->first);
201 object->PrintString(out);
202 out << ";" << separator;
206 out << "what is this?? " << i->first << "\n";
209 cmXCodeObject::Indent(2*indentFactor, out);
213 //----------------------------------------------------------------------------
214 void cmXCodeObject::PrintList(std::vector<cmXCodeObject*> const& objs,
217 cmXCodeObject::Indent(1, out);
218 out << "objects = {\n";
219 for(unsigned int i = 0; i < objs.size(); ++i)
221 if(objs[i]->TypeValue == OBJECT)
226 cmXCodeObject::Indent(1, out);
230 //----------------------------------------------------------------------------
231 void cmXCodeObject::CopyAttributes(cmXCodeObject* copy)
233 this->ObjectAttributes = copy->ObjectAttributes;
234 this->List = copy->List;
235 this->String = copy->String;
236 this->Object = copy->Object;
239 //----------------------------------------------------------------------------
240 void cmXCodeObject::PrintString(std::ostream& os,cmStdString String)
242 // The string needs to be quoted if it contains any characters
243 // considered special by the Xcode project file parser.
246 String.find_first_of(" <>.+-=@$[],") != String.npos);
247 const char* quote = needQuote? "\"" : "";
249 // Print the string, quoted and escaped as necessary.
251 for(std::string::const_iterator i = String.begin();
252 i != String.end(); ++i)
256 // Escape double-quotes.
264 void cmXCodeObject::PrintString(std::ostream& os) const
266 cmXCodeObject::PrintString(os,this->String);
269 //----------------------------------------------------------------------------
270 void cmXCodeObject::SetString(const char* s)