summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Cedilnik <andy.cedilnik@kitware.com>2004-01-26 21:05:58 (GMT)
committerAndy Cedilnik <andy.cedilnik@kitware.com>2004-01-26 21:05:58 (GMT)
commitdae3e140ae6936ca376551cbdf77a896049c8dab (patch)
tree1ada62a27b8c7036e2f5047ca967302ecbdc58b3
parent09421a261c188763d3acfc7155d49c1c6fabc3ae (diff)
downloadCMake-dae3e140ae6936ca376551cbdf77a896049c8dab.zip
CMake-dae3e140ae6936ca376551cbdf77a896049c8dab.tar.gz
CMake-dae3e140ae6936ca376551cbdf77a896049c8dab.tar.bz2
ENH: Add unix style install in file command
-rw-r--r--Source/cmFileCommand.cxx139
-rw-r--r--Source/cmFileCommand.h6
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);
};