From 46fa9583624b3dd2b2dad978cb0313b78eae5f53 Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 12 Feb 2016 08:45:09 -0500 Subject: [PATCH] Ninja: Fix non-determinism in generated target dependency order (#15968) We represent target dependency sets as `set` which orders by a `cmGeneratorTarget const*` pointer value. Therefore the order of dependencies encountered in AppendTargetDepends is not predictable. Sort them by content to make the result deterministic. --- Source/cmGlobalNinjaGenerator.cxx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx index 0f06e439f..bb5f92123 100644 --- a/Source/cmGlobalNinjaGenerator.cxx +++ b/Source/cmGlobalNinjaGenerator.cxx @@ -991,6 +991,7 @@ cmGlobalNinjaGenerator std::set const& utils = target->GetUtilities(); std::copy(utils.begin(), utils.end(), std::back_inserter(outputs)); } else { + cmNinjaDeps outs; cmTargetDependSet const& targetDeps = this->GetTargetDirectDepends(target); for (cmTargetDependSet::const_iterator i = targetDeps.begin(); i != targetDeps.end(); ++i) @@ -999,8 +1000,10 @@ cmGlobalNinjaGenerator { continue; } - this->AppendTargetOutputs(*i, outputs); + this->AppendTargetOutputs(*i, outs); } + std::sort(outs.begin(), outs.end()); + outputs.insert(outputs.end(), outs.begin(), outs.end()); } }