Index: tools/gn/ninja_build_writer.cc |
diff --git a/tools/gn/ninja_build_writer.cc b/tools/gn/ninja_build_writer.cc |
index a0dd8ce41036e3dc7303c519b76d944fb1b61da3..a805bb9e9a4ab78874d80ffc8429ab2f95c97b40 100644 |
--- a/tools/gn/ninja_build_writer.cc |
+++ b/tools/gn/ninja_build_writer.cc |
@@ -134,7 +134,8 @@ Err GetDuplicateOutputError(const std::vector<const Target*>& all_targets, |
NinjaBuildWriter::NinjaBuildWriter( |
const BuildSettings* build_settings, |
- const std::map<const Settings*, const Toolchain*>& used_toolchains, |
+ const std::unordered_map<const Settings*, const Toolchain*>& |
+ used_toolchains, |
const Toolchain* default_toolchain, |
const std::vector<const Target*>& default_toolchain_targets, |
std::ostream& out, |
@@ -167,7 +168,7 @@ bool NinjaBuildWriter::RunAndWriteFile( |
ScopedTrace trace(TraceItem::TRACE_FILE_WRITE, "build.ninja"); |
std::vector<const Target*> all_targets = builder.GetAllResolvedTargets(); |
- std::map<const Settings*, const Toolchain*> used_toolchains; |
+ std::unordered_map<const Settings*, const Toolchain*> used_toolchains; |
// Find the default toolchain info. |
Label default_toolchain_label = builder.loader()->GetDefaultToolchain(); |
@@ -260,7 +261,7 @@ void NinjaBuildWriter::WriteNinjaRules() { |
void NinjaBuildWriter::WriteAllPools() { |
// Compute the pools referenced by all tools of all used toolchains. |
- std::set<const Pool*> used_pools; |
+ std::unordered_set<const Pool*> used_pools; |
for (const auto& pair : used_toolchains_) { |
for (int j = Toolchain::TYPE_NONE + 1; j < Toolchain::TYPE_NUMTYPES; j++) { |
Toolchain::ToolType tool_type = static_cast<Toolchain::ToolType>(j); |
@@ -270,16 +271,38 @@ void NinjaBuildWriter::WriteAllPools() { |
} |
} |
- for (const Pool* pool : used_pools) { |
- std::string pool_name = pool->GetNinjaName(default_toolchain_->label()); |
- out_ << "pool " << pool_name << std::endl |
+ // Write pools sorted by their name, to make output deterministic. |
+ std::vector<const Pool*> sorted_pools(used_pools.begin(), used_pools.end()); |
+ auto pool_name = [this](const Pool* pool) { |
+ return pool->GetNinjaName(default_toolchain_->label()); |
+ }; |
+ std::sort(sorted_pools.begin(), sorted_pools.end(), |
+ [&pool_name](const Pool* a, const Pool* b) { |
+ return pool_name(a) < pool_name(b); |
+ }); |
+ for (const Pool* pool : sorted_pools) { |
+ out_ << "pool " << pool_name(pool) << std::endl |
<< " depth = " << pool->depth() << std::endl |
<< std::endl; |
} |
} |
void NinjaBuildWriter::WriteSubninjas() { |
- for (const auto& pair : used_toolchains_) { |
+ // Write toolchains sorted by their name, to make output deterministic. |
+ std::vector<std::pair<const Settings*, const Toolchain*>> sorted_settings( |
+ used_toolchains_.begin(), used_toolchains_.end()); |
+ std::sort(sorted_settings.begin(), sorted_settings.end(), |
+ [this](const std::pair<const Settings*, const Toolchain*>& a, |
+ const std::pair<const Settings*, const Toolchain*>& b) { |
+ // Always put the default toolchain first. |
+ if (b.second == default_toolchain_) |
+ return false; |
+ if (a.second == default_toolchain_) |
+ return true; |
+ return GetNinjaFileForToolchain(a.first) < |
+ GetNinjaFileForToolchain(b.first); |
+ }); |
+ for (const auto& pair : sorted_settings) { |
out_ << "subninja "; |
path_output_.WriteFile(out_, GetNinjaFileForToolchain(pair.first)); |
out_ << std::endl; |