Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(370)

Unified Diff: tools/gn/xcode_object.cc

Issue 2005483002: Fix generation of target in Xcode project when using output_name. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@generate-localizable-strings
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/gn/xcode_object.h ('k') | tools/gn/xcode_writer.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/gn/xcode_object.cc
diff --git a/tools/gn/xcode_object.cc b/tools/gn/xcode_object.cc
index bc8994409fe71ca5a429cf728ba7e611bb1d8e87..3e9dd2ca198ea35fa7d82ad81362d5299613c1d3 100644
--- a/tools/gn/xcode_object.cc
+++ b/tools/gn/xcode_object.cc
@@ -8,10 +8,11 @@
#include <sstream>
#include <utility>
-#include "base/files/file_path.h"
#include "base/logging.h"
+#include "base/macros.h"
#include "base/memory/ptr_util.h"
#include "base/strings/string_util.h"
+#include "tools/gn/filesystem_utils.h"
// Helper methods -------------------------------------------------------------
@@ -89,67 +90,71 @@ std::string EncodeString(const std::string& string) {
return buffer.str();
}
-const char* GetSourceType(const base::FilePath::StringType& ext) {
- std::map<base::FilePath::StringType, const char*> extension_map = {
- {FILE_PATH_LITERAL(".a"), "archive.ar"},
- {FILE_PATH_LITERAL(".app"), "wrapper.application"},
- {FILE_PATH_LITERAL(".bdic"), "file"},
- {FILE_PATH_LITERAL(".bundle"), "wrapper.cfbundle"},
- {FILE_PATH_LITERAL(".c"), "sourcecode.c.c"},
- {FILE_PATH_LITERAL(".cc"), "sourcecode.cpp.cpp"},
- {FILE_PATH_LITERAL(".cpp"), "sourcecode.cpp.cpp"},
- {FILE_PATH_LITERAL(".css"), "text.css"},
- {FILE_PATH_LITERAL(".cxx"), "sourcecode.cpp.cpp"},
- {FILE_PATH_LITERAL(".dart"), "sourcecode"},
- {FILE_PATH_LITERAL(".dylib"), "compiled.mach-o.dylib"},
- {FILE_PATH_LITERAL(".framework"), "wrapper.framework"},
- {FILE_PATH_LITERAL(".h"), "sourcecode.c.h"},
- {FILE_PATH_LITERAL(".hxx"), "sourcecode.cpp.h"},
- {FILE_PATH_LITERAL(".icns"), "image.icns"},
- {FILE_PATH_LITERAL(".java"), "sourcecode.java"},
- {FILE_PATH_LITERAL(".js"), "sourcecode.javascript"},
- {FILE_PATH_LITERAL(".kext"), "wrapper.kext"},
- {FILE_PATH_LITERAL(".m"), "sourcecode.c.objc"},
- {FILE_PATH_LITERAL(".mm"), "sourcecode.cpp.objcpp"},
- {FILE_PATH_LITERAL(".nib"), "wrapper.nib"},
- {FILE_PATH_LITERAL(".o"), "compiled.mach-o.objfile"},
- {FILE_PATH_LITERAL(".pdf"), "image.pdf"},
- {FILE_PATH_LITERAL(".pl"), "text.script.perl"},
- {FILE_PATH_LITERAL(".plist"), "text.plist.xml"},
- {FILE_PATH_LITERAL(".pm"), "text.script.perl"},
- {FILE_PATH_LITERAL(".png"), "image.png"},
- {FILE_PATH_LITERAL(".py"), "text.script.python"},
- {FILE_PATH_LITERAL(".r"), "sourcecode.rez"},
- {FILE_PATH_LITERAL(".rez"), "sourcecode.rez"},
- {FILE_PATH_LITERAL(".s"), "sourcecode.asm"},
- {FILE_PATH_LITERAL(".storyboard"), "file.storyboard"},
- {FILE_PATH_LITERAL(".strings"), "text.plist.strings"},
- {FILE_PATH_LITERAL(".swift"), "sourcecode.swift"},
- {FILE_PATH_LITERAL(".ttf"), "file"},
- {FILE_PATH_LITERAL(".xcassets"), "folder.assetcatalog"},
- {FILE_PATH_LITERAL(".xcconfig"), "text.xcconfig"},
- {FILE_PATH_LITERAL(".xcdatamodel"), "wrapper.xcdatamodel"},
- {FILE_PATH_LITERAL(".xcdatamodeld"), "wrapper.xcdatamodeld"},
- {FILE_PATH_LITERAL(".xib"), "file.xib"},
- {FILE_PATH_LITERAL(".y"), "sourcecode.yacc"},
- };
-
- const auto& iter = extension_map.find(ext);
- if (iter != extension_map.end()) {
- return iter->second;
+struct SourceTypeForExt {
+ const char* ext;
+ const char* source_type;
+};
+
+const SourceTypeForExt kSourceTypeForExt[] = {
+ {".a", "archive.ar"},
+ {".app", "wrapper.application"},
+ {".bdic", "file"},
+ {".bundle", "wrapper.cfbundle"},
+ {".c", "sourcecode.c.c"},
+ {".cc", "sourcecode.cpp.cpp"},
+ {".cpp", "sourcecode.cpp.cpp"},
+ {".css", "text.css"},
+ {".cxx", "sourcecode.cpp.cpp"},
+ {".dart", "sourcecode"},
+ {".dylib", "compiled.mach-o.dylib"},
+ {".framework", "wrapper.framework"},
+ {".h", "sourcecode.c.h"},
+ {".hxx", "sourcecode.cpp.h"},
+ {".icns", "image.icns"},
+ {".java", "sourcecode.java"},
+ {".js", "sourcecode.javascript"},
+ {".kext", "wrapper.kext"},
+ {".m", "sourcecode.c.objc"},
+ {".mm", "sourcecode.cpp.objcpp"},
+ {".nib", "wrapper.nib"},
+ {".o", "compiled.mach-o.objfile"},
+ {".pdf", "image.pdf"},
+ {".pl", "text.script.perl"},
+ {".plist", "text.plist.xml"},
+ {".pm", "text.script.perl"},
+ {".png", "image.png"},
+ {".py", "text.script.python"},
+ {".r", "sourcecode.rez"},
+ {".rez", "sourcecode.rez"},
+ {".s", "sourcecode.asm"},
+ {".storyboard", "file.storyboard"},
+ {".strings", "text.plist.strings"},
+ {".swift", "sourcecode.swift"},
+ {".ttf", "file"},
+ {".xcassets", "folder.assetcatalog"},
+ {".xcconfig", "text.xcconfig"},
+ {".xcdatamodel", "wrapper.xcdatamodel"},
+ {".xcdatamodeld", "wrapper.xcdatamodeld"},
+ {".xib", "file.xib"},
+ {".y", "sourcecode.yacc"},
+};
+
+const char* GetSourceType(const base::StringPiece& ext) {
+ for (size_t i = 0; i < arraysize(kSourceTypeForExt); ++i) {
+ if (kSourceTypeForExt[i].ext == ext)
+ return kSourceTypeForExt[i].source_type;
}
return "text";
}
-bool HasExplicitFileType(const base::FilePath::StringType& ext) {
- return ext == FILE_PATH_LITERAL(".dart");
+bool HasExplicitFileType(const base::StringPiece& ext) {
+ return ext == ".dart";
}
-bool IsSourceFileForIndexing(const base::FilePath::StringType& ext) {
- return ext == FILE_PATH_LITERAL(".c") || ext == FILE_PATH_LITERAL(".cc") ||
- ext == FILE_PATH_LITERAL(".cpp") || ext == FILE_PATH_LITERAL(".cxx") ||
- ext == FILE_PATH_LITERAL(".m") || ext == FILE_PATH_LITERAL(".mm");
+bool IsSourceFileForIndexing(const base::StringPiece& ext) {
+ return ext == ".c" || ext == ".cc" || ext == ".cpp" || ext == ".cxx" ||
+ ext == ".m" || ext == ".mm";
}
void PrintValue(std::ostream& out, IndentRules rules, unsigned value) {
@@ -411,9 +416,7 @@ void PBXFileReference::Print(std::ostream& out, unsigned indent) const {
PrintProperty(out, rules, "explicitFileType", type_);
PrintProperty(out, rules, "includeInIndex", 0u);
} else {
- const base::FilePath::StringType ext =
- base::FilePath::FromUTF8Unsafe(path_).Extension();
-
+ base::StringPiece ext = FindExtension(&path_);
if (HasExplicitFileType(ext))
PrintProperty(out, rules, "explicitFileType", GetSourceType(ext));
else
@@ -539,10 +542,12 @@ PBXNativeTarget::PBXNativeTarget(const std::string& name,
const std::string& config_name,
const PBXAttributes& attributes,
const std::string& product_type,
+ const std::string& product_name,
const PBXFileReference* product_reference)
: PBXTarget(name, shell_script, config_name, attributes),
product_reference_(product_reference),
- product_type_(product_type) {
+ product_type_(product_type),
+ product_name_(product_name) {
DCHECK(product_reference_);
build_phases_.push_back(base::WrapUnique(new PBXSourcesBuildPhase));
source_build_phase_ =
@@ -574,7 +579,7 @@ void PBXNativeTarget::Print(std::ostream& out, unsigned indent) const {
PrintProperty(out, rules, "buildRules", EmptyPBXObjectVector());
PrintProperty(out, rules, "dependencies", EmptyPBXObjectVector());
PrintProperty(out, rules, "name", name_);
- PrintProperty(out, rules, "productName", name_);
+ PrintProperty(out, rules, "productName", product_name_);
PrintProperty(out, rules, "productReference", product_reference_);
PrintProperty(out, rules, "productType", product_type_);
out << indent_str << "};\n";
@@ -603,8 +608,7 @@ PBXProject::~PBXProject() {}
void PBXProject::AddSourceFile(const std::string& source_path) {
PBXFileReference* file_reference = sources_->AddSourceFile(source_path);
- const base::FilePath::StringType ext =
- base::FilePath::FromUTF8Unsafe(source_path).Extension();
+ base::StringPiece ext = FindExtension(&source_path);
if (!IsSourceFileForIndexing(ext))
return;
@@ -621,7 +625,7 @@ void PBXProject::AddSourceFile(const std::string& source_path) {
const char product_type[] = "com.apple.product-type.tool";
targets_.push_back(base::WrapUnique(
new PBXNativeTarget(name_, std::string(), config_name_, attributes,
- product_type, product_reference)));
+ product_type, name_, product_reference)));
target_for_indexing_ = static_cast<PBXNativeTarget*>(targets_.back().get());
}
@@ -645,20 +649,25 @@ void PBXProject::AddNativeTarget(const std::string& name,
const std::string& output_name,
const std::string& output_type,
const std::string& shell_script) {
- const base::FilePath::StringType ext =
- base::FilePath::FromUTF8Unsafe(output_name).Extension();
+ base::StringPiece ext = FindExtension(&output_name);
+ PBXFileReference* product =
+ static_cast<PBXFileReference*>(products_->AddChild(base::WrapUnique(
+ new PBXFileReference(std::string(), output_name,
+ type.empty() ? GetSourceType(ext) : type))));
- PBXFileReference* product = static_cast<PBXFileReference*>(
- products_->AddChild(base::WrapUnique(new PBXFileReference(
- name, output_name, type.empty() ? GetSourceType(ext) : type))));
+ size_t ext_offset = FindExtensionOffset(output_name);
+ std::string product_name = ext_offset != std::string::npos
+ ? output_name.substr(0, ext_offset - 1)
+ : output_name;
PBXAttributes attributes;
attributes["CODE_SIGNING_REQUIRED"] = "NO";
attributes["CONFIGURATION_BUILD_DIR"] = ".";
- attributes["PRODUCT_NAME"] = name;
+ attributes["PRODUCT_NAME"] = product_name;
- targets_.push_back(base::WrapUnique(new PBXNativeTarget(
- name, shell_script, config_name_, attributes, output_type, product)));
+ targets_.push_back(base::WrapUnique(
+ new PBXNativeTarget(name, shell_script, config_name_, attributes,
+ output_type, product_name, product)));
}
void PBXProject::SetProjectDirPath(const std::string& project_dir_path) {
« no previous file with comments | « tools/gn/xcode_object.h ('k') | tools/gn/xcode_writer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698