|
|
@@ -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;
|
|
|
+}
|