diff options
author | Andy Cedilnik <andy.cedilnik@kitware.com> | 2004-01-26 21:05:58 (GMT) |
---|---|---|
committer | Andy Cedilnik <andy.cedilnik@kitware.com> | 2004-01-26 21:05:58 (GMT) |
commit | dae3e140ae6936ca376551cbdf77a896049c8dab (patch) | |
tree | 1ada62a27b8c7036e2f5047ca967302ecbdc58b3 /Source | |
parent | 09421a261c188763d3acfc7155d49c1c6fabc3ae (diff) | |
download | CMake-dae3e140ae6936ca376551cbdf77a896049c8dab.zip CMake-dae3e140ae6936ca376551cbdf77a896049c8dab.tar.gz CMake-dae3e140ae6936ca376551cbdf77a896049c8dab.tar.bz2 |
ENH: Add unix style install in file command
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmFileCommand.cxx | 139 | ||||
-rw-r--r-- | Source/cmFileCommand.h | 6 |
2 files changed, 144 insertions, 1 deletions
diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx index 0f8d131..0aae2e0 100644 --- a/Source/cmFileCommand.cxx +++ b/Source/cmFileCommand.cxx @@ -18,6 +18,9 @@ #include "cmGlob.h" +#include <sys/types.h> +#include <sys/stat.h> + // cmLibraryCommand bool cmFileCommand::InitialPass(std::vector<std::string> const& args) { @@ -51,10 +54,14 @@ bool cmFileCommand::InitialPass(std::vector<std::string> const& args) { return this->HandleMakeDirectoryCommand(args); } + else if ( subCommand == "INSTALL" ) + { + return this->HandleInstallCommand(args); + } std::string e = "does not recognize sub-command "+subCommand; this->SetError(e.c_str()); - return true; + return false; } //---------------------------------------------------------------------------- @@ -218,3 +225,133 @@ bool cmFileCommand::HandleMakeDirectoryCommand(std::vector<std::string> const& a } return true; } + +//---------------------------------------------------------------------------- +bool cmFileCommand::HandleInstallCommand(std::vector<std::string> const& args) +{ + if ( args.size() < 6 ) + { + this->SetError("called with incorrect number of arguments"); + return false; + } + + std::string destination = ""; + std::string stype = "FILES"; + std::vector<std::string> files; + int itype = cmTarget::INSTALL_FILES; + + std::vector<std::string>::size_type i; + i++; // Get rid of subcommand + + std::string expr; + bool in_files = false; + for ( ; i != args.size(); ++i ) + { + const std::string* cstr = &args[i]; + if ( *cstr == "DESTINATION" && i < args.size()-1 ) + { + i++; + destination = args[i]; + in_files = false; + } + else if ( *cstr == "TYPE" && i < args.size()-1 ) + { + i++; + stype = args[i]; + in_files = false; + } + else if ( *cstr == "FILES" && !in_files) + { + in_files = true; + } + else if ( in_files ) + { + files.push_back(*cstr); + } + else + { + this->SetError("called with inappropriate arguments"); + return false; + } + } + + if ( destination.size() == 0 ) + { + this->SetError("called with inapropriate arguments. No DESTINATION provided."); + return false; + } + if ( files.size() == 0 ) + { + this->SetError("called with inapropriate arguments. No FILES provided."); + return false; + } + if ( stype == "EXECUTABLE" ) + { + itype = cmTarget::EXECUTABLE; + } + else if ( stype == "STATIC_LIBRARY" ) + { + itype = cmTarget::STATIC_LIBRARY; + } + else if ( stype == "SHARED_LIBRARY" ) + { + itype = cmTarget::SHARED_LIBRARY; + } + else if ( stype == "MODULE" ) + { + itype = cmTarget::MODULE_LIBRARY; + } + + for ( i = 0; i < files.size(); i ++ ) + { + std::cout << " " << files[i]; + } + std::cout << std::endl; + + if ( !cmSystemTools::FileExists(destination.c_str()) ) + { + if ( !cmSystemTools::MakeDirectory(destination.c_str()) ) + { + std::string errstring = "cannot create directory: " + destination + + ". Maybe need administrative privileges."; + this->SetError(errstring.c_str()); + return false; + } + } + if ( !cmSystemTools::FileIsDirectory(destination.c_str()) ) + { + std::string errstring = "found file: " + destination + + " where expecting directory with the same name."; + this->SetError(errstring.c_str()); + return false; + } + + for ( i = 0; i < files.size(); i ++ ) + { + std::string destfile = destination + "/" + cmSystemTools::GetFilenameName(files[i]); + + if ( !cmSystemTools::CopyFileAlways(files[i].c_str(), destination.c_str()) ) + { + std::string errstring = "cannot copy file: " + files[i] + + " to directory : " + destination + "."; + this->SetError(errstring.c_str()); + return false; + } + switch( itype ) + { + case cmTarget::MODULE_LIBRARY: + case cmTarget::SHARED_LIBRARY: + case cmTarget::EXECUTABLE: + + if ( !cmSystemTools::SetPermissions(destfile.c_str(), + S_IRUSR | S_IWUSR | S_IXUSR | + S_IRGRP | S_IXGRP | + S_IROTH | S_IXOTH ) ) + { + perror("problem doing chmod."); + } + } + } + + return true; +} diff --git a/Source/cmFileCommand.h b/Source/cmFileCommand.h index 5671dc4..60e25e8 100644 --- a/Source/cmFileCommand.h +++ b/Source/cmFileCommand.h @@ -47,6 +47,11 @@ public: virtual bool IsInherited() {return true;} /** + * This determines if the command is invoked when in script mode. + */ + virtual bool IsScriptable() { return true; } + + /** * The name of the command as specified in CMakeList.txt. */ virtual const char* GetName() { return "FILE";} @@ -100,6 +105,7 @@ protected: bool HandleReadCommand(std::vector<std::string> const& args); bool HandleGlobCommand(std::vector<std::string> const& args, bool recurse); bool HandleMakeDirectoryCommand(std::vector<std::string> const& args); + bool HandleInstallCommand(std::vector<std::string> const& args); }; |