Commit 778c4940 authored by Brad King's avatar Brad King
Browse files

ENH: Adding extra dependencies to jump-and-build rules that force a single...

ENH: Adding extra dependencies to jump-and-build rules that force a single ordering to prevent parallel jumps.  This avoids problems with two jumps reaching the same target in parallel which happened occasionally with the old generator.
parent b8e7851b
...@@ -3061,18 +3061,31 @@ cmLocalUnixMakefileGenerator2 ...@@ -3061,18 +3061,31 @@ cmLocalUnixMakefileGenerator2
makefileStream makefileStream
<< "# Targets to make sure needed libraries exist.\n" << "# Targets to make sure needed libraries exist.\n"
<< "# These will jump to other directories to build targets.\n" << "# These will jump to other directories to build targets.\n"
<< "# Note that extra dependencies are added to enforce an ordering\n"
<< "# that prevents parallel jumps.\n"
<< "\n"; << "\n";
} }
std::vector<std::string> depends; // Keep track of the last jump target written.
std::vector<std::string> commands; std::string lastJump;
// Add each jump rule.
for(std::map<cmStdString, RemoteTarget>::iterator for(std::map<cmStdString, RemoteTarget>::iterator
jump = m_JumpAndBuild.begin(); jump != m_JumpAndBuild.end(); ++jump) jump = m_JumpAndBuild.begin(); jump != m_JumpAndBuild.end(); ++jump)
{ {
const cmLocalUnixMakefileGenerator2::RemoteTarget& rt = jump->second; const cmLocalUnixMakefileGenerator2::RemoteTarget& rt = jump->second;
const char* destination = rt.m_BuildDirectory.c_str(); const char* destination = rt.m_BuildDirectory.c_str();
// Construct the dependency and build target names. // Depend on the previously written jump rule to make sure only
// one jump happens at a time. This avoids problems with multiple
// jump paths leading to the same target at the same time.
std::vector<std::string> depends;
if(!lastJump.empty())
{
depends.push_back(lastJump);
}
// Construct the dependency and build target names for the destination.
std::string dep = jump->first; std::string dep = jump->first;
dep += ".dir/"; dep += ".dir/";
dep += jump->first; dep += jump->first;
...@@ -3083,7 +3096,7 @@ cmLocalUnixMakefileGenerator2 ...@@ -3083,7 +3096,7 @@ cmLocalUnixMakefileGenerator2
tgt = this->ConvertToRelativeOutputPath(tgt.c_str()); tgt = this->ConvertToRelativeOutputPath(tgt.c_str());
// Add the pre-jump message. // Add the pre-jump message.
commands.clear(); std::vector<std::string> commands;
std::string jumpPreEcho = "Jumping to "; std::string jumpPreEcho = "Jumping to ";
jumpPreEcho += rt.m_BuildDirectory.c_str(); jumpPreEcho += rt.m_BuildDirectory.c_str();
jumpPreEcho += " to build "; jumpPreEcho += " to build ";
...@@ -3147,6 +3160,9 @@ cmLocalUnixMakefileGenerator2 ...@@ -3147,6 +3160,9 @@ cmLocalUnixMakefileGenerator2
// Write the rule. // Write the rule.
this->WriteMakeRule(makefileStream, 0, this->WriteMakeRule(makefileStream, 0,
rt.m_FilePath.c_str(), depends, commands); rt.m_FilePath.c_str(), depends, commands);
// This is now the last jump target written.
lastJump = rt.m_FilePath;
} }
} }
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment