ENH: Converted vcproj file generation to use cmGeneratedFileStream for atomic replacement. Replaced the vcproj.cmake copy of the file with a simple vcproj.stamp timestamp file to preserve previous rerun-without-reload behavior.

This commit is contained in:
Brad King 2007-11-09 12:05:03 -05:00
parent c5b01a7daf
commit f9322d188b
2 changed files with 33 additions and 24 deletions

View File

@ -146,20 +146,21 @@ void cmGlobalVisualStudio8Generator::Generate()
// target. // target.
const char* no_main_dependency = 0; const char* no_main_dependency = 0;
const char* no_working_directory = 0; const char* no_working_directory = 0;
std::string stampName = cmake::GetCMakeFilesDirectoryPostSlash();
stampName += CMAKE_CHECK_BUILD_SYSTEM_TARGET ".vcproj.stamp";
mf->AddCustomCommandToOutput( mf->AddCustomCommandToOutput(
CMAKE_CHECK_BUILD_SYSTEM_TARGET ".vcproj.cmake", listFiles, stampName.c_str(), listFiles,
no_main_dependency, commandLines, "Checking Build System", no_main_dependency, commandLines, "Checking Build System",
no_working_directory, true); no_working_directory, true);
if(cmSourceFile* file = mf->GetSource(CMAKE_CHECK_BUILD_SYSTEM_TARGET std::string ruleName = stampName;
".vcproj.cmake.rule")) ruleName += ".rule";
if(cmSourceFile* file = mf->GetSource(ruleName.c_str()))
{ {
tgt->AddSourceFile(file); tgt->AddSourceFile(file);
} }
else else
{ {
cmSystemTools::Error("Error adding rule for " cmSystemTools::Error("Error adding rule for ", stampName.c_str());
CMAKE_CHECK_BUILD_SYSTEM_TARGET
".vcproj.cmake");
} }
} }
} }

View File

@ -24,6 +24,8 @@
#include "cmCacheManager.h" #include "cmCacheManager.h"
#include "cmake.h" #include "cmake.h"
#include "cmGeneratedFileStream.h"
#include <cmsys/System.h> #include <cmsys/System.h>
#include <ctype.h> // for isspace #include <ctype.h> // for isspace
@ -152,25 +154,35 @@ void cmLocalVisualStudio7Generator
fname += "/"; fname += "/";
fname += lname; fname += lname;
fname += ".vcproj"; fname += ".vcproj";
// save the name of the real dsp file
std::string realVCProj = fname; // Generate the project file and replace it atomically with
fname += ".cmake"; // copy-if-different. We use a separate timestamp so that the IDE
std::ofstream fout(fname.c_str()); // does not reload project files unnecessarily.
if(!fout) {
{ cmGeneratedFileStream fout(fname.c_str());
cmSystemTools::Error("Error Writing ", fname.c_str()); fout.SetCopyIfDifferent(true);
}
this->WriteVCProjFile(fout,lname,target); this->WriteVCProjFile(fout,lname,target);
fout.close(); }
// if the dsp file has changed, then write it.
cmSystemTools::CopyFileIfDifferent(fname.c_str(), realVCProj.c_str()); // Touch a timestamp file used to determine when the project file is
// out of date.
std::string stampName;
stampName = this->Makefile->GetStartOutputDirectory();
stampName += cmake::GetCMakeFilesDirectory();
cmSystemTools::MakeDirectory(stampName.c_str());
stampName += "/";
stampName += lname;
stampName += ".vcproj.stamp";
std::ofstream stamp(stampName.c_str());
stamp << "# CMake timestamp for " << lname << ".vcproj" << std::endl;
} }
void cmLocalVisualStudio7Generator::AddVCProjBuildRule(cmTarget& tgt) void cmLocalVisualStudio7Generator::AddVCProjBuildRule(cmTarget& tgt)
{ {
std::string dspname = tgt.GetName(); std::string stampName = cmake::GetCMakeFilesDirectoryPostSlash();
dspname += ".vcproj.cmake"; stampName += tgt.GetName();
stampName += ".vcproj.stamp";
const char* dsprule = const char* dsprule =
this->Makefile->GetRequiredDefinition("CMAKE_COMMAND"); this->Makefile->GetRequiredDefinition("CMAKE_COMMAND");
cmCustomCommandLine commandLine; cmCustomCommandLine commandLine;
@ -213,7 +225,7 @@ void cmLocalVisualStudio7Generator::AddVCProjBuildRule(cmTarget& tgt)
cmCustomCommandLines commandLines; cmCustomCommandLines commandLines;
commandLines.push_back(commandLine); commandLines.push_back(commandLine);
const char* no_working_directory = 0; const char* no_working_directory = 0;
this->Makefile->AddCustomCommandToOutput(dspname.c_str(), listFiles, this->Makefile->AddCustomCommandToOutput(stampName.c_str(), listFiles,
makefileIn.c_str(), commandLines, makefileIn.c_str(), commandLines,
comment.c_str(), comment.c_str(),
no_working_directory, true); no_working_directory, true);
@ -959,10 +971,6 @@ void cmLocalVisualStudio7Generator::WriteVCProjFile(std::ostream& fout,
static_cast<cmGlobalVisualStudio7Generator *> static_cast<cmGlobalVisualStudio7Generator *>
(this->GlobalGenerator)->GetConfigurations(); (this->GlobalGenerator)->GetConfigurations();
// trace the visual studio dependencies
std::string name = libName;
name += ".vcproj.cmake";
// We may be modifying the source groups temporarily, so make a copy. // We may be modifying the source groups temporarily, so make a copy.
std::vector<cmSourceGroup> sourceGroups = this->Makefile->GetSourceGroups(); std::vector<cmSourceGroup> sourceGroups = this->Makefile->GetSourceGroups();