Add support for Resources build phase to generated Xcode project Xcode complains that the project is missing some default resources if there is no "Default-568h@2x.png" file listed in a Resources build phase. As a first step, add the support for a Resources build phase to the generated project (in a followup CL, this phase will be filled with resources as collected from the project definition). Bug: chromium/1071055 Change-Id: Idc818b273aaaa49b1c0898848865331ae43788a3 Reviewed-on: https://gn-review.googlesource.com/c/gn/+/8101 Commit-Queue: Sylvain Defresne <sdefresne@chromium.org> Reviewed-by: Brett Wilson <brettw@chromium.org>
diff --git a/src/gn/xcode_object.cc b/src/gn/xcode_object.cc index 1b139a8..471a201 100644 --- a/src/gn/xcode_object.cc +++ b/src/gn/xcode_object.cc
@@ -303,6 +303,8 @@ return "PBXNativeTarget"; case PBXProjectClass: return "PBXProject"; + case PBXResourcesBuildPhaseClass: + return "PBXResourcesBuildPhase"; case PBXShellScriptBuildPhaseClass: return "PBXShellScriptBuildPhase"; case PBXSourcesBuildPhaseClass: @@ -368,6 +370,25 @@ PBXBuildPhase::~PBXBuildPhase() = default; +void PBXBuildPhase::AddBuildFile(std::unique_ptr<PBXBuildFile> build_file) { + DCHECK(build_file); + files_.push_back(std::move(build_file)); +} + +void PBXBuildPhase::Visit(PBXObjectVisitor& visitor) { + PBXObject::Visit(visitor); + for (const auto& file : files_) { + file->Visit(visitor); + } +} + +void PBXBuildPhase::Visit(PBXObjectVisitorConst& visitor) const { + PBXObject::Visit(visitor); + for (const auto& file : files_) { + file->Visit(visitor); + } +} + // PBXTarget ------------------------------------------------------------------ PBXTarget::PBXTarget(const std::string& name, @@ -442,7 +463,7 @@ // PBXBuildFile --------------------------------------------------------------- PBXBuildFile::PBXBuildFile(const PBXFileReference* file_reference, - const PBXSourcesBuildPhase* build_phase, + const PBXBuildPhase* build_phase, const CompilerFlags compiler_flag) : file_reference_(file_reference), build_phase_(build_phase), @@ -568,7 +589,7 @@ out << indent_str << Reference() << " = {\n"; PrintProperty(out, rules, "isa", ToString(Class())); PrintProperty(out, rules, "buildActionMask", 0x7fffffffu); - PrintProperty(out, rules, "files", EmptyPBXObjectVector()); + PrintProperty(out, rules, "files", files_); PrintProperty(out, rules, "runOnlyForDeploymentPostprocessing", 0u); out << indent_str << "};\n"; } @@ -701,10 +722,19 @@ static_cast<PBXSourcesBuildPhase*>(build_phases_.back().get()); build_phases_.push_back(std::make_unique<PBXFrameworksBuildPhase>()); + build_phases_.push_back(std::make_unique<PBXResourcesBuildPhase>()); + resource_build_phase_ = + static_cast<PBXResourcesBuildPhase*>(build_phases_.back().get()); } PBXNativeTarget::~PBXNativeTarget() = default; +void PBXNativeTarget::AddResourceFile(const PBXFileReference* file_reference) { + DCHECK(file_reference); + resource_build_phase_->AddBuildFile(std::make_unique<PBXBuildFile>( + file_reference, resource_build_phase_, CompilerFlags::NONE)); +} + void PBXNativeTarget::AddFileForIndexing(const PBXFileReference* file_reference, const CompilerFlags compiler_flag) { DCHECK(file_reference); @@ -913,6 +943,31 @@ out << indent_str << "};\n"; } +// PBXResourcesBuildPhase ----------------------------------------------------- + +PBXResourcesBuildPhase::PBXResourcesBuildPhase() = default; + +PBXResourcesBuildPhase::~PBXResourcesBuildPhase() = default; + +PBXObjectClass PBXResourcesBuildPhase::Class() const { + return PBXResourcesBuildPhaseClass; +} + +std::string PBXResourcesBuildPhase::Name() const { + return "Resources"; +} + +void PBXResourcesBuildPhase::Print(std::ostream& out, unsigned indent) const { + const std::string indent_str(indent, '\t'); + const IndentRules rules = {false, indent + 1}; + out << indent_str << Reference() << " = {\n"; + PrintProperty(out, rules, "isa", ToString(Class())); + PrintProperty(out, rules, "buildActionMask", 0x7fffffffu); + PrintProperty(out, rules, "files", files_); + PrintProperty(out, rules, "runOnlyForDeploymentPostprocessing", 0u); + out << indent_str << "};\n"; +} + // PBXShellScriptBuildPhase --------------------------------------------------- PBXShellScriptBuildPhase::PBXShellScriptBuildPhase( @@ -937,7 +992,7 @@ out << indent_str << Reference() << " = {\n"; PrintProperty(out, rules, "isa", ToString(Class())); PrintProperty(out, rules, "buildActionMask", 0x7fffffffu); - PrintProperty(out, rules, "files", EmptyPBXObjectVector()); + PrintProperty(out, rules, "files", files_); PrintProperty(out, rules, "inputPaths", EmptyPBXObjectVector()); PrintProperty(out, rules, "name", name_); PrintProperty(out, rules, "outputPaths", EmptyPBXObjectVector()); @@ -954,11 +1009,6 @@ PBXSourcesBuildPhase::~PBXSourcesBuildPhase() = default; -void PBXSourcesBuildPhase::AddBuildFile( - std::unique_ptr<PBXBuildFile> build_file) { - files_.push_back(std::move(build_file)); -} - PBXObjectClass PBXSourcesBuildPhase::Class() const { return PBXSourcesBuildPhaseClass; } @@ -967,20 +1017,6 @@ return "Sources"; } -void PBXSourcesBuildPhase::Visit(PBXObjectVisitor& visitor) { - PBXBuildPhase::Visit(visitor); - for (const auto& file : files_) { - file->Visit(visitor); - } -} - -void PBXSourcesBuildPhase::Visit(PBXObjectVisitorConst& visitor) const { - PBXBuildPhase::Visit(visitor); - for (const auto& file : files_) { - file->Visit(visitor); - } -} - void PBXSourcesBuildPhase::Print(std::ostream& out, unsigned indent) const { const std::string indent_str(indent, '\t'); const IndentRules rules = {false, indent + 1};
diff --git a/src/gn/xcode_object.h b/src/gn/xcode_object.h index aaa494c..78bdc92 100644 --- a/src/gn/xcode_object.h +++ b/src/gn/xcode_object.h
@@ -40,6 +40,7 @@ PBXGroupClass, PBXNativeTargetClass, PBXProjectClass, + PBXResourcesBuildPhaseClass, PBXShellScriptBuildPhaseClass, PBXSourcesBuildPhaseClass, PBXTargetDependencyClass, @@ -61,6 +62,7 @@ class PBXNativeTarget; class PBXObject; class PBXProject; +class PBXResourcesBuildPhase; class PBXShellScriptBuildPhase; class PBXSourcesBuildPhase; class PBXTarget; @@ -126,6 +128,15 @@ PBXBuildPhase(); ~PBXBuildPhase() override; + void AddBuildFile(std::unique_ptr<PBXBuildFile> build_file); + + // PBXObject implementation. + void Visit(PBXObjectVisitor& visitor) override; + void Visit(PBXObjectVisitorConst& visitor) const override; + + protected: + std::vector<std::unique_ptr<PBXBuildFile>> files_; + private: DISALLOW_COPY_AND_ASSIGN(PBXBuildPhase); }; @@ -152,6 +163,7 @@ std::vector<std::unique_ptr<PBXBuildPhase>> build_phases_; std::vector<std::unique_ptr<PBXTargetDependency>> dependencies_; PBXSourcesBuildPhase* source_build_phase_ = nullptr; + PBXResourcesBuildPhase* resource_build_phase_ = nullptr; std::string name_; private: @@ -181,7 +193,7 @@ class PBXBuildFile : public PBXObject { public: PBXBuildFile(const PBXFileReference* file_reference, - const PBXSourcesBuildPhase* build_phase, + const PBXBuildPhase* build_phase, const CompilerFlags compiler_flag); ~PBXBuildFile() override; @@ -192,7 +204,7 @@ private: const PBXFileReference* file_reference_ = nullptr; - const PBXSourcesBuildPhase* build_phase_ = nullptr; + const PBXBuildPhase* build_phase_ = nullptr; const CompilerFlags compiler_flag_; DISALLOW_COPY_AND_ASSIGN(PBXBuildFile); @@ -315,6 +327,8 @@ const PBXFileReference* product_reference); ~PBXNativeTarget() override; + void AddResourceFile(const PBXFileReference* file_reference); + void AddFileForIndexing(const PBXFileReference* file_reference, const CompilerFlags compiler_flag); @@ -388,6 +402,22 @@ DISALLOW_COPY_AND_ASSIGN(PBXProject); }; +// PBXResourcesBuildPhase ----------------------------------------------------- + +class PBXResourcesBuildPhase : public PBXBuildPhase { + public: + PBXResourcesBuildPhase(); + ~PBXResourcesBuildPhase() 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(PBXResourcesBuildPhase); +}; + // PBXShellScriptBuildPhase --------------------------------------------------- class PBXShellScriptBuildPhase : public PBXBuildPhase { @@ -415,18 +445,12 @@ 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 Visit(PBXObjectVisitorConst& visitor) const override; void Print(std::ostream& out, unsigned indent) const override; private: - std::vector<std::unique_ptr<PBXBuildFile>> files_; - DISALLOW_COPY_AND_ASSIGN(PBXSourcesBuildPhase); };