Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / tools / gn / ninja_build_writer.cc
index f903904..1436af6 100644 (file)
@@ -8,7 +8,7 @@
 #include <map>
 
 #include "base/command_line.h"
-#include "base/file_util.h"
+#include "base/files/file_util.h"
 #include "base/path_service.h"
 #include "base/process/process_handle.h"
 #include "base/strings/string_util.h"
@@ -18,6 +18,7 @@
 #include "tools/gn/escape.h"
 #include "tools/gn/filesystem_utils.h"
 #include "tools/gn/input_file_manager.h"
+#include "tools/gn/ninja_utils.h"
 #include "tools/gn/scheduler.h"
 #include "tools/gn/target.h"
 #include "tools/gn/trace.h"
@@ -39,7 +40,7 @@ std::string GetSelfInvocationCommand(const BuildSettings* build_settings) {
   cmdline.AppendSwitch("-q");  // Don't write output.
 
   EscapeOptions escape_shell;
-  escape_shell.mode = ESCAPE_SHELL;
+  escape_shell.mode = ESCAPE_NINJA_COMMAND;
 #if defined(OS_WIN)
   // The command line code quoting varies by platform. We have one string,
   // possibly with spaces, that we want to quote. The Windows command line
@@ -74,16 +75,17 @@ std::string GetSelfInvocationCommand(const BuildSettings* build_settings) {
 NinjaBuildWriter::NinjaBuildWriter(
     const BuildSettings* build_settings,
     const std::vector<const Settings*>& all_settings,
+    const Toolchain* default_toolchain,
     const std::vector<const Target*>& default_toolchain_targets,
     std::ostream& out,
     std::ostream& dep_out)
     : build_settings_(build_settings),
       all_settings_(all_settings),
+      default_toolchain_(default_toolchain),
       default_toolchain_targets_(default_toolchain_targets),
       out_(out),
       dep_out_(dep_out),
-      path_output_(build_settings->build_dir(), ESCAPE_NINJA, false),
-      helper_(build_settings) {
+      path_output_(build_settings->build_dir(), ESCAPE_NINJA) {
 }
 
 NinjaBuildWriter::~NinjaBuildWriter() {
@@ -91,6 +93,7 @@ NinjaBuildWriter::~NinjaBuildWriter() {
 
 void NinjaBuildWriter::Run() {
   WriteNinjaRules();
+  WriteLinkPool();
   WriteSubninjas();
   WritePhonyAndAllRules();
 }
@@ -99,6 +102,7 @@ void NinjaBuildWriter::Run() {
 bool NinjaBuildWriter::RunAndWriteFile(
     const BuildSettings* build_settings,
     const std::vector<const Settings*>& all_settings,
+    const Toolchain* default_toolchain,
     const std::vector<const Target*>& default_toolchain_targets) {
   ScopedTrace trace(TraceItem::TRACE_FILE_WRITE, "build.ninja");
 
@@ -118,7 +122,7 @@ bool NinjaBuildWriter::RunAndWriteFile(
   if (depfile.fail())
     return false;
 
-  NinjaBuildWriter gen(build_settings, all_settings,
+  NinjaBuildWriter gen(build_settings, all_settings, default_toolchain,
                        default_toolchain_targets, file, depfile);
   gen.Run();
   return true;
@@ -152,11 +156,16 @@ void NinjaBuildWriter::WriteNinjaRules() {
   out_ << std::endl;
 }
 
+void NinjaBuildWriter::WriteLinkPool() {
+  out_ << "pool link_pool\n"
+       << "  depth = " << default_toolchain_->concurrent_links() << std::endl
+       << std::endl;
+}
+
 void NinjaBuildWriter::WriteSubninjas() {
   for (size_t i = 0; i < all_settings_.size(); i++) {
     out_ << "subninja ";
-    path_output_.WriteFile(out_,
-                           helper_.GetNinjaFileForToolchain(all_settings_[i]));
+    path_output_.WriteFile(out_, GetNinjaFileForToolchain(all_settings_[i]));
     out_ << std::endl;
   }
   out_ << std::endl;
@@ -192,7 +201,9 @@ void NinjaBuildWriter::WritePhonyAndAllRules() {
   for (size_t i = 0; i < default_toolchain_targets_.size(); i++) {
     const Target* target = default_toolchain_targets_[i];
     const Label& label = target->label();
-    OutputFile target_file = helper_.GetTargetOutputFile(target);
+    OutputFile target_file(target->dependency_output_file());
+    // The output files may have leading "./" so normalize those away.
+    NormalizePath(&target_file.value());
 
     // Write the long name "foo/bar:baz" for the target "//foo/bar:baz".
     std::string long_name = label.GetUserVisibleName(false);
@@ -224,7 +235,7 @@ void NinjaBuildWriter::WritePhonyAndAllRules() {
   for (size_t i = 0; i < toplevel_targets.size(); i++) {
     if (small_name_count[toplevel_targets[i]->label().name()] > 1) {
       const Target* target = toplevel_targets[i];
-      WritePhonyRule(target, helper_.GetTargetOutputFile(target),
+      WritePhonyRule(target, target->dependency_output_file(),
                      target->label().name());
     }
   }