1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
|
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file LICENSE.rst or https://cmake.org/licensing for details. */
#pragma once
#include "cmConfigure.h" // IWYU pragma: keep
#include <algorithm>
#include <cstddef>
#include <iosfwd>
#include <map>
#include <string>
#include <utility>
#include <vector>
#include <cm/string_view>
#include <cmext/algorithm>
class cmGeneratorTarget;
class cmXCodeObject
{
public:
enum Type
{
OBJECT_LIST,
STRING,
ATTRIBUTE_GROUP,
OBJECT_REF,
OBJECT
};
enum PBXType
{
PBXGroup,
PBXBuildStyle,
PBXProject,
PBXHeadersBuildPhase,
PBXSourcesBuildPhase,
PBXFrameworksBuildPhase,
PBXNativeTarget,
PBXFileReference,
PBXBuildFile,
PBXContainerItemProxy,
PBXTargetDependency,
PBXShellScriptBuildPhase,
PBXResourcesBuildPhase,
PBXApplicationReference,
PBXExecutableFileReference,
PBXLibraryReference,
PBXToolTarget,
PBXLibraryTarget,
PBXAggregateTarget,
XCBuildConfiguration,
XCConfigurationList,
PBXCopyFilesBuildPhase,
None
};
class StringVec : public std::vector<std::string>
{
};
static char const* PBXTypeNames[];
virtual ~cmXCodeObject();
cmXCodeObject(PBXType ptype, Type type, std::string id);
Type GetType() const { return this->TypeValue; }
PBXType GetIsA() const { return this->IsA; }
bool IsEmpty() const;
void SetString(cm::string_view s);
std::string const& GetString() const { return this->String; }
void AddAttribute(std::string const& name, cmXCodeObject* value)
{
this->ObjectAttributes[name] = value;
}
void AddAttributeIfNotEmpty(std::string const& name, cmXCodeObject* value)
{
if (value && !value->IsEmpty()) {
AddAttribute(name, value);
}
}
void SetObject(cmXCodeObject* value) { this->Object = value; }
cmXCodeObject* GetObject() { return this->Object; }
void AddObject(cmXCodeObject* value) { this->List.push_back(value); }
size_t GetObjectCount() { return this->List.size(); }
void InsertObject(size_t position, cmXCodeObject* value)
{
if (position < GetObjectCount()) {
this->List.insert(this->List.begin() + position, value);
}
}
void PrependObject(cmXCodeObject* value)
{
this->List.insert(this->List.begin(), value);
}
bool HasObject(cmXCodeObject* o) const
{
return cm::contains(this->List, o);
}
void AddUniqueObject(cmXCodeObject* value)
{
if (!cm::contains(this->List, value)) {
this->List.push_back(value);
}
}
static void Indent(int level, std::ostream& out);
void Print(std::ostream& out);
void PrintAttribute(std::ostream& out, int level,
std::string const& separator, int factor,
std::string const& name, cmXCodeObject const* object,
cmXCodeObject const* parent);
virtual void PrintComment(std::ostream&) {}
static void PrintList(std::vector<cmXCodeObject*> const&, std::ostream& out);
std::string const& GetId() const { return this->Id; }
void SetId(std::string const& id) { this->Id = id; }
cmGeneratorTarget* GetTarget() const { return this->Target; }
void SetTarget(cmGeneratorTarget* t) { this->Target = t; }
std::string const& GetComment() const { return this->Comment; }
bool HasComment() const { return (!this->Comment.empty()); }
cmXCodeObject* GetAttribute(char const* name) const
{
auto const i = this->ObjectAttributes.find(name);
if (i != this->ObjectAttributes.end()) {
return i->second;
}
return nullptr;
}
// search the attribute list for an object of the specified type
cmXCodeObject* GetObject(cmXCodeObject::PBXType t) const
{
for (auto* o : this->List) {
if (o->IsA == t) {
return o;
}
}
return nullptr;
}
void CopyAttributes(cmXCodeObject*);
void AddDependLibrary(std::string const& configName, std::string const& l)
{
this->DependLibraries[configName].push_back(l);
}
std::map<std::string, StringVec> const& GetDependLibraries() const
{
return this->DependLibraries;
}
void AddDependTarget(std::string const& configName, std::string const& tName)
{
this->DependTargets[configName].push_back(tName);
}
std::map<std::string, StringVec> const& GetDependTargets() const
{
return this->DependTargets;
}
std::vector<cmXCodeObject*> const& GetObjectList() const
{
return this->List;
}
void SetComment(std::string const& c) { this->Comment = c; }
static void PrintString(std::ostream& os, std::string const& String);
protected:
void PrintString(std::ostream& os) const;
cmGeneratorTarget* Target;
Type TypeValue;
std::string Id;
PBXType IsA;
int Version;
std::string Comment;
std::string String;
cmXCodeObject* Object;
std::vector<cmXCodeObject*> List;
std::map<std::string, StringVec> DependLibraries;
std::map<std::string, StringVec> DependTargets;
std::map<std::string, cmXCodeObject*> ObjectAttributes;
};
|