summaryrefslogtreecommitdiffstats
path: root/Source/cmFileCommand.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2009-01-07 19:16:35 (GMT)
committerBrad King <brad.king@kitware.com>2009-01-07 19:16:35 (GMT)
commitf074d9f571d6dfab29c5fb097d7fa6a2236ff4af (patch)
tree96d33e8f3dd644bb63194c096bbb4e70e8986c1b /Source/cmFileCommand.cxx
parent254782ed7607db23bf65acc780f6c014eb16985c (diff)
downloadCMake-f074d9f571d6dfab29c5fb097d7fa6a2236ff4af.zip
CMake-f074d9f571d6dfab29c5fb097d7fa6a2236ff4af.tar.gz
CMake-f074d9f571d6dfab29c5fb097d7fa6a2236ff4af.tar.bz2
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.
Diffstat (limited to 'Source/cmFileCommand.cxx')
-rw-r--r--Source/cmFileCommand.cxx65
1 files changed, 65 insertions, 0 deletions
diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx
index a101435..78fc088 100644
--- a/Source/cmFileCommand.cxx
+++ b/Source/cmFileCommand.cxx
@@ -112,6 +112,10 @@ bool cmFileCommand
{
return this->HandleInstallCommand(args);
}
+ else if ( subCommand == "DIFFERENT" )
+ {
+ return this->HandleDifferentCommand(args);
+ }
else if ( subCommand == "RPATH_CHANGE" || subCommand == "CHRPATH" )
{
return this->HandleRPathChangeCommand(args);
@@ -831,6 +835,67 @@ bool cmFileCommand::HandleMakeDirectoryCommand(
}
//----------------------------------------------------------------------------
+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.
struct cmFileInstaller
{