mirror of
https://github.com/klzgrad/naiveproxy.git
synced 2024-11-24 14:26:09 +03:00
465 lines
14 KiB
C
465 lines
14 KiB
C
|
// 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_
|