Ninja: Fix non-determinism in generated build statement order (#15968)

Generate custom command build statements in the order we encounter
source files specifying them.  Do not depend on pointer values of
internally allocated structures for ordering.
This commit is contained in:
Brad King 2016-02-10 14:08:48 -05:00
parent a5a5a68572
commit 59ade844ef
2 changed files with 15 additions and 3 deletions

View File

@ -454,13 +454,24 @@ cmLocalNinjaGenerator::WriteCustomCommandBuildStatement(
void cmLocalNinjaGenerator::AddCustomCommandTarget(cmCustomCommand const* cc, void cmLocalNinjaGenerator::AddCustomCommandTarget(cmCustomCommand const* cc,
cmGeneratorTarget* target) cmGeneratorTarget* target)
{ {
this->CustomCommandTargets[cc].insert(target); CustomCommandTargetMap::value_type v(cc, std::set<cmGeneratorTarget*>());
std::pair<CustomCommandTargetMap::iterator, bool>
ins = this->CustomCommandTargets.insert(v);
if (ins.second)
{
this->CustomCommands.push_back(cc);
}
ins.first->second.insert(target);
} }
void cmLocalNinjaGenerator::WriteCustomCommandBuildStatements() void cmLocalNinjaGenerator::WriteCustomCommandBuildStatements()
{ {
for (CustomCommandTargetMap::iterator i = this->CustomCommandTargets.begin(); for (std::vector<cmCustomCommand const*>::iterator vi =
i != this->CustomCommandTargets.end(); ++i) { this->CustomCommands.begin(); vi != this->CustomCommands.end(); ++vi)
{
CustomCommandTargetMap::iterator i = this->CustomCommandTargets.find(*vi);
assert(i != this->CustomCommandTargets.end());
// A custom command may appear on multiple targets. However, some build // A custom command may appear on multiple targets. However, some build
// systems exist where the target dependencies on some of the targets are // systems exist where the target dependencies on some of the targets are
// overspecified, leading to a dependency cycle. If we assume all target // overspecified, leading to a dependency cycle. If we assume all target

View File

@ -106,6 +106,7 @@ private:
typedef std::map<cmCustomCommand const*, std::set<cmGeneratorTarget*> > typedef std::map<cmCustomCommand const*, std::set<cmGeneratorTarget*> >
CustomCommandTargetMap; CustomCommandTargetMap;
CustomCommandTargetMap CustomCommandTargets; CustomCommandTargetMap CustomCommandTargets;
std::vector<cmCustomCommand const*> CustomCommands;
}; };
#endif // ! cmLocalNinjaGenerator_h #endif // ! cmLocalNinjaGenerator_h