Record edge type in global dependency graph

Each inter-target dependency may be a 'link' or 'util' dependency.
This commit is contained in:
Brad King 2010-08-25 10:07:25 -04:00
parent 82596fcffc
commit 605f4bc097
4 changed files with 59 additions and 7 deletions

View File

@ -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;

View File

@ -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();

View File

@ -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

48
Source/cmTargetDepend.h Normal file
View File

@ -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