|
|
@@ -21,7 +21,6 @@
|
|
|
#include "cmSourceFile.h"
|
|
|
#include "cmCacheManager.h"
|
|
|
#include "cmake.h"
|
|
|
-#include <queue>
|
|
|
|
|
|
cmLocalVisualStudio7Generator::cmLocalVisualStudio7Generator()
|
|
|
{
|
|
|
@@ -637,6 +636,7 @@ void cmLocalVisualStudio7Generator::OutputDefineFlags(std::ostream& fout)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
void cmLocalVisualStudio7Generator::WriteVCProjFile(std::ostream& fout,
|
|
|
const char *libName,
|
|
|
cmTarget &target)
|
|
|
@@ -654,97 +654,16 @@ void cmLocalVisualStudio7Generator::WriteVCProjFile(std::ostream& fout,
|
|
|
this->AddVCProjBuildRule();
|
|
|
}
|
|
|
|
|
|
+ // trace the visual studio dependencies
|
|
|
+ std::string name = libName;
|
|
|
+ name += ".vcproj.cmake";
|
|
|
+ target.TraceVSDependencies(name, m_Makefile);
|
|
|
+
|
|
|
// We may be modifying the source groups temporarily, so make a copy.
|
|
|
std::vector<cmSourceGroup> sourceGroups = m_Makefile->GetSourceGroups();
|
|
|
|
|
|
// get the classes from the source lists then add them to the groups
|
|
|
std::vector<cmSourceFile*> & classes = target.GetSourceFiles();
|
|
|
- // use a deck to keep track of processed source files
|
|
|
- std::queue<std::string> srcFilesToProcess;
|
|
|
- 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);
|
|
|
- }
|
|
|
- // add in the project file itself
|
|
|
- name = libName;
|
|
|
- name += ".vcproj.cmake";
|
|
|
- srcFilesToProcess.push(name);
|
|
|
- // add in the library depends for cusotm targets
|
|
|
- if (target.GetType() == cmTarget::UTILITY)
|
|
|
- {
|
|
|
- for (std::vector<cmCustomCommand>::iterator ic =
|
|
|
- target.GetPostBuildCommands().begin();
|
|
|
- ic != target.GetPostBuildCommands().end(); ++ic)
|
|
|
- {
|
|
|
- cmCustomCommand &c = *ic;
|
|
|
- for (std::vector<std::string>::iterator i = c.GetDepends().begin();
|
|
|
- i != c.GetDepends().end(); ++i)
|
|
|
- {
|
|
|
- srcFilesToProcess.push(*i);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- while (!srcFilesToProcess.empty())
|
|
|
- {
|
|
|
- // is this source the output of a custom command
|
|
|
- cmSourceFile* outsf =
|
|
|
- m_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;
|
|
|
- srcFilesToProcess.push(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 = m_Makefile->GetDefinition(libPath.c_str());
|
|
|
- if (cacheValue)
|
|
|
- {
|
|
|
- // add the depend as a utility on the target
|
|
|
- target.AddUtility(dep.c_str());
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- srcFilesToProcess.push(outsf->GetCustomCommand()->GetDepends()[i]);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- // finished with this SF move to the next
|
|
|
- srcFilesToProcess.pop();
|
|
|
- }
|
|
|
-
|
|
|
- // get the classes from the source lists then add them to the groups
|
|
|
for(std::vector<cmSourceFile*>::const_iterator i = classes.begin();
|
|
|
i != classes.end(); i++)
|
|
|
{
|
|
|
@@ -1089,7 +1008,8 @@ std::string cmLocalVisualStudio7Generator::EscapeForXML(const char* s)
|
|
|
std::string cmLocalVisualStudio7Generator::ConvertToXMLOutputPath(const char* path)
|
|
|
{
|
|
|
std::string ret = cmSystemTools::ConvertToOutputPath(path);
|
|
|
- return cmLocalVisualStudio7Generator::EscapeForXML(ret.c_str());
|
|
|
+ cmSystemTools::ReplaceString(ret, "\"", """);
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
std::string cmLocalVisualStudio7Generator::ConvertToXMLOutputPathSingle(const char* path)
|