| // 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_WRITER_H_ | 
 | #define TOOLS_GN_XCODE_WRITER_H_ | 
 |  | 
 | #include <iosfwd> | 
 | #include <map> | 
 | #include <memory> | 
 | #include <string> | 
 | #include <vector> | 
 |  | 
 | #include "base/macros.h" | 
 |  | 
 | class Builder; | 
 | class BuildSettings; | 
 | class Err; | 
 | class Target; | 
 |  | 
 | using PBXAttributes = std::map<std::string, std::string>; | 
 | class PBXProject; | 
 |  | 
 | class XcodeWriter { | 
 |  public: | 
 |   enum TargetOsType { | 
 |     WRITER_TARGET_OS_IOS, | 
 |     WRITER_TARGET_OS_MACOS, | 
 |   }; | 
 |  | 
 |   // Writes Xcode workspace and project files. | 
 |   // | 
 |   // |workspace_name| is the optional name of the workspace file name ("all" | 
 |   // is used if not specified). |root_target_name| is the name of the main | 
 |   // target corresponding to building "All" (for example "gn_all" in Chromium). | 
 |   // |ninja_extra_args| are additional arguments to pass to ninja invocation | 
 |   // (can be used to increase limit of concurrent processes when using goma). | 
 |   // |dir_filters_string| is optional semicolon-separated list of label patterns | 
 |   // used to limit the set of generated projects. Only matching targets will be | 
 |   // included to the workspace. On failure will populate |err| and return false. | 
 |   static bool RunAndWriteFiles(const std::string& workspace_name, | 
 |                                const std::string& root_target_name, | 
 |                                const std::string& ninja_extra_args, | 
 |                                const std::string& dir_filters_string, | 
 |                                const BuildSettings* build_settings, | 
 |                                const Builder& builder, | 
 |                                Err* err); | 
 |  | 
 |  private: | 
 |   XcodeWriter(const std::string& name); | 
 |   ~XcodeWriter(); | 
 |  | 
 |   // Filters the list of targets to only return the targets with artifacts | 
 |   // usable from Xcode (mostly application bundles). On failure populate |err| | 
 |   // and return false. | 
 |   static bool FilterTargets(const BuildSettings* build_settings, | 
 |                             const std::vector<const Target*>& all_targets, | 
 |                             const std::string& dir_filters_string, | 
 |                             std::vector<const Target*>* targets, | 
 |                             Err* err); | 
 |  | 
 |   // Generate the "products.xcodeproj" project that reference all products | 
 |   // (i.e. targets that have a build artefact usable from Xcode, mostly | 
 |   // application bundles). | 
 |   void CreateProductsProject(const std::vector<const Target*>& targets, | 
 |                              const std::vector<const Target*>& all_targets, | 
 |                              const PBXAttributes& attributes, | 
 |                              const std::string& source_path, | 
 |                              const std::string& config_name, | 
 |                              const std::string& root_target, | 
 |                              const std::string& ninja_extra_args, | 
 |                              const BuildSettings* build_settings, | 
 |                              TargetOsType target_os); | 
 |  | 
 |   bool WriteFiles(const BuildSettings* build_settings, Err* err); | 
 |   bool WriteProjectFile(const BuildSettings* build_settings, | 
 |                         PBXProject* project, | 
 |                         Err* err); | 
 |  | 
 |   void WriteWorkspaceContent(std::ostream& out); | 
 |   void WriteProjectContent(std::ostream& out, PBXProject* project); | 
 |  | 
 |   std::string name_; | 
 |   std::vector<std::unique_ptr<PBXProject>> projects_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(XcodeWriter); | 
 | }; | 
 |  | 
 | #endif  // TOOLS_GN_XCODE_WRITER_H_ |