diff options
author | Robert Maynard <robert.maynard@kitware.com> | 2013-08-28 16:49:53 (GMT) |
---|---|---|
committer | Robert Maynard <robert.maynard@kitware.com> | 2013-08-28 16:49:53 (GMT) |
commit | 0264eec9d32200c692ddfb756871ac4a4465863c (patch) | |
tree | 5153554d61bf381f02f6cdb30ba7a83f24fe16e0 /Source | |
parent | 8fbf39a471593e3607e67a8915a1ec0e150d3298 (diff) | |
download | CMake-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.cxx | 35 |
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('/'); |