CTest: Fix test DEPEND cycle detection

A cycle exists when the DFS returns to the root node, not just when
multiple paths lead to the same node.

Inspired-By: Alexander Esilevich <aesilevich@pathscale.com>
This commit is contained in:
Brad King
2010-12-15 16:49:34 -05:00
parent a14a8562ea
commit f48d3bc5ba
3 changed files with 34 additions and 16 deletions
+21 -16
View File
@@ -653,32 +653,37 @@ bool cmCTestMultiProcessHandler::CheckCycles()
it != this->Tests.end(); ++it)
{
//DFS from each element to itself
int root = it->first;
std::set<int> visited;
std::stack<int> s;
std::vector<int> visited;
s.push(it->first);
s.push(root);
while(!s.empty())
{
int test = s.top();
s.pop();
for(TestSet::iterator d = this->Tests[test].begin();
d != this->Tests[test].end(); ++d)
if(visited.insert(test).second)
{
if(std::find(visited.begin(), visited.end(), *d) != visited.end())
for(TestSet::iterator d = this->Tests[test].begin();
d != this->Tests[test].end(); ++d)
{
//cycle exists
cmCTestLog(this->CTest, ERROR_MESSAGE, "Error: a cycle exists in "
"the test dependency graph for the test \""
<< this->Properties[it->first]->Name << "\"." << std::endl
<< "Please fix the cycle and run ctest again." << std::endl);
return false;
if(*d == root)
{
//cycle exists
cmCTestLog(this->CTest, ERROR_MESSAGE, "Error: a cycle exists in "
"the test dependency graph for the test \""
<< this->Properties[root]->Name << "\"." << std::endl
<< "Please fix the cycle and run ctest again." << std::endl);
return false;
}
else
{
s.push(*d);
}
}
s.push(*d);
}
visited.push_back(test);
}
}
cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
"Checking test dependency graph end" << std::endl);
return true;
}