summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorRobert Maynard <robert.maynard@kitware.com>2013-09-03 19:31:12 (GMT)
committerBrad King <brad.king@kitware.com>2013-09-09 14:58:21 (GMT)
commit38571f2c9446343a652cfdccea636028abd9f7aa (patch)
tree4424f3f80f76e37e56a39e59242387e402aaf724 /Source
parent0264eec9d32200c692ddfb756871ac4a4465863c (diff)
downloadCMake-38571f2c9446343a652cfdccea636028abd9f7aa.zip
CMake-38571f2c9446343a652cfdccea636028abd9f7aa.tar.gz
CMake-38571f2c9446343a652cfdccea636028abd9f7aa.tar.bz2
cmMakefile: Do not track CMake temporary files.
Since commit ad502502 (cmMakefile: Track configured files so we can regenerate them, 2013-06-18) cmMakefile::ConfigureFile records the configured file as an output file generated by CMake. The intention is that for make and ninja we can re-run CMake when one of the files it generates goes missing. However, files configured temporarily in CMakeTmp directories by Check* modules do not live past the CMake invocation. We have to also track input files to the configure command. In theory the input to a configure command could it self be a file that is going to be deleted later (output from a custom command or configure_file).
Diffstat (limited to 'Source')
-rw-r--r--Source/cmMakefile.cxx28
1 files changed, 19 insertions, 9 deletions
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index 2506209..cada13a 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -817,12 +817,13 @@ bool cmMakefile::NeedBackwardsCompatibility(unsigned int major,
namespace
{
- struct file_exists
+ struct file_not_persistent
{
bool operator()(const std::string& path) const
- {
- return cmSystemTools::FileExists(path.c_str());
- }
+ {
+ return !(path.find("CMakeTmp") == path.npos &&
+ cmSystemTools::FileExists(path.c_str()));
+ }
};
}
@@ -846,13 +847,22 @@ void cmMakefile::FinalPass()
//remove_if will move all items that don't have a valid file name to the
//back of the vector
- std::vector<std::string>::iterator new_end = std::remove_if(
- this->OutputFiles.begin(),
- this->OutputFiles.end(),
- file_exists() );
+ std::vector<std::string>::iterator new_output_files_end = std::remove_if(
+ this->OutputFiles.begin(),
+ this->OutputFiles.end(),
+ file_not_persistent() );
//we just have to erase all items at the back
- this->OutputFiles.erase(new_end, this->OutputFiles.end() );
+ this->OutputFiles.erase(new_output_files_end, this->OutputFiles.end() );
+
+ //if a configured file is used as input for another configured file,
+ //and then deleted it will show up in the input list files so we
+ //need to scan those too
+ std::vector<std::string>::iterator new_list_files_end = std::remove_if(
+ this->ListFiles.begin(),
+ this->ListFiles.end(),
+ file_not_persistent() );
+ this->ListFiles.erase(new_list_files_end, this->ListFiles.end() );
}
// Generate the output file