ENH: try to better handle control-c during make Makefiles

This commit is contained in:
Bill Hoffman 2001-06-04 11:34:22 -04:00
parent a3cfcd9894
commit b6d823a7c1
2 changed files with 37 additions and 5 deletions

View File

@ -63,7 +63,8 @@ public:
m_Name(name), m_Name(name),
m_TempName(m_Name+".tmp"), m_TempName(m_Name+".tmp"),
m_Stream(m_TempName.c_str()), m_Stream(m_TempName.c_str()),
m_Copied(false) m_Copied(false),
m_AlwaysCopy(false)
{} {}
/** /**
@ -87,7 +88,11 @@ public:
* real file name to occur. * real file name to occur.
*/ */
void close() { this->DoCopy(); } void close() { this->DoCopy(); }
/**
* If always copy is true, then copy the file all the time without
* checking for differences. The default is false.
*/
bool SetAlwaysCopy(bool v) { m_AlwaysCopy = v; return v;}
private: private:
/** /**
* The name of the real file where output will be copied if it has changed. * The name of the real file where output will be copied if it has changed.
@ -110,14 +115,29 @@ private:
bool m_Copied; bool m_Copied;
/** /**
* Closes the temporary file and does the copy-if-different to the real file. * If always copy is true, then copy the file all the time without
* checking for differences. The default is false.
*/
bool m_AlwaysCopy;
/**
* Closes the temporary file and does the copy-if-different to the
* real file.
*/ */
void DoCopy() void DoCopy()
{ {
if(!m_Copied) if(!m_Copied)
{ {
m_Stream.close(); m_Stream.close();
cmSystemTools::CopyFileIfDifferent(m_TempName.c_str(), m_Name.c_str()); if(m_AlwaysCopy)
{
cmSystemTools::cmCopyFile(m_TempName.c_str(), m_Name.c_str());
}
else
{
cmSystemTools::CopyFileIfDifferent(m_TempName.c_str(),
m_Name.c_str());
}
cmSystemTools::RemoveFile(m_TempName.c_str()); cmSystemTools::RemoveFile(m_TempName.c_str());
m_Copied = true; m_Copied = true;
} }

View File

@ -45,6 +45,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "cmSourceFile.h" #include "cmSourceFile.h"
#include "cmMakeDepend.h" #include "cmMakeDepend.h"
#include "cmCacheManager.h" #include "cmCacheManager.h"
#include "cmGeneratedFileStream.h"
cmUnixMakefileGenerator::cmUnixMakefileGenerator() cmUnixMakefileGenerator::cmUnixMakefileGenerator()
{ {
@ -93,7 +94,12 @@ void cmUnixMakefileGenerator::OutputMakefile(const char* file)
cmSystemTools::MakeDirectory(i->c_str()); cmSystemTools::MakeDirectory(i->c_str());
} }
} }
std::ofstream fout(file); // Create a stream that writes to a temporary file
// then does a copy at the end. This is to allow users
// to hit control-c during the make of the makefile
cmGeneratedFileStream tempFile(file);
tempFile.SetAlwaysCopy(true);
std::ostream& fout = tempFile.GetStream();
if(!fout) if(!fout)
{ {
cmSystemTools::Error("Error can not open for write: ", file); cmSystemTools::Error("Error can not open for write: ", file);
@ -950,6 +956,12 @@ void cmUnixMakefileGenerator::OutputMakeRules(std::ostream& fout)
"${CMAKE_COMMAND}", "${CMAKE_COMMAND}",
0, 0,
"echo \"cmake might be out of date\""); "echo \"cmake might be out of date\"");
this->OutputMakeRule(fout,
"Rule to keep make from removing Makefiles "
"if control-C is hit during a run of cmake.",
".PRECIOUS",
"Makefile cmake.depends",
0);
} }