From 38571f2c9446343a652cfdccea636028abd9f7aa Mon Sep 17 00:00:00 2001 From: Robert Maynard Date: Tue, 3 Sep 2013 15:31:12 -0400 Subject: 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). --- Source/cmMakefile.cxx | 28 +++++++++++++++++++--------- 1 file 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::iterator new_end = std::remove_if( - this->OutputFiles.begin(), - this->OutputFiles.end(), - file_exists() ); + std::vector::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::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 -- cgit v0.12