|  | // Copyright 2016 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef TOOLS_GN_XCODE_OBJECT_H_ | 
|  | #define TOOLS_GN_XCODE_OBJECT_H_ | 
|  |  | 
|  | #include <iosfwd> | 
|  | #include <map> | 
|  | #include <memory> | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | #include "base/macros.h" | 
|  |  | 
|  | // Helper classes to generate Xcode project files. | 
|  | // | 
|  | // This code is based on gyp xcodeproj_file.py generator. It does not support | 
|  | // all features of Xcode project but instead just enough to implement a hybrid | 
|  | // mode where Xcode uses external scripts to perform the compilation steps. | 
|  | // | 
|  | // See | 
|  | // https://chromium.googlesource.com/external/gyp/+/master/pylib/gyp/xcodeproj_file.py | 
|  | // for more information on Xcode project file format. | 
|  |  | 
|  | enum class CompilerFlags { | 
|  | NONE, | 
|  | HELP, | 
|  | }; | 
|  |  | 
|  | // PBXObjectClass ------------------------------------------------------------- | 
|  |  | 
|  | enum PBXObjectClass { | 
|  | // Those values needs to stay sorted in alphabetic order. | 
|  | PBXAggregateTargetClass, | 
|  | PBXBuildFileClass, | 
|  | PBXContainerItemProxyClass, | 
|  | PBXFileReferenceClass, | 
|  | PBXFrameworksBuildPhaseClass, | 
|  | PBXGroupClass, | 
|  | PBXNativeTargetClass, | 
|  | PBXProjectClass, | 
|  | PBXShellScriptBuildPhaseClass, | 
|  | PBXSourcesBuildPhaseClass, | 
|  | PBXTargetDependencyClass, | 
|  | XCBuildConfigurationClass, | 
|  | XCConfigurationListClass, | 
|  | }; | 
|  |  | 
|  | const char* ToString(PBXObjectClass cls); | 
|  |  | 
|  | // Forward-declarations ------------------------------------------------------- | 
|  |  | 
|  | class PBXAggregateTarget; | 
|  | class PBXBuildFile; | 
|  | class PBXBuildPhase; | 
|  | class PBXContainerItemProxy; | 
|  | class PBXFileReference; | 
|  | class PBXFrameworksBuildPhase; | 
|  | class PBXGroup; | 
|  | class PBXNativeTarget; | 
|  | class PBXObject; | 
|  | class PBXProject; | 
|  | class PBXShellScriptBuildPhase; | 
|  | class PBXSourcesBuildPhase; | 
|  | class PBXTarget; | 
|  | class PBXTargetDependency; | 
|  | class XCBuildConfiguration; | 
|  | class XCConfigurationList; | 
|  |  | 
|  | using PBXAttributes = std::map<std::string, std::string>; | 
|  |  | 
|  | // PBXObjectVisitor ----------------------------------------------------------- | 
|  |  | 
|  | class PBXObjectVisitor { | 
|  | public: | 
|  | PBXObjectVisitor(); | 
|  | virtual ~PBXObjectVisitor(); | 
|  | virtual void Visit(PBXObject* object) = 0; | 
|  |  | 
|  | private: | 
|  | DISALLOW_COPY_AND_ASSIGN(PBXObjectVisitor); | 
|  | }; | 
|  |  | 
|  | // PBXObject ------------------------------------------------------------------ | 
|  |  | 
|  | class PBXObject { | 
|  | public: | 
|  | PBXObject(); | 
|  | virtual ~PBXObject(); | 
|  |  | 
|  | const std::string id() const { return id_; } | 
|  | void SetId(const std::string& id); | 
|  |  | 
|  | std::string Reference() const; | 
|  |  | 
|  | virtual PBXObjectClass Class() const = 0; | 
|  | virtual std::string Name() const = 0; | 
|  | virtual std::string Comment() const; | 
|  | virtual void Visit(PBXObjectVisitor& visitor); | 
|  | virtual void Print(std::ostream& out, unsigned indent) const = 0; | 
|  |  | 
|  | private: | 
|  | std::string id_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(PBXObject); | 
|  | }; | 
|  |  | 
|  | // PBXBuildPhase -------------------------------------------------------------- | 
|  |  | 
|  | class PBXBuildPhase : public PBXObject { | 
|  | public: | 
|  | PBXBuildPhase(); | 
|  | ~PBXBuildPhase() override; | 
|  |  | 
|  | private: | 
|  | DISALLOW_COPY_AND_ASSIGN(PBXBuildPhase); | 
|  | }; | 
|  |  | 
|  | // PBXTarget ------------------------------------------------------------------ | 
|  |  | 
|  | class PBXTarget : public PBXObject { | 
|  | public: | 
|  | PBXTarget(const std::string& name, | 
|  | const std::string& shell_script, | 
|  | const std::string& config_name, | 
|  | const PBXAttributes& attributes); | 
|  | ~PBXTarget() override; | 
|  |  | 
|  | void AddDependency(std::unique_ptr<PBXTargetDependency> dependency); | 
|  |  | 
|  | // PBXObject implementation. | 
|  | std::string Name() const override; | 
|  | void Visit(PBXObjectVisitor& visitor) override; | 
|  |  | 
|  | protected: | 
|  | std::unique_ptr<XCConfigurationList> configurations_; | 
|  | std::vector<std::unique_ptr<PBXBuildPhase>> build_phases_; | 
|  | std::vector<std::unique_ptr<PBXTargetDependency>> dependencies_; | 
|  | PBXSourcesBuildPhase* source_build_phase_; | 
|  | std::string name_; | 
|  |  | 
|  | private: | 
|  | DISALLOW_COPY_AND_ASSIGN(PBXTarget); | 
|  | }; | 
|  |  | 
|  | // PBXAggregateTarget --------------------------------------------------------- | 
|  |  | 
|  | class PBXAggregateTarget : public PBXTarget { | 
|  | public: | 
|  | PBXAggregateTarget(const std::string& name, | 
|  | const std::string& shell_script, | 
|  | const std::string& config_name, | 
|  | const PBXAttributes& attributes); | 
|  | ~PBXAggregateTarget() override; | 
|  |  | 
|  | // PBXObject implementation. | 
|  | PBXObjectClass Class() const override; | 
|  | void Print(std::ostream& out, unsigned indent) const override; | 
|  |  | 
|  | private: | 
|  | DISALLOW_COPY_AND_ASSIGN(PBXAggregateTarget); | 
|  | }; | 
|  |  | 
|  | // PBXBuildFile --------------------------------------------------------------- | 
|  |  | 
|  | class PBXBuildFile : public PBXObject { | 
|  | public: | 
|  | PBXBuildFile(const PBXFileReference* file_reference, | 
|  | const PBXSourcesBuildPhase* build_phase, | 
|  | const CompilerFlags compiler_flag); | 
|  | ~PBXBuildFile() override; | 
|  |  | 
|  | // PBXObject implementation. | 
|  | PBXObjectClass Class() const override; | 
|  | std::string Name() const override; | 
|  | void Print(std::ostream& out, unsigned indent) const override; | 
|  |  | 
|  | private: | 
|  | const PBXFileReference* file_reference_; | 
|  | const PBXSourcesBuildPhase* build_phase_; | 
|  | const CompilerFlags compiler_flag_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(PBXBuildFile); | 
|  | }; | 
|  |  | 
|  | // PBXContainerItemProxy ------------------------------------------------------ | 
|  | class PBXContainerItemProxy : public PBXObject { | 
|  | public: | 
|  | PBXContainerItemProxy(const PBXProject* project, const PBXTarget* target); | 
|  | ~PBXContainerItemProxy() override; | 
|  |  | 
|  | // PBXObject implementation. | 
|  | PBXObjectClass Class() const override; | 
|  | std::string Name() const override; | 
|  | void Visit(PBXObjectVisitor& visitor) override; | 
|  | void Print(std::ostream& out, unsigned indent) const override; | 
|  |  | 
|  | private: | 
|  | const PBXProject* project_; | 
|  | const PBXTarget* target_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(PBXContainerItemProxy); | 
|  | }; | 
|  |  | 
|  | // PBXFileReference ----------------------------------------------------------- | 
|  |  | 
|  | class PBXFileReference : public PBXObject { | 
|  | public: | 
|  | PBXFileReference(const std::string& name, | 
|  | const std::string& path, | 
|  | const std::string& type); | 
|  | ~PBXFileReference() override; | 
|  |  | 
|  | // PBXObject implementation. | 
|  | PBXObjectClass Class() const override; | 
|  | std::string Name() const override; | 
|  | void Print(std::ostream& out, unsigned indent) const override; | 
|  |  | 
|  | const std::string& path() const { return path_; } | 
|  |  | 
|  | private: | 
|  | std::string name_; | 
|  | std::string path_; | 
|  | std::string type_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(PBXFileReference); | 
|  | }; | 
|  |  | 
|  | // PBXFrameworksBuildPhase ---------------------------------------------------- | 
|  |  | 
|  | class PBXFrameworksBuildPhase : public PBXBuildPhase { | 
|  | public: | 
|  | PBXFrameworksBuildPhase(); | 
|  | ~PBXFrameworksBuildPhase() override; | 
|  |  | 
|  | // PBXObject implementation. | 
|  | PBXObjectClass Class() const override; | 
|  | std::string Name() const override; | 
|  | void Print(std::ostream& out, unsigned indent) const override; | 
|  |  | 
|  | private: | 
|  | DISALLOW_COPY_AND_ASSIGN(PBXFrameworksBuildPhase); | 
|  | }; | 
|  |  | 
|  | // PBXGroup ------------------------------------------------------------------- | 
|  |  | 
|  | class PBXGroup : public PBXObject { | 
|  | public: | 
|  | explicit PBXGroup(const std::string& path = std::string(), | 
|  | const std::string& name = std::string()); | 
|  | ~PBXGroup() override; | 
|  |  | 
|  | const std::string& path() const { return path_; } | 
|  |  | 
|  | PBXObject* AddChild(std::unique_ptr<PBXObject> child); | 
|  | PBXFileReference* AddSourceFile(const std::string& navigator_path, | 
|  | const std::string& source_path); | 
|  | bool is_source() { return is_source_; } | 
|  | void set_is_source(const bool is_source) { is_source_ = is_source; } | 
|  |  | 
|  | // PBXObject implementation. | 
|  | PBXObjectClass Class() const override; | 
|  | std::string Name() const override; | 
|  | void Visit(PBXObjectVisitor& visitor) override; | 
|  | void Print(std::ostream& out, unsigned indent) const override; | 
|  |  | 
|  | private: | 
|  | std::vector<std::unique_ptr<PBXObject>> children_; | 
|  | std::string name_; | 
|  | std::string path_; | 
|  | bool is_source_ = false; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(PBXGroup); | 
|  | }; | 
|  |  | 
|  | // PBXNativeTarget ------------------------------------------------------------ | 
|  |  | 
|  | class PBXNativeTarget : public PBXTarget { | 
|  | public: | 
|  | PBXNativeTarget(const std::string& name, | 
|  | const std::string& shell_script, | 
|  | const std::string& config_name, | 
|  | const PBXAttributes& attributes, | 
|  | const std::string& product_type, | 
|  | const std::string& product_name, | 
|  | const PBXFileReference* product_reference); | 
|  | ~PBXNativeTarget() override; | 
|  |  | 
|  | void AddFileForIndexing(const PBXFileReference* file_reference, | 
|  | const CompilerFlags compiler_flag); | 
|  |  | 
|  | // PBXObject implementation. | 
|  | PBXObjectClass Class() const override; | 
|  | void Print(std::ostream& out, unsigned indent) const override; | 
|  |  | 
|  | private: | 
|  | const PBXFileReference* product_reference_; | 
|  | std::string product_type_; | 
|  | std::string product_name_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(PBXNativeTarget); | 
|  | }; | 
|  |  | 
|  | // PBXProject ----------------------------------------------------------------- | 
|  |  | 
|  | class PBXProject : public PBXObject { | 
|  | public: | 
|  | PBXProject(const std::string& name, | 
|  | const std::string& config_name, | 
|  | const std::string& source_path, | 
|  | const PBXAttributes& attributes); | 
|  | ~PBXProject() override; | 
|  |  | 
|  | void AddSourceFileToIndexingTarget(const std::string& navigator_path, | 
|  | const std::string& source_path, | 
|  | const CompilerFlags compiler_flag); | 
|  | void AddSourceFile(const std::string& navigator_path, | 
|  | const std::string& source_path, | 
|  | const CompilerFlags compiler_flag, | 
|  | PBXNativeTarget* target); | 
|  | void AddAggregateTarget(const std::string& name, | 
|  | const std::string& shell_script); | 
|  | void AddIndexingTarget(); | 
|  | PBXNativeTarget* AddNativeTarget( | 
|  | const std::string& name, | 
|  | const std::string& type, | 
|  | const std::string& output_name, | 
|  | const std::string& output_type, | 
|  | const std::string& shell_script, | 
|  | const PBXAttributes& extra_attributes = PBXAttributes()); | 
|  |  | 
|  | void SetProjectDirPath(const std::string& project_dir_path); | 
|  | void SetProjectRoot(const std::string& project_root); | 
|  | void AddTarget(std::unique_ptr<PBXTarget> target); | 
|  |  | 
|  | // PBXObject implementation. | 
|  | PBXObjectClass Class() const override; | 
|  | std::string Name() const override; | 
|  | std::string Comment() const override; | 
|  | void Visit(PBXObjectVisitor& visitor) override; | 
|  | void Print(std::ostream& out, unsigned indent) const override; | 
|  |  | 
|  | private: | 
|  | PBXAttributes attributes_; | 
|  | std::unique_ptr<XCConfigurationList> configurations_; | 
|  | std::unique_ptr<PBXGroup> main_group_; | 
|  | std::string project_dir_path_; | 
|  | std::string project_root_; | 
|  | std::vector<std::unique_ptr<PBXTarget>> targets_; | 
|  | std::string name_; | 
|  | std::string config_name_; | 
|  |  | 
|  | PBXGroup* sources_; | 
|  | PBXGroup* products_; | 
|  | PBXNativeTarget* target_for_indexing_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(PBXProject); | 
|  | }; | 
|  |  | 
|  | // PBXShellScriptBuildPhase --------------------------------------------------- | 
|  |  | 
|  | class PBXShellScriptBuildPhase : public PBXBuildPhase { | 
|  | public: | 
|  | PBXShellScriptBuildPhase(const std::string& name, | 
|  | const std::string& shell_script); | 
|  | ~PBXShellScriptBuildPhase() override; | 
|  |  | 
|  | // PBXObject implementation. | 
|  | PBXObjectClass Class() const override; | 
|  | std::string Name() const override; | 
|  | void Print(std::ostream& out, unsigned indent) const override; | 
|  |  | 
|  | private: | 
|  | std::string name_; | 
|  | std::string shell_script_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(PBXShellScriptBuildPhase); | 
|  | }; | 
|  |  | 
|  | // PBXSourcesBuildPhase ------------------------------------------------------- | 
|  |  | 
|  | class PBXSourcesBuildPhase : public PBXBuildPhase { | 
|  | public: | 
|  | PBXSourcesBuildPhase(); | 
|  | ~PBXSourcesBuildPhase() override; | 
|  |  | 
|  | void AddBuildFile(std::unique_ptr<PBXBuildFile> build_file); | 
|  |  | 
|  | // PBXObject implementation. | 
|  | PBXObjectClass Class() const override; | 
|  | std::string Name() const override; | 
|  | void Visit(PBXObjectVisitor& visitor) override; | 
|  | void Print(std::ostream& out, unsigned indent) const override; | 
|  |  | 
|  | private: | 
|  | std::vector<std::unique_ptr<PBXBuildFile>> files_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(PBXSourcesBuildPhase); | 
|  | }; | 
|  |  | 
|  | // PBXTargetDependency ----------------------------------------------------- | 
|  | class PBXTargetDependency : public PBXObject { | 
|  | public: | 
|  | PBXTargetDependency( | 
|  | const PBXTarget* target, | 
|  | std::unique_ptr<PBXContainerItemProxy> container_item_proxy); | 
|  | ~PBXTargetDependency() override; | 
|  |  | 
|  | // PBXObject implementation. | 
|  | PBXObjectClass Class() const override; | 
|  | std::string Name() const override; | 
|  | void Visit(PBXObjectVisitor& visitor) override; | 
|  | void Print(std::ostream& out, unsigned indent) const override; | 
|  |  | 
|  | private: | 
|  | const PBXTarget* target_; | 
|  | std::unique_ptr<PBXContainerItemProxy> container_item_proxy_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(PBXTargetDependency); | 
|  | }; | 
|  |  | 
|  | // XCBuildConfiguration ------------------------------------------------------- | 
|  |  | 
|  | class XCBuildConfiguration : public PBXObject { | 
|  | public: | 
|  | XCBuildConfiguration(const std::string& name, | 
|  | const PBXAttributes& attributes); | 
|  | ~XCBuildConfiguration() override; | 
|  |  | 
|  | // PBXObject implementation. | 
|  | PBXObjectClass Class() const override; | 
|  | std::string Name() const override; | 
|  | void Print(std::ostream& out, unsigned indent) const override; | 
|  |  | 
|  | private: | 
|  | PBXAttributes attributes_; | 
|  | std::string name_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(XCBuildConfiguration); | 
|  | }; | 
|  |  | 
|  | // XCConfigurationList -------------------------------------------------------- | 
|  |  | 
|  | class XCConfigurationList : public PBXObject { | 
|  | public: | 
|  | XCConfigurationList(const std::string& name, | 
|  | const PBXAttributes& attributes, | 
|  | const PBXObject* owner_reference); | 
|  | ~XCConfigurationList() override; | 
|  |  | 
|  | // PBXObject implementation. | 
|  | PBXObjectClass Class() const override; | 
|  | std::string Name() const override; | 
|  | void Visit(PBXObjectVisitor& visitor) override; | 
|  | void Print(std::ostream& out, unsigned indent) const override; | 
|  |  | 
|  | private: | 
|  | std::vector<std::unique_ptr<XCBuildConfiguration>> configurations_; | 
|  | const PBXObject* owner_reference_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(XCConfigurationList); | 
|  | }; | 
|  |  | 
|  | #endif  // TOOLS_GN_XCODE_OBJECT_H_ |