mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-11 00:11:07 -06:00
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:
@@ -454,13 +454,24 @@ cmLocalNinjaGenerator::WriteCustomCommandBuildStatement(
|
||||
void cmLocalNinjaGenerator::AddCustomCommandTarget(cmCustomCommand const* cc,
|
||||
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()
|
||||
{
|
||||
for (CustomCommandTargetMap::iterator i = this->CustomCommandTargets.begin();
|
||||
i != this->CustomCommandTargets.end(); ++i) {
|
||||
for (std::vector<cmCustomCommand const*>::iterator vi =
|
||||
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
|
||||
// systems exist where the target dependencies on some of the targets are
|
||||
// overspecified, leading to a dependency cycle. If we assume all target
|
||||
|
||||
@@ -106,6 +106,7 @@ private:
|
||||
typedef std::map<cmCustomCommand const*, std::set<cmGeneratorTarget*> >
|
||||
CustomCommandTargetMap;
|
||||
CustomCommandTargetMap CustomCommandTargets;
|
||||
std::vector<cmCustomCommand const*> CustomCommands;
|
||||
};
|
||||
|
||||
#endif // ! cmLocalNinjaGenerator_h
|
||||
|
||||
Reference in New Issue
Block a user