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