Write pools for all targets in all toolchains

We should be emitting pools for targets across all toolchains, not just
the default one, otherwise we might end up producing a broken Ninja file
since targets in non-default toolchains can use pools defined there.

Change-Id: I51349cd38d555eaaedacf14f3ab4fd69503ec99b
Reviewed-on: https://gn-review.googlesource.com/2720
Reviewed-by: Brett Wilson <brettw@chromium.org>
Commit-Queue: Brett Wilson <brettw@chromium.org>
diff --git a/tools/gn/ninja_build_writer.cc b/tools/gn/ninja_build_writer.cc
index f26c9a7..56d6c5f 100644
--- a/tools/gn/ninja_build_writer.cc
+++ b/tools/gn/ninja_build_writer.cc
@@ -163,12 +163,14 @@
     const BuildSettings* build_settings,
     const std::unordered_map<const Settings*, const Toolchain*>&
         used_toolchains,
+    const std::vector<const Target*>& all_targets,
     const Toolchain* default_toolchain,
     const std::vector<const Target*>& default_toolchain_targets,
     std::ostream& out,
     std::ostream& dep_out)
     : build_settings_(build_settings),
       used_toolchains_(used_toolchains),
+      all_targets_(all_targets),
       default_toolchain_(default_toolchain),
       default_toolchain_targets_(default_toolchain_targets),
       out_(out),
@@ -221,8 +223,9 @@
 
   std::stringstream file;
   std::stringstream depfile;
-  NinjaBuildWriter gen(build_settings, used_toolchains, default_toolchain,
-                       default_toolchain_targets, file, depfile);
+  NinjaBuildWriter gen(build_settings, used_toolchains, all_targets,
+                       default_toolchain, default_toolchain_targets,
+                       file, depfile);
   if (!gen.Run(err))
     return false;
 
@@ -301,7 +304,7 @@
     }
   }
 
-  for (const Target* target : default_toolchain_targets_) {
+  for (const Target* target : all_targets_) {
     if (target->output_type() == Target::ACTION) {
       const LabelPtrPair<Pool>& pool = target->action_values().pool();
       if (pool.ptr)
diff --git a/tools/gn/ninja_build_writer.h b/tools/gn/ninja_build_writer.h
index eee3a6e..9d2ac4c 100644
--- a/tools/gn/ninja_build_writer.h
+++ b/tools/gn/ninja_build_writer.h
@@ -28,6 +28,7 @@
   NinjaBuildWriter(const BuildSettings* settings,
                    const std::unordered_map<const Settings*, const Toolchain*>&
                        used_toolchains,
+                   const std::vector<const Target*>& all_targets,
                    const Toolchain* default_toolchain,
                    const std::vector<const Target*>& default_toolchain_targets,
                    std::ostream& out,
@@ -56,6 +57,7 @@
   const BuildSettings* build_settings_;
 
   const std::unordered_map<const Settings*, const Toolchain*>& used_toolchains_;
+  const std::vector<const Target*>& all_targets_;
   const Toolchain* default_toolchain_;
   const std::vector<const Target*>& default_toolchain_targets_;
 
diff --git a/tools/gn/ninja_build_writer_unittest.cc b/tools/gn/ninja_build_writer_unittest.cc
index bd93d36..5e19df2 100644
--- a/tools/gn/ninja_build_writer_unittest.cc
+++ b/tools/gn/ninja_build_writer_unittest.cc
@@ -47,6 +47,23 @@
   other_toolchain.GetTool(Toolchain::TYPE_LINK)
       ->set_pool(LabelPtrPair<Pool>(&other_regular_pool));
 
+  // Make another target that uses its own pool
+
+  Pool another_regular_pool(
+      setup.settings(),
+      Label(SourceDir("//another/"), "depth_pool", other_toolchain_label.dir(),
+            other_toolchain_label.name()));
+  another_regular_pool.set_depth(7);
+
+  Target target_baz(setup.settings(), Label(SourceDir("//baz/"), "baz"));
+  target_baz.set_output_type(Target::ACTION);
+  target_baz.action_values().set_script(SourceFile("//baz/script.py"));
+  target_baz.action_values().outputs() = SubstitutionList::MakeForTest(
+      "//out/Debug/out5.out", "//out/Debug/out6.out");
+  target_baz.SetToolchain(&other_toolchain);
+  target_baz.action_values().set_pool(LabelPtrPair<Pool>(&another_regular_pool));
+  ASSERT_TRUE(target_baz.OnResolved(&err));
+
   // The console pool must be in the default toolchain.
   Pool console_pool(setup.settings(), Label(SourceDir("//"), "console",
                                             setup.toolchain()->label().dir(),
@@ -63,12 +80,12 @@
   used_toolchains[setup.settings()] = setup.toolchain();
   used_toolchains[&other_settings] = &other_toolchain;
 
-  std::vector<const Target*> targets = {&target_foo, &target_bar};
+  std::vector<const Target*> targets = {&target_foo, &target_bar, &target_baz};
 
   std::ostringstream ninja_out;
   std::ostringstream depfile_out;
 
-  NinjaBuildWriter writer(setup.build_settings(), used_toolchains,
+  NinjaBuildWriter writer(setup.build_settings(), used_toolchains, targets,
                           setup.toolchain(), targets, ninja_out, depfile_out);
   ASSERT_TRUE(writer.Run(&err));
 
@@ -78,17 +95,23 @@
       "  generator = 1\n"
       "  depfile = build.ninja.d\n";
   const char expected_other_pool[] =
+      "pool other_toolchain_another_depth_pool\n"
+      "  depth = 7\n"
+      "\n"
       "pool other_toolchain_other_depth_pool\n"
       "  depth = 42\n";
   const char expected_toolchain[] = "subninja toolchain.ninja\n";
   const char expected_targets[] =
       "build bar: phony obj/bar/bar.stamp\n"
+      "build baz: phony obj/baz/baz.stamp\n"
       "build foo$:bar: phony obj/foo/bar.stamp\n"
-      "build bar$:bar: phony obj/bar/bar.stamp\n";
+      "build bar$:bar: phony obj/bar/bar.stamp\n"
+      "build baz$:baz: phony obj/baz/baz.stamp\n";
   const char expected_root_target[] =
       "build all: phony $\n"
       "    obj/foo/bar.stamp $\n"
-      "    obj/bar/bar.stamp\n";
+      "    obj/bar/bar.stamp $\n"
+      "    obj/baz/baz.stamp\n";
   const char expected_default[] = "default all\n";
   std::string out_str = ninja_out.str();
 #define EXPECT_SNIPPET(expected)                       \
@@ -133,7 +156,7 @@
   std::vector<const Target*> targets = {&target_foo, &target_bar};
   std::ostringstream ninja_out;
   std::ostringstream depfile_out;
-  NinjaBuildWriter writer(setup.build_settings(), used_toolchains,
+  NinjaBuildWriter writer(setup.build_settings(), used_toolchains, targets,
                           setup.toolchain(), targets, ninja_out, depfile_out);
   ASSERT_FALSE(writer.Run(&err));