|
|
@@ -20,6 +20,7 @@
|
|
|
|
|
|
#include <map>
|
|
|
#include <set>
|
|
|
+#include <queue>
|
|
|
#include <stdlib.h> // required for atof
|
|
|
|
|
|
|
|
|
@@ -35,6 +36,109 @@ void cmTarget::SetType(TargetType type)
|
|
|
}
|
|
|
|
|
|
|
|
|
+void cmTarget::TraceVSDependencies(std::string projFile,
|
|
|
+ cmMakefile *makefile)
|
|
|
+{
|
|
|
+ // get the classes from the source lists then add them to the groups
|
|
|
+ std::vector<cmSourceFile*> & classes = this->GetSourceFiles();
|
|
|
+ // use a deck to keep track of processed source files
|
|
|
+ std::queue<std::string> srcFilesToProcess;
|
|
|
+ std::set<std::string> srcFilesQueued;
|
|
|
+ std::string name;
|
|
|
+ for(std::vector<cmSourceFile*>::const_iterator i = classes.begin();
|
|
|
+ i != classes.end(); ++i)
|
|
|
+ {
|
|
|
+ std::string name = (*i)->GetSourceName();
|
|
|
+ if ((*i)->GetSourceExtension() != "rule")
|
|
|
+ {
|
|
|
+ name += ".";
|
|
|
+ name += (*i)->GetSourceExtension();
|
|
|
+ }
|
|
|
+ srcFilesToProcess.push(name);
|
|
|
+ srcFilesQueued.insert(name);
|
|
|
+ }
|
|
|
+ // add in the project file itself
|
|
|
+ srcFilesToProcess.push(projFile);
|
|
|
+ srcFilesQueued.insert(projFile);
|
|
|
+ // add in the library depends for cusotm targets
|
|
|
+ if (this->GetType() == cmTarget::UTILITY)
|
|
|
+ {
|
|
|
+ for (std::vector<cmCustomCommand>::iterator ic =
|
|
|
+ this->GetPostBuildCommands().begin();
|
|
|
+ ic != this->GetPostBuildCommands().end(); ++ic)
|
|
|
+ {
|
|
|
+ cmCustomCommand &c = *ic;
|
|
|
+ for (std::vector<std::string>::iterator i = c.GetDepends().begin();
|
|
|
+ i != c.GetDepends().end(); ++i)
|
|
|
+ {
|
|
|
+ srcFilesToProcess.push(*i);
|
|
|
+ srcFilesQueued.insert(name);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ while (!srcFilesToProcess.empty())
|
|
|
+ {
|
|
|
+ // is this source the output of a custom command
|
|
|
+ cmSourceFile* outsf =
|
|
|
+ makefile->GetSourceFileWithOutput(srcFilesToProcess.front().c_str());
|
|
|
+ if (outsf)
|
|
|
+ {
|
|
|
+ // is it not already in the target?
|
|
|
+ if (std::find(classes.begin(),classes.end(),outsf) == classes.end())
|
|
|
+ {
|
|
|
+ // then add the source to this target and add it to the queue
|
|
|
+ classes.push_back(outsf);
|
|
|
+ std::string name = outsf->GetSourceName();
|
|
|
+ if (outsf->GetSourceExtension() != "rule")
|
|
|
+ {
|
|
|
+ name += ".";
|
|
|
+ name += outsf->GetSourceExtension();
|
|
|
+ }
|
|
|
+ std::string temp =
|
|
|
+ cmSystemTools::GetFilenamePath(outsf->GetFullPath());
|
|
|
+ temp += "/";
|
|
|
+ temp += name;
|
|
|
+ // if it hasn't been processed
|
|
|
+ if (srcFilesQueued.find(temp) == srcFilesQueued.end())
|
|
|
+ {
|
|
|
+ srcFilesToProcess.push(temp);
|
|
|
+ srcFilesQueued.insert(temp);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // add its dependencies to the list to check
|
|
|
+ unsigned int i;
|
|
|
+ for (i = 0; i < outsf->GetCustomCommand()->GetDepends().size(); ++i)
|
|
|
+ {
|
|
|
+ std::string dep = cmSystemTools::GetFilenameName(
|
|
|
+ outsf->GetCustomCommand()->GetDepends()[i]);
|
|
|
+ if (cmSystemTools::GetFilenameLastExtension(dep) == ".exe")
|
|
|
+ {
|
|
|
+ dep = cmSystemTools::GetFilenameWithoutLastExtension(dep);
|
|
|
+ }
|
|
|
+ // watch for target dependencies,
|
|
|
+ std::string libPath = dep + "_CMAKE_PATH";
|
|
|
+ const char* cacheValue = makefile->GetDefinition(libPath.c_str());
|
|
|
+ if (cacheValue)
|
|
|
+ {
|
|
|
+ // add the depend as a utility on the target
|
|
|
+ this->AddUtility(dep.c_str());
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (srcFilesQueued.find(outsf->GetCustomCommand()->GetDepends()[i])
|
|
|
+ == srcFilesQueued.end())
|
|
|
+ {
|
|
|
+ srcFilesToProcess.push(outsf->GetCustomCommand()->GetDepends()[i]);
|
|
|
+ srcFilesQueued.insert(outsf->GetCustomCommand()->GetDepends()[i]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // finished with this SF move to the next
|
|
|
+ srcFilesToProcess.pop();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void cmTarget::GenerateSourceFilesFromSourceLists( cmMakefile &mf)
|
|
|
{
|
|
|
// this is only done for non install targets
|