Browse Source

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).
Robert Maynard 12 years ago
parent
commit
38571f2c94
1 changed files with 19 additions and 9 deletions
  1. 19 9
      Source/cmMakefile.cxx

+ 19 - 9
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