Просмотр исходного кода

ENH: Move implementation of configure_file to cmMakefile, so that other classes can use it

Andy Cedilnik 22 лет назад
Родитель
Сommit
3f752ea4cd
3 измененных файлов с 79 добавлено и 53 удалено
  1. 5 53
      Source/cmConfigureFileCommand.cxx
  2. 68 0
      Source/cmMakefile.cxx
  3. 6 0
      Source/cmMakefile.h

+ 5 - 53
Source/cmConfigureFileCommand.cxx

@@ -72,59 +72,11 @@ void cmConfigureFileCommand::FinalPass()
 
 void cmConfigureFileCommand::ConfigureFile()
 {
-  m_Makefile->AddCMakeDependFile(m_InputFile.c_str());
-  cmSystemTools::ConvertToUnixSlashes(m_OuputFile);
-  mode_t perm = 0;
-  cmSystemTools::GetPermissions(m_InputFile.c_str(), perm);
-  std::string::size_type pos = m_OuputFile.rfind('/');
-  if(pos != std::string::npos)
-    {
-    std::string path = m_OuputFile.substr(0, pos);
-    cmSystemTools::MakeDirectory(path.c_str());
-    }
-  
-  if(m_CopyOnly)
-    {
-    cmSystemTools::CopyFileIfDifferent(m_InputFile.c_str(),
-                                       m_OuputFile.c_str());
-    }
-  else
-    {
-    std::string tempOutputFile = m_OuputFile;
-    tempOutputFile += ".tmp";
-    std::ofstream fout(tempOutputFile.c_str());
-    if(!fout)
-      {
-      cmSystemTools::Error("Could not open file for write in copy operatation ", 
-                           tempOutputFile.c_str());
-      return;
-      }
-    std::ifstream fin(m_InputFile.c_str());
-    if(!fin)
-      {
-      cmSystemTools::Error("Could not open file for read in copy operatation ",
-                           m_InputFile.c_str());
-      return;
-      }
-
-    // now copy input to output and expand variables in the
-    // input file at the same time
-    std::string inLine;
-    std::string outLine;
-    while( cmSystemTools::GetLineFromStream(fin, inLine) )
-      {
-      outLine = "";
-      m_Makefile->ConfigureString(inLine, outLine, m_AtOnly, m_EscapeQuotes);
-      fout << outLine.c_str() << "\n";
-      }
-    // close the files before attempting to copy
-    fin.close();
-    fout.close();
-    cmSystemTools::CopyFileIfDifferent(tempOutputFile.c_str(),
-      m_OuputFile.c_str());
-    cmSystemTools::RemoveFile(tempOutputFile.c_str());
-    cmSystemTools::SetPermissions(m_OuputFile.c_str(), perm);
-    }
+  m_Makefile->ConfigureFile(m_InputFile.c_str(),
+    m_OuputFile.c_str(),
+    m_CopyOnly,
+    m_AtOnly,
+    m_EscapeQuotes);
 }
 
 

+ 68 - 0
Source/cmMakefile.cxx

@@ -2269,3 +2269,71 @@ void cmMakefile::ConfigureString(const std::string& input,
   this->ExpandVariablesInString(output, escapeQuotes, atOnly);
   this->RemoveVariablesInString(output, atOnly);
 }
+
+int cmMakefile::ConfigureFile(const char* infile, const char* outfile, 
+  int copyonly, int atOnly, int escapeQuotes)
+{
+  std::string soutfile = outfile;
+  std::string sinfile = infile;
+  this->AddCMakeDependFile(infile);
+  cmSystemTools::ConvertToUnixSlashes(soutfile);
+  mode_t perm = 0;
+  cmSystemTools::GetPermissions(sinfile.c_str(), perm);
+  std::string::size_type pos = soutfile.rfind('/');
+  if(pos != std::string::npos)
+    {
+    std::string path = soutfile.substr(0, pos);
+    cmSystemTools::MakeDirectory(path.c_str());
+    }
+  
+  if(copyonly)
+    {
+    if ( !cmSystemTools::CopyFileIfDifferent(sinfile.c_str(),
+                                       soutfile.c_str()))
+      {
+      return 0;
+      }
+    }
+  else
+    {
+    std::string tempOutputFile = soutfile;
+    tempOutputFile += ".tmp";
+    std::ofstream fout(tempOutputFile.c_str());
+    if(!fout)
+      {
+      cmSystemTools::Error(
+        "Could not open file for write in copy operatation ", 
+                           tempOutputFile.c_str());
+      return 0;
+      }
+    std::ifstream fin(sinfile.c_str());
+    if(!fin)
+      {
+      cmSystemTools::Error("Could not open file for read in copy operatation ",
+                           sinfile.c_str());
+      return 0;
+      }
+
+    // now copy input to output and expand variables in the
+    // input file at the same time
+    std::string inLine;
+    std::string outLine;
+    while( cmSystemTools::GetLineFromStream(fin, inLine) )
+      {
+      outLine = "";
+      this->ConfigureString(inLine, outLine, atOnly, escapeQuotes);
+      fout << outLine.c_str() << "\n";
+      }
+    // close the files before attempting to copy
+    fin.close();
+    fout.close();
+    cmSystemTools::CopyFileIfDifferent(tempOutputFile.c_str(),
+      soutfile.c_str());
+    cmSystemTools::RemoveFile(tempOutputFile.c_str());
+    cmSystemTools::SetPermissions(soutfile.c_str(), perm);
+    }
+  return 1;
+}
+
+
+

+ 6 - 0
Source/cmMakefile.h

@@ -629,6 +629,12 @@ public:
    * Return a location of a file in cmake or custom modules directory
    */
   std::string GetModulesFile(const char* name);
+
+  /**
+   * Copy file but change lines acording to ConfigureString
+   */
+  int ConfigureFile(const char* infile, const char* outfile, 
+    int copyonly, int atOnly, int escapeQuotes);
   
 protected:
   // add link libraries and directories to the target