ENH: Add unix style install in file command
This commit is contained in:
parent
09421a261c
commit
dae3e140ae
|
@ -18,6 +18,9 @@
|
||||||
|
|
||||||
#include "cmGlob.h"
|
#include "cmGlob.h"
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
// cmLibraryCommand
|
// cmLibraryCommand
|
||||||
bool cmFileCommand::InitialPass(std::vector<std::string> const& args)
|
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);
|
return this->HandleMakeDirectoryCommand(args);
|
||||||
}
|
}
|
||||||
|
else if ( subCommand == "INSTALL" )
|
||||||
|
{
|
||||||
|
return this->HandleInstallCommand(args);
|
||||||
|
}
|
||||||
|
|
||||||
std::string e = "does not recognize sub-command "+subCommand;
|
std::string e = "does not recognize sub-command "+subCommand;
|
||||||
this->SetError(e.c_str());
|
this->SetError(e.c_str());
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
@ -218,3 +225,133 @@ bool cmFileCommand::HandleMakeDirectoryCommand(std::vector<std::string> const& a
|
||||||
}
|
}
|
||||||
return true;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -46,6 +46,11 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual bool IsInherited() {return true;}
|
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.
|
* The name of the command as specified in CMakeList.txt.
|
||||||
*/
|
*/
|
||||||
|
@ -100,6 +105,7 @@ protected:
|
||||||
bool HandleReadCommand(std::vector<std::string> const& args);
|
bool HandleReadCommand(std::vector<std::string> const& args);
|
||||||
bool HandleGlobCommand(std::vector<std::string> const& args, bool recurse);
|
bool HandleGlobCommand(std::vector<std::string> const& args, bool recurse);
|
||||||
bool HandleMakeDirectoryCommand(std::vector<std::string> const& args);
|
bool HandleMakeDirectoryCommand(std::vector<std::string> const& args);
|
||||||
|
bool HandleInstallCommand(std::vector<std::string> const& args);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue