Allow selection of autoninja for XCode building. Bug: crbug.com/1052038 Change-Id: I2c9f33d9633bd48166f459fa4c5fbfdd31c9851d Reviewed-on: https://gn-review.googlesource.com/c/gn/+/7440 Reviewed-by: Brett Wilson <brettw@chromium.org> Commit-Queue: Brett Wilson <brettw@chromium.org>
diff --git a/src/gn/command_gen.cc b/src/gn/command_gen.cc index 57828ad..0059689 100644 --- a/src/gn/command_gen.cc +++ b/src/gn/command_gen.cc
@@ -42,6 +42,7 @@ const char kSwitchIdeValueWinSdk[] = "winsdk"; const char kSwitchIdeValueXcode[] = "xcode"; const char kSwitchIdeValueJson[] = "json"; +const char kSwitchNinjaExecutable[] = "ninja-executable"; const char kSwitchNinjaExtraArgs[] = "ninja-extra-args"; const char kSwitchNoDeps[] = "no-deps"; const char kSwitchRootTarget[] = "root-target"; @@ -237,6 +238,7 @@ bool res = XcodeWriter::RunAndWriteFiles( command_line->GetSwitchValueASCII(kSwitchWorkspace), command_line->GetSwitchValueASCII(kSwitchRootTarget), + command_line->GetSwitchValueASCII(kSwitchNinjaExecutable), command_line->GetSwitchValueASCII(kSwitchNinjaExtraArgs), command_line->GetSwitchValueASCII(kSwitchFilters), build_settings, builder, err); @@ -375,6 +377,9 @@ Override defaut workspace file name ("all"). The workspace file is written to the root build directory. + --ninja-executable=<string> + Can be used to specify the ninja executable to use when building. + --ninja-extra-args=<string> This string is passed without any quoting to the ninja invocation command-line. Can be used to configure ninja flags, like "-j".
diff --git a/src/gn/xcode_writer.cc b/src/gn/xcode_writer.cc index 8281a2c..6ffcc58 100644 --- a/src/gn/xcode_writer.cc +++ b/src/gn/xcode_writer.cc
@@ -71,7 +71,12 @@ return XcodeWriter::WRITER_TARGET_OS_MACOS; } +std::string GetNinjaExecutable(const std::string& ninja_executable) { + return ninja_executable.empty() ? "ninja" : ninja_executable; +} + std::string GetBuildScript(const std::string& target_name, + const std::string& ninja_executable, const std::string& ninja_extra_args, base::Environment* environment) { std::stringstream script; @@ -96,7 +101,7 @@ script << "\" "; } - script << "ninja -C ."; + script << GetNinjaExecutable(ninja_executable) << " -C ."; if (!ninja_extra_args.empty()) script << " " << ninja_extra_args; if (!target_name.empty()) @@ -358,6 +363,7 @@ // static bool XcodeWriter::RunAndWriteFiles(const std::string& workspace_name, const std::string& root_target_name, + const std::string& ninja_executable, const std::string& ninja_extra_args, const std::string& dir_filters_string, const BuildSettings* build_settings, @@ -401,7 +407,8 @@ XcodeWriter workspace(workspace_name); workspace.CreateProductsProject(targets, all_targets, attributes, source_path, config_name, root_target_name, - ninja_extra_args, build_settings, target_os); + ninja_executable, ninja_extra_args, + build_settings, target_os); return workspace.WriteFiles(build_settings, err); } @@ -474,6 +481,7 @@ const std::string& source_path, const std::string& config_name, const std::string& root_target, + const std::string& ninja_executable, const std::string& ninja_extra_args, const BuildSettings* build_settings, TargetOsType target_os) { @@ -489,7 +497,8 @@ AddSourceFilesToProjectForIndexing(all_targets, main_project.get(), source_dir, build_settings); main_project->AddAggregateTarget( - "All", GetBuildScript(root_target, ninja_extra_args, env.get())); + "All", GetBuildScript(root_target, ninja_executable, ninja_extra_args, + env.get())); // Needs to search for xctest files under the application targets, and this // variable is used to store the results of visited targets, thus making the @@ -507,8 +516,8 @@ target->output_name().empty() ? target->label().name() : target->output_name(), "com.apple.product-type.tool", - GetBuildScript(target->label().name(), ninja_extra_args, - env.get())); + GetBuildScript(target->label().name(), ninja_executable, + ninja_extra_args, env.get())); break; case Target::CREATE_BUNDLE: { @@ -538,7 +547,8 @@ PBXNativeTarget* native_target = main_project->AddNativeTarget( pbxtarget_name, std::string(), target_output_name, target->bundle_data().product_type(), - GetBuildScript(pbxtarget_name, ninja_extra_args, env.get()), + GetBuildScript(pbxtarget_name, ninja_executable, ninja_extra_args, + env.get()), xcode_extra_attributes); bundle_targets.push_back(target);
diff --git a/src/gn/xcode_writer.h b/src/gn/xcode_writer.h index 24953dc..e391c56 100644 --- a/src/gn/xcode_writer.h +++ b/src/gn/xcode_writer.h
@@ -33,6 +33,8 @@ // |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_executable| can be used to control which ninja executable will be + // run. When empty, regular ninja will be used. // |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 @@ -40,6 +42,7 @@ // 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_executable, const std::string& ninja_extra_args, const std::string& dir_filters_string, const BuildSettings* build_settings, @@ -68,6 +71,7 @@ const std::string& source_path, const std::string& config_name, const std::string& root_target, + const std::string& ninja_executable, const std::string& ninja_extra_args, const BuildSettings* build_settings, TargetOsType target_os);