Преглед на файлове

ENH: Add undocumented file(DIFFERENT) command

This new command will be used by generated installation scripts to
determine whether an already-installed export file has changed.
Brad King преди 17 години
родител
ревизия
f074d9f571
променени са 2 файла, в които са добавени 66 реда и са изтрити 0 реда
  1. 65 0
      Source/cmFileCommand.cxx
  2. 1 0
      Source/cmFileCommand.h

+ 65 - 0
Source/cmFileCommand.cxx

@@ -112,6 +112,10 @@ bool cmFileCommand
     {
     {
     return this->HandleInstallCommand(args);
     return this->HandleInstallCommand(args);
     }
     }
+  else if ( subCommand == "DIFFERENT" )
+    {
+    return this->HandleDifferentCommand(args);
+    }
   else if ( subCommand == "RPATH_CHANGE" || subCommand == "CHRPATH" )
   else if ( subCommand == "RPATH_CHANGE" || subCommand == "CHRPATH" )
     {
     {
     return this->HandleRPathChangeCommand(args);
     return this->HandleRPathChangeCommand(args);
@@ -830,6 +834,67 @@ bool cmFileCommand::HandleMakeDirectoryCommand(
   return true;
   return true;
 }
 }
 
 
+//----------------------------------------------------------------------------
+bool
+cmFileCommand::HandleDifferentCommand(std::vector<std::string> const& args)
+{
+  /*
+    FILE(DIFFERENT <variable> FILES <lhs> <rhs>)
+   */
+
+  // Evaluate arguments.
+  const char* file_lhs = 0;
+  const char* file_rhs = 0;
+  const char* var = 0;
+  enum Doing { DoingNone, DoingVar, DoingFileLHS, DoingFileRHS };
+  Doing doing = DoingVar;
+  for(unsigned int i=1; i < args.size(); ++i)
+    {
+    if(args[i] == "FILES")
+      {
+      doing = DoingFileLHS;
+      }
+    else if(doing == DoingVar)
+      {
+      var = args[i].c_str();
+      doing = DoingNone;
+      }
+    else if(doing == DoingFileLHS)
+      {
+      file_lhs = args[i].c_str();
+      doing = DoingFileRHS;
+      }
+    else if(doing == DoingFileRHS)
+      {
+      file_rhs = args[i].c_str();
+      doing = DoingNone;
+      }
+    else
+      {
+      cmOStringStream e;
+      e << "DIFFERENT given unknown argument " << args[i];
+      this->SetError(e.str().c_str());
+      return false;
+      }
+    }
+  if(!var)
+    {
+    this->SetError("DIFFERENT not given result variable name.");
+    return false;
+    }
+  if(!file_lhs || !file_rhs)
+    {
+    this->SetError("DIFFERENT not given FILES option with two file names.");
+    return false;
+    }
+
+  // Compare the files.
+  const char* result =
+    cmSystemTools::FilesDiffer(file_lhs, file_rhs)? "1" : "0";
+  this->Makefile->AddDefinition(var, result);
+  return true;
+}
+
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------
 // File installation helper class.
 // File installation helper class.
 struct cmFileInstaller
 struct cmFileInstaller

+ 1 - 0
Source/cmFileCommand.h

@@ -172,6 +172,7 @@ protected:
   bool HandleRPathChangeCommand(std::vector<std::string> const& args);
   bool HandleRPathChangeCommand(std::vector<std::string> const& args);
   bool HandleRPathCheckCommand(std::vector<std::string> const& args);
   bool HandleRPathCheckCommand(std::vector<std::string> const& args);
   bool HandleRPathRemoveCommand(std::vector<std::string> const& args);
   bool HandleRPathRemoveCommand(std::vector<std::string> const& args);
+  bool HandleDifferentCommand(std::vector<std::string> const& args);
 
 
   // file(INSTALL ...) related functions
   // file(INSTALL ...) related functions
   bool HandleInstallCommand(std::vector<std::string> const& args);
   bool HandleInstallCommand(std::vector<std::string> const& args);