Explorar o código

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.
Robert Maynard %!s(int64=12) %!d(string=hai) anos
pai
achega
0264eec9d3
Modificáronse 1 ficheiros con 31 adicións e 4 borrados
  1. 31 4
      Source/cmMakefile.cxx

+ 31 - 4
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('/');