diff options
author | Brad King <brad.king@kitware.com> | 2009-01-07 19:16:35 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2009-01-07 19:16:35 (GMT) |
commit | f074d9f571d6dfab29c5fb097d7fa6a2236ff4af (patch) | |
tree | 96d33e8f3dd644bb63194c096bbb4e70e8986c1b /Source/cmFileCommand.cxx | |
parent | 254782ed7607db23bf65acc780f6c014eb16985c (diff) | |
download | CMake-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.cxx | 65 |
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 { |