Record edge type in global dependency graph
Each inter-target dependency may be a 'link' or 'util' dependency.
This commit is contained in:
parent
82596fcffc
commit
605f4bc097
|
@ -144,7 +144,7 @@ bool cmComputeTargetDepends::Compute()
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
void
|
void
|
||||||
cmComputeTargetDepends::GetTargetDirectDepends(cmTarget* t,
|
cmComputeTargetDepends::GetTargetDirectDepends(cmTarget* t,
|
||||||
std::set<cmTarget*>& deps)
|
cmTargetDependSet& deps)
|
||||||
{
|
{
|
||||||
// Lookup the index for this target. All targets should be known by
|
// Lookup the index for this target. All targets should be known by
|
||||||
// this point.
|
// this point.
|
||||||
|
@ -156,7 +156,9 @@ cmComputeTargetDepends::GetTargetDirectDepends(cmTarget* t,
|
||||||
EdgeList const& nl = this->FinalGraph[i];
|
EdgeList const& nl = this->FinalGraph[i];
|
||||||
for(EdgeList::const_iterator ni = nl.begin(); ni != nl.end(); ++ni)
|
for(EdgeList::const_iterator ni = nl.begin(); ni != nl.end(); ++ni)
|
||||||
{
|
{
|
||||||
deps.insert(this->Targets[*ni]);
|
cmTarget* dep = this->Targets[*ni];
|
||||||
|
cmTargetDependSet::iterator di = deps.insert(dep).first;
|
||||||
|
di->SetType(ni->IsStrong());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -445,7 +447,7 @@ cmComputeTargetDepends
|
||||||
int j = *ei;
|
int j = *ei;
|
||||||
if(cmap[j] == c && ei->IsStrong())
|
if(cmap[j] == c && ei->IsStrong())
|
||||||
{
|
{
|
||||||
this->FinalGraph[i].push_back(j);
|
this->FinalGraph[i].push_back(cmGraphEdge(j, true));
|
||||||
if(!this->IntraComponent(cmap, c, j, head, emitted, visited))
|
if(!this->IntraComponent(cmap, c, j, head, emitted, visited))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
@ -456,7 +458,7 @@ cmComputeTargetDepends
|
||||||
// Prepend to a linear linked-list of intra-component edges.
|
// Prepend to a linear linked-list of intra-component edges.
|
||||||
if(*head >= 0)
|
if(*head >= 0)
|
||||||
{
|
{
|
||||||
this->FinalGraph[i].push_back(*head);
|
this->FinalGraph[i].push_back(cmGraphEdge(*head, false));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -515,7 +517,7 @@ cmComputeTargetDepends
|
||||||
int dependee_component = *ni;
|
int dependee_component = *ni;
|
||||||
int dependee_component_head = this->ComponentHead[dependee_component];
|
int dependee_component_head = this->ComponentHead[dependee_component];
|
||||||
this->FinalGraph[depender_component_tail]
|
this->FinalGraph[depender_component_tail]
|
||||||
.push_back(dependee_component_head);
|
.push_back(cmGraphEdge(dependee_component_head, ni->IsStrong()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
class cmComputeComponentGraph;
|
class cmComputeComponentGraph;
|
||||||
class cmGlobalGenerator;
|
class cmGlobalGenerator;
|
||||||
class cmTarget;
|
class cmTarget;
|
||||||
|
class cmTargetDependSet;
|
||||||
|
|
||||||
/** \class cmComputeTargetDepends
|
/** \class cmComputeTargetDepends
|
||||||
* \brief Compute global interdependencies among targets.
|
* \brief Compute global interdependencies among targets.
|
||||||
|
@ -38,7 +39,7 @@ public:
|
||||||
bool Compute();
|
bool Compute();
|
||||||
|
|
||||||
std::vector<cmTarget*> const& GetTargets() const { return this->Targets; }
|
std::vector<cmTarget*> const& GetTargets() const { return this->Targets; }
|
||||||
void GetTargetDirectDepends(cmTarget* t, std::set<cmTarget*>& deps);
|
void GetTargetDirectDepends(cmTarget* t, cmTargetDependSet& deps);
|
||||||
private:
|
private:
|
||||||
void CollectTargets();
|
void CollectTargets();
|
||||||
void CollectDepends();
|
void CollectDepends();
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include "cmStandardIncludes.h"
|
#include "cmStandardIncludes.h"
|
||||||
|
|
||||||
#include "cmTarget.h" // For cmTargets
|
#include "cmTarget.h" // For cmTargets
|
||||||
|
#include "cmTargetDepend.h" // For cmTargetDependSet
|
||||||
|
|
||||||
class cmake;
|
class cmake;
|
||||||
class cmMakefile;
|
class cmMakefile;
|
||||||
|
@ -234,7 +235,7 @@ public:
|
||||||
virtual const char* GetCleanTargetName() { return 0; }
|
virtual const char* GetCleanTargetName() { return 0; }
|
||||||
|
|
||||||
// Class to track a set of dependencies.
|
// Class to track a set of dependencies.
|
||||||
class TargetDependSet: public std::set<cmTarget*> {};
|
typedef cmTargetDependSet TargetDependSet;
|
||||||
|
|
||||||
// what targets does the specified target depend on directly
|
// what targets does the specified target depend on directly
|
||||||
// via a target_link_libraries or add_dependencies
|
// via a target_link_libraries or add_dependencies
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
/*============================================================================
|
||||||
|
CMake - Cross Platform Makefile Generator
|
||||||
|
Copyright 2000-2010 Kitware, Inc., Insight Software Consortium
|
||||||
|
|
||||||
|
Distributed under the OSI-approved BSD License (the "License");
|
||||||
|
see accompanying file Copyright.txt for details.
|
||||||
|
|
||||||
|
This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||||
|
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
See the License for more information.
|
||||||
|
============================================================================*/
|
||||||
|
#ifndef cmTargetDepend_h
|
||||||
|
#define cmTargetDepend_h
|
||||||
|
|
||||||
|
#include "cmStandardIncludes.h"
|
||||||
|
|
||||||
|
class cmTarget;
|
||||||
|
|
||||||
|
/** One edge in the global target dependency graph.
|
||||||
|
It may be marked as a 'link' or 'util' edge or both. */
|
||||||
|
class cmTargetDepend
|
||||||
|
{
|
||||||
|
cmTarget* Target;
|
||||||
|
|
||||||
|
// The set order depends only on the Target, so we use
|
||||||
|
// mutable members to acheive a map with set syntax.
|
||||||
|
mutable bool Link;
|
||||||
|
mutable bool Util;
|
||||||
|
public:
|
||||||
|
cmTargetDepend(cmTarget* t): Target(t), Link(false), Util(false) {}
|
||||||
|
operator cmTarget*() const { return this->Target; }
|
||||||
|
cmTarget* operator->() const { return this->Target; }
|
||||||
|
cmTarget& operator*() const { return *this->Target; }
|
||||||
|
friend bool operator < (cmTargetDepend const& l, cmTargetDepend const& r)
|
||||||
|
{ return l.Target < r.Target; }
|
||||||
|
void SetType(bool strong) const
|
||||||
|
{
|
||||||
|
if(strong) { this->Util = true; }
|
||||||
|
else { this->Link = true; }
|
||||||
|
}
|
||||||
|
bool IsLink() const { return this->Link; }
|
||||||
|
bool IsUtil() const { return this->Util; }
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Unordered set of (direct) dependencies of a target. */
|
||||||
|
class cmTargetDependSet: public std::set<cmTargetDepend> {};
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue