Index: tools/gn/xcode_object.h |
diff --git a/tools/gn/xcode_object.h b/tools/gn/xcode_object.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..25f2415f516887e8279d9f01a842b75c1f2e6723 |
--- /dev/null |
+++ b/tools/gn/xcode_object.h |
@@ -0,0 +1,392 @@ |
+// 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. |
+ |
+// PBXObjectClass ------------------------------------------------------------- |
+ |
+enum PBXObjectClass { |
+ // Those values needs to stay sorted in alphabetic order. |
+ PBXAggregateTargetClass, |
+ PBXBuildFileClass, |
+ PBXFileReferenceClass, |
+ PBXFrameworksBuildPhaseClass, |
+ PBXGroupClass, |
+ PBXNativeTargetClass, |
+ PBXProjectClass, |
+ PBXShellScriptBuildPhaseClass, |
+ PBXSourcesBuildPhaseClass, |
+ XCBuildConfigurationClass, |
+ XCConfigurationListClass, |
+}; |
+ |
+const char* ToString(PBXObjectClass cls); |
+ |
+// Forward-declarations ------------------------------------------------------- |
+ |
+class PBXAggregateTarget; |
+class PBXBuildFile; |
+class PBXFileReference; |
+class PBXBuildPhase; |
+class PBXFrameworksBuildPhase; |
+class PBXGroup; |
+class PBXNativeTarget; |
+class PBXObject; |
+class PBXProject; |
+class PBXShellScriptBuildPhase; |
+class PBXSourcesBuildPhase; |
+class PBXTarget; |
+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; |
+ |
+ // PXBObject 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_; |
+ 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; |
+ |
+ // PXBObject 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); |
+ ~PBXBuildFile() override; |
+ |
+ // PXBObject 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_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(PBXBuildFile); |
+}; |
+ |
+// 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; |
+ |
+ 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& source_path); |
+ |
+ // 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_; |
+ |
+ 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 PBXFileReference* product_reference); |
+ ~PBXNativeTarget() override; |
+ |
+ void AddFileForIndexing(const PBXFileReference* file_reference); |
+ |
+ // PBXObject implementation. |
+ PBXObjectClass Class() const override; |
+ void Print(std::ostream& out, unsigned indent) const override; |
+ |
+ private: |
+ const PBXFileReference* product_reference_; |
+ std::string product_type_; |
+ |
+ 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 AddSourceFile(const std::string& source_path); |
+ void AddAggregateTarget(const std::string& name, |
+ const std::string& shell_script); |
+ void AddNativeTarget(const std::string& name, |
+ const std::string& type, |
+ const std::string& output_name, |
+ const std::string& output_type, |
+ const std::string& shell_script); |
+ |
+ 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); |
+}; |
+ |
+// 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_ |