diff options
author | Matthew Hoops | 2011-06-03 01:14:16 -0400 |
---|---|---|
committer | Matthew Hoops | 2011-06-03 01:14:16 -0400 |
commit | 224c71e483e09931ba386555ff3b436b9defe63d (patch) | |
tree | 8e6178331a7bbd3ee1be318d3fc7a7c7f478468f /devtools/create_project/xcode.h | |
parent | d4c92983920cfe3b25a22d91e12c750e591b917e (diff) | |
parent | 547fd1bdcabcba0e741eb31100ba99ff73399d24 (diff) | |
download | scummvm-rg350-224c71e483e09931ba386555ff3b436b9defe63d.tar.gz scummvm-rg350-224c71e483e09931ba386555ff3b436b9defe63d.tar.bz2 scummvm-rg350-224c71e483e09931ba386555ff3b436b9defe63d.zip |
Merge remote branch 'upstream/master' into pegasus
Diffstat (limited to 'devtools/create_project/xcode.h')
-rw-r--r-- | devtools/create_project/xcode.h | 307 |
1 files changed, 307 insertions, 0 deletions
diff --git a/devtools/create_project/xcode.h b/devtools/create_project/xcode.h new file mode 100644 index 0000000000..f86e7c555c --- /dev/null +++ b/devtools/create_project/xcode.h @@ -0,0 +1,307 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef TOOLS_CREATE_PROJECT_XCODE_H +#define TOOLS_CREATE_PROJECT_XCODE_H + +#include "create_project.h" + +#include <algorithm> +#include <vector> + +namespace CreateProjectTool { + +class XCodeProvider : public ProjectProvider { +public: + XCodeProvider(StringList &global_warnings, std::map<std::string, StringList> &project_warnings, const int version = 0); + +protected: + + void createWorkspace(const BuildSetup &setup); + + void createOtherBuildFiles(const BuildSetup &setup); + + void createProjectFile(const std::string &name, const std::string &uuid, const BuildSetup &setup, const std::string &moduleDir, + const StringList &includeList, const StringList &excludeList); + + void writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int indentation, + const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix); + +private: + enum { + SettingsAsList = 0x01, + SettingsSingleItem = 0x02, + SettingsNoQuote = 0x04, + SettingsQuoteVariable = 0x08, + SettingsNoValue = 0x10 + }; + + // File properties + struct FileProperty { + std::string fileEncoding; + std::string lastKnownFileType; + std::string fileName; + std::string filePath; + std::string sourceTree; + + FileProperty(std::string fileType = "", std::string name = "", std::string path = "", std::string source = "") : + fileEncoding(""), lastKnownFileType(fileType), fileName(name), filePath(path), sourceTree(source) + { + } + }; + + ////////////////////////////////////////////////////////////////////////// + // XCObject and children + typedef std::vector<std::string> ValueList; + + struct Entry { + std::string value; + std::string comment; + + Entry(std::string val, std::string cmt) : value(val), comment(cmt) {} + }; + + typedef std::vector<Entry> EntryList; + + struct Setting { + EntryList entries; + int flags; + int indent; + int order; + + explicit Setting(std::string value = "", std::string comment = "", int flgs = 0, int idt = 0, int ord = -1) : flags(flgs), indent(idt), order(ord) { + entries.push_back(Entry(value, comment)); + } + + explicit Setting(ValueList values, int flgs = 0, int idt = 0, int ord = -1) : flags(flgs), indent(idt), order(ord) { + for (unsigned int i = 0; i < values.size(); i++) + entries.push_back(Entry(values[i], "")); + } + + explicit Setting(EntryList ents, int flgs = 0, int idt = 0, int ord = -1) : entries(ents), flags(flgs), indent(idt), order(ord) {} + + void addEntry(std::string value, std::string comment = "") { + entries.push_back(Entry(value, comment)); + } + }; + + typedef std::map<std::string, Setting> SettingList; + typedef std::pair<std::string, Setting> SettingPair; + typedef std::vector<SettingPair> OrderedSettingList; + + static bool OrderSortPredicate(const SettingPair& s1, const SettingPair& s2) { + return s1.second.order < s2.second.order; + } + + struct Property { + public: + SettingList settings; + int flags; + bool hasOrder; + + Property() : flags(0), hasOrder(false) {} + + // Constructs a simple Property + explicit Property(std::string name, std::string value = "", std::string comment = "", int flgs = 0, int indent = 0, bool order = false) : flags(flgs), hasOrder(order) { + Setting setting(value, comment, flags, indent); + + settings[name] = setting; + } + + Property(std::string name, ValueList values, int flgs = 0, int indent = 0, bool order = false) : flags(flgs), hasOrder(order) { + Setting setting(values, flags, indent); + + settings[name] = setting; + } + + // Copy constructor + Property(const Property &rhs) { + settings = rhs.settings; + flags = rhs.flags; + } + + OrderedSettingList getOrderedSettingList() { + OrderedSettingList list; + + // Prepare vector to sort + for (SettingList::const_iterator setting = settings.begin(); setting != settings.end(); ++setting) + list.push_back(SettingPair(setting->first, setting->second)); + + // Sort vector using setting order + if (hasOrder) + std::sort(list.begin(), list.end(), OrderSortPredicate); + + return list; + } + }; + + typedef std::map<std::string, Property> PropertyList; + + // Main object struct + // This is all a big hack unfortunately, but making everything all properly abstracted would + // be overkill since we only have to generate a single project + struct Object { + public: + std::string id; // Unique identifier for this object + std::string name; // Name (may not be unique - for ex. configuration entries) + std::string refType; // Type of object this references (if any) + std::string comment; // Main comment (empty for no comment) + + PropertyList properties; // List of object properties, including output configuration + + // Constructs an object and add a default type property + Object(XCodeProvider *objectParent, std::string objectId, std::string objectName, std::string objectType, std::string objectRefType = "", std::string objectComment = "") + : id(objectId), name(objectName), refType(objectRefType), comment(objectComment), parent(objectParent) { + assert(objectParent); + assert(!objectId.empty()); + assert(!objectName.empty()); + assert(!objectType.empty()); + + addProperty("isa", objectType, "", SettingsNoQuote|SettingsNoValue); + } + + // Add a simple Property with just a name and a value + void addProperty(std::string propName, std::string propValue, std::string propComment = "", int propFlags = 0, int propIndent = 0) { + properties[propName] = Property(propValue, "", propComment, propFlags, propIndent); + } + + std::string toString(int flags = 0) { + std::string output; + output = "\t\t" + parent->getHash(id) + (comment.empty() ? "" : " /* " + comment + " */") + " = {"; + + if (flags & SettingsAsList) + output += "\n"; + + // Special case: always output the isa property first + output += parent->writeProperty("isa", properties["isa"], flags); + + // Write each property + for (PropertyList::iterator property = properties.begin(); property != properties.end(); ++property) { + if ((*property).first == "isa") + continue; + + output += parent->writeProperty((*property).first, (*property).second, flags); + } + + if (flags & SettingsAsList) + output += "\t\t"; + + output += "};\n"; + + return output; + } + + private: + XCodeProvider *parent; + + // Returns the type property (should always be the first in the properties map) + std::string getType() { + assert(!properties.empty()); + assert(!properties["isa"].settings.empty()); + + SettingList::iterator it = properties["isa"].settings.begin(); + + return (*it).first; + } + }; + + struct ObjectList { + private: + std::map<std::string, bool> objectMap; + + public: + std::vector<Object *> objects; + std::string comment; + int flags; + + void add(Object *obj) { + std::map<std::string, bool>::iterator it = objectMap.find(obj->id); + if (it != objectMap.end() && it->second == true) + return; + + objects.push_back(obj); + objectMap[obj->id] = true; + } + + std::string toString() { + std::string output; + + if (!comment.empty()) + output = "\n/* Begin " + comment + " section */\n"; + + for (std::vector<Object *>::iterator object = objects.begin(); object != objects.end(); ++object) + output += (*object)->toString(flags); + + if (!comment.empty()) + output += "/* End " + comment + " section */\n"; + + return output; + } + }; + + // All objects + std::map<std::string, std::string> _hashDictionnary; + ValueList _defines; + + // Targets + ValueList _targets; + + // Lists of objects + ObjectList _buildFile; + ObjectList _copyFilesBuildPhase; + ObjectList _fileReference; + ObjectList _frameworksBuildPhase; + ObjectList _groups; + ObjectList _nativeTarget; + ObjectList _project; + ObjectList _resourcesBuildPhase; + ObjectList _sourcesBuildPhase; + ObjectList _buildConfiguration; + ObjectList _configurationList; + + void ouputMainProjectFile(const BuildSetup &setup); + + // Setup objects + void setupCopyFilesBuildPhase(); + void setupFrameworksBuildPhase(); + void setupNativeTarget(); + void setupProject(); + void setupResourcesBuildPhase(); + void setupSourcesBuildPhase(); + void setupBuildConfiguration(); + + // Misc + void setupDefines(const BuildSetup &setup); // Setup the list of defines to be used on build configurations + + // Hash generation + std::string getHash(std::string key); + std::string newHash() const; + + // Output + std::string writeProperty(const std::string &variable, Property &property, int flags = 0) const; + std::string writeSetting(const std::string &variable, std::string name, std::string comment = "", int flags = 0, int indent = 0) const; + std::string writeSetting(const std::string &variable, const Setting &setting) const; +}; + +} // End of CreateProjectTool namespace + +#endif // TOOLS_CREATE_PROJECT_XCODE_H |