summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorRobert Maynard <robert.maynard@kitware.com>2013-08-28 16:49:53 (GMT)
committerRobert Maynard <robert.maynard@kitware.com>2013-08-28 16:49:53 (GMT)
commit0264eec9d32200c692ddfb756871ac4a4465863c (patch)
tree5153554d61bf381f02f6cdb30ba7a83f24fe16e0 /Source
parent8fbf39a471593e3607e67a8915a1ec0e150d3298 (diff)
downloadCMake-0264eec9d32200c692ddfb756871ac4a4465863c.zip
CMake-0264eec9d32200c692ddfb756871ac4a4465863c.tar.gz
CMake-0264eec9d32200c692ddfb756871ac4a4465863c.tar.bz2
cmMakefile: Do not track configured files known to be temporary
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. Teach cmMakefile::FinalPass to stop tracking files that don't exist after we are finished generation.
Diffstat (limited to 'Source')
-rw-r--r--Source/cmMakefile.cxx35
1 files changed, 31 insertions, 4 deletions
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index 1f5c911..2506209 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -814,6 +814,18 @@ bool cmMakefile::NeedBackwardsCompatibility(unsigned int major,
}
}
+
+namespace
+{
+ struct file_exists
+ {
+ bool operator()(const std::string& path) const
+ {
+ return cmSystemTools::FileExists(path.c_str());
+ }
+ };
+}
+
void cmMakefile::FinalPass()
{
// do all the variable expansions here
@@ -827,6 +839,20 @@ void cmMakefile::FinalPass()
(*i)->FinalPass();
}
+ //go through all configured files and see which ones still exist.
+ //we don't want cmake to re-run if a configured file is created and deleted
+ //during processing as that would make it a transient file that can't
+ //influence the build process
+
+ //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() );
+ //we just have to erase all items at the back
+ this->OutputFiles.erase(new_end, this->OutputFiles.end() );
+
}
// Generate the output file
@@ -3371,11 +3397,12 @@ int cmMakefile::ConfigureFile(const char* infile, const char* outfile,
std::string sinfile = infile;
this->AddCMakeDependFile(sinfile);
cmSystemTools::ConvertToUnixSlashes(soutfile);
+
// Re-generate if non-temporary outputs are missing.
- if(soutfile.find("CMakeTmp") == soutfile.npos)
- {
- this->AddCMakeOutputFile(soutfile);
- }
+ //when we finalize the configuration we will remove all
+ //output files that now don't exist.
+ this->AddCMakeOutputFile(soutfile);
+
mode_t perm = 0;
cmSystemTools::GetPermissions(sinfile.c_str(), perm);
std::string::size_type pos = soutfile.rfind('/');