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));