| 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_
|
|
|