summaryrefslogtreecommitdiffstats
path: root/Source/cmTarget.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2009-09-07 14:11:43 (GMT)
committerBrad King <brad.king@kitware.com>2009-09-07 14:11:43 (GMT)
commit4224513ccee04d540e89db5cf1ca531b6ef8e0e5 (patch)
tree61b2291b69681886b16ad99fc29fc481f73dafb1 /Source/cmTarget.cxx
parent355511ade9fd1be71835359a9b085586446e50c2 (diff)
downloadCMake-4224513ccee04d540e89db5cf1ca531b6ef8e0e5.zip
CMake-4224513ccee04d540e89db5cf1ca531b6ef8e0e5.tar.gz
CMake-4224513ccee04d540e89db5cf1ca531b6ef8e0e5.tar.bz2
Save source dependencies from custom command trace
In each target we trace dependencies among custom commands to pull in all source files and build rules necessary to complete the target. This commit teaches cmTarget to save the inter-source dependencies found during its analysis. Later this can be used by generators that need to topologically order custom command rules.
Diffstat (limited to 'Source/cmTarget.cxx')
-rw-r--r--Source/cmTarget.cxx46
1 files changed, 41 insertions, 5 deletions
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index 22b49ef..3882253 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -88,6 +88,10 @@ public:
typedef std::map<cmStdString, cmTarget::LinkClosure> LinkClosureMapType;
LinkClosureMapType LinkClosureMap;
+
+ struct SourceEntry { std::vector<cmSourceFile*> Depends; };
+ typedef std::map<cmSourceFile*, SourceEntry> SourceEntriesType;
+ SourceEntriesType SourceEntries;
};
//----------------------------------------------------------------------------
@@ -1081,12 +1085,16 @@ bool cmTarget::IsAppBundleOnApple()
class cmTargetTraceDependencies
{
public:
- cmTargetTraceDependencies(cmTarget* target, const char* vsProjectFile);
+ cmTargetTraceDependencies(cmTarget* target, cmTargetInternals* internal,
+ const char* vsProjectFile);
void Trace();
private:
cmTarget* Target;
+ cmTargetInternals* Internal;
cmMakefile* Makefile;
cmGlobalGenerator* GlobalGenerator;
+ typedef cmTargetInternals::SourceEntry SourceEntry;
+ SourceEntry* CurrentEntry;
std::queue<cmSourceFile*> SourceQueue;
std::set<cmSourceFile*> SourcesQueued;
typedef std::map<cmStdString, cmSourceFile*> NameMapType;
@@ -1102,13 +1110,15 @@ private:
//----------------------------------------------------------------------------
cmTargetTraceDependencies
-::cmTargetTraceDependencies(cmTarget* target, const char* vsProjectFile):
- Target(target)
+::cmTargetTraceDependencies(cmTarget* target, cmTargetInternals* internal,
+ const char* vsProjectFile):
+ Target(target), Internal(internal)
{
// Convenience.
this->Makefile = this->Target->GetMakefile();
this->GlobalGenerator =
this->Makefile->GetLocalGenerator()->GetGlobalGenerator();
+ this->CurrentEntry = 0;
// Queue all the source files already specified for the target.
std::vector<cmSourceFile*> const& sources = this->Target->GetSourceFiles();
@@ -1140,6 +1150,7 @@ void cmTargetTraceDependencies::Trace()
// Get the next source from the queue.
cmSourceFile* sf = this->SourceQueue.front();
this->SourceQueue.pop();
+ this->CurrentEntry = &this->Internal->SourceEntries[sf];
// Queue dependencies added explicitly by the user.
if(const char* additionalDeps = sf->GetProperty("OBJECT_DEPENDS"))
@@ -1161,6 +1172,7 @@ void cmTargetTraceDependencies::Trace()
this->CheckCustomCommand(*cc);
}
}
+ this->CurrentEntry = 0;
}
//----------------------------------------------------------------------------
@@ -1188,6 +1200,12 @@ void cmTargetTraceDependencies::FollowName(std::string const& name)
}
if(cmSourceFile* sf = i->second)
{
+ // Record the dependency we just followed.
+ if(this->CurrentEntry)
+ {
+ this->CurrentEntry->Depends.push_back(sf);
+ }
+
this->QueueSource(sf);
}
}
@@ -1308,7 +1326,7 @@ cmTargetTraceDependencies
void cmTarget::TraceDependencies(const char* vsProjectFile)
{
// Use a helper object to trace the dependencies.
- cmTargetTraceDependencies tracer(this, vsProjectFile);
+ cmTargetTraceDependencies tracer(this, this->Internal.Get(), vsProjectFile);
tracer.Trace();
}
@@ -1336,13 +1354,31 @@ std::vector<cmSourceFile*> const& cmTarget::GetSourceFiles()
//----------------------------------------------------------------------------
void cmTarget::AddSourceFile(cmSourceFile* sf)
{
- if(this->SourceFileSet.insert(sf).second)
+ typedef cmTargetInternals::SourceEntriesType SourceEntriesType;
+ SourceEntriesType::iterator i = this->Internal->SourceEntries.find(sf);
+ if(i == this->Internal->SourceEntries.end())
{
+ typedef cmTargetInternals::SourceEntry SourceEntry;
+ SourceEntriesType::value_type entry(sf, SourceEntry());
+ i = this->Internal->SourceEntries.insert(entry).first;
this->SourceFiles.push_back(sf);
}
}
//----------------------------------------------------------------------------
+std::vector<cmSourceFile*> const*
+cmTarget::GetSourceDepends(cmSourceFile* sf)
+{
+ typedef cmTargetInternals::SourceEntriesType SourceEntriesType;
+ SourceEntriesType::iterator i = this->Internal->SourceEntries.find(sf);
+ if(i != this->Internal->SourceEntries.end())
+ {
+ return &i->second.Depends;
+ }
+ return 0;
+}
+
+//----------------------------------------------------------------------------
void cmTarget::AddSources(std::vector<std::string> const& srcs)
{
for(std::vector<std::string>::const_iterator i = srcs.begin();