ENH: Add DESTDIR support
This commit is contained in:
parent
41c8677a95
commit
c44d0ef733
@ -202,7 +202,8 @@ bool cmFileCommand::HandleGlobCommand(std::vector<std::string> const& args,
|
|||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
bool cmFileCommand::HandleMakeDirectoryCommand(std::vector<std::string> const& args)
|
bool cmFileCommand::HandleMakeDirectoryCommand(
|
||||||
|
std::vector<std::string> const& args)
|
||||||
{
|
{
|
||||||
if(args.size() < 2 )
|
if(args.size() < 2 )
|
||||||
{
|
{
|
||||||
@ -235,7 +236,8 @@ bool cmFileCommand::HandleMakeDirectoryCommand(std::vector<std::string> const& a
|
|||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
bool cmFileCommand::HandleInstallCommand(std::vector<std::string> const& args)
|
bool cmFileCommand::HandleInstallCommand(
|
||||||
|
std::vector<std::string> const& args)
|
||||||
{
|
{
|
||||||
if ( args.size() < 6 )
|
if ( args.size() < 6 )
|
||||||
{
|
{
|
||||||
@ -246,7 +248,10 @@ bool cmFileCommand::HandleInstallCommand(std::vector<std::string> const& args)
|
|||||||
std::string destination = "";
|
std::string destination = "";
|
||||||
std::string stype = "FILES";
|
std::string stype = "FILES";
|
||||||
const char* build_type = m_Makefile->GetDefinition("BUILD_TYPE");
|
const char* build_type = m_Makefile->GetDefinition("BUILD_TYPE");
|
||||||
const char* debug_postfix = m_Makefile->GetDefinition("CMAKE_DEBUG_POSTFIX");
|
const char* debug_postfix
|
||||||
|
= m_Makefile->GetDefinition("CMAKE_DEBUG_POSTFIX");
|
||||||
|
const char* destdir = cmSystemTools::GetEnv("DESTDIR");
|
||||||
|
|
||||||
std::string extra_dir = "";
|
std::string extra_dir = "";
|
||||||
int debug = 0;
|
int debug = 0;
|
||||||
if ( build_type )
|
if ( build_type )
|
||||||
@ -259,7 +264,6 @@ bool cmFileCommand::HandleInstallCommand(std::vector<std::string> const& args)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::vector<std::string> files;
|
std::vector<std::string> files;
|
||||||
int itype = cmTarget::INSTALL_FILES;
|
int itype = cmTarget::INSTALL_FILES;
|
||||||
|
|
||||||
@ -303,14 +307,72 @@ bool cmFileCommand::HandleInstallCommand(std::vector<std::string> const& args)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( destination.size() == 0 )
|
if ( destination.size() < 2 )
|
||||||
{
|
{
|
||||||
this->SetError("called with inapropriate arguments. No DESTINATION provided.");
|
this->SetError("called with inapropriate arguments. "
|
||||||
|
"No DESTINATION provided or .");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( destdir && *destdir )
|
||||||
|
{
|
||||||
|
std::string sdestdir = destdir;
|
||||||
|
cmSystemTools::ConvertToUnixSlashes(sdestdir);
|
||||||
|
|
||||||
|
char ch1 = destination[0];
|
||||||
|
char ch2 = destination[1];
|
||||||
|
char ch3 = 0;
|
||||||
|
if ( destination.size() > 2 )
|
||||||
|
{
|
||||||
|
ch3 = destination[2];
|
||||||
|
}
|
||||||
|
int skip = 0;
|
||||||
|
if ( ch1 != '/' )
|
||||||
|
{
|
||||||
|
int relative = 0;
|
||||||
|
if ( ( ch1 >= 'a' && ch1 <= 'z' || ch1 >= 'a' && ch1 <= 'z' ) &&
|
||||||
|
ch2 == ':' )
|
||||||
|
{
|
||||||
|
// Assume windows
|
||||||
|
// let's do some destdir magic:
|
||||||
|
skip = 2;
|
||||||
|
if ( ch3 != '/' )
|
||||||
|
{
|
||||||
|
relative = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
relative = 1;
|
||||||
|
}
|
||||||
|
if ( relative )
|
||||||
|
{
|
||||||
|
// This is relative path on unix or windows. Since we are doing
|
||||||
|
// destdir, this case does not make sense.
|
||||||
|
this->SetError("called with relative DESTINATION. This "
|
||||||
|
"does not make sense when using DESTDIR. Specify "
|
||||||
|
"absolute path or remove DESTDIR environment variable.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( ch2 == '/' )
|
||||||
|
{
|
||||||
|
// looks like a network path.
|
||||||
|
this->SetError("called with network path DESTINATION. This "
|
||||||
|
"does not make sense when using DESTDIR. Specify local "
|
||||||
|
"absolute path or remove DESTDIR environment variable.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
destination = sdestdir + (destination.c_str() + skip);
|
||||||
|
}
|
||||||
|
|
||||||
if ( files.size() == 0 )
|
if ( files.size() == 0 )
|
||||||
{
|
{
|
||||||
this->SetError("called with inapropriate arguments. No FILES provided.");
|
this->SetError(
|
||||||
|
"called with inapropriate arguments. No FILES provided.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if ( stype == "EXECUTABLE" )
|
if ( stype == "EXECUTABLE" )
|
||||||
@ -354,11 +416,13 @@ bool cmFileCommand::HandleInstallCommand(std::vector<std::string> const& args)
|
|||||||
|
|
||||||
for ( i = 0; i < files.size(); i ++ )
|
for ( i = 0; i < files.size(); i ++ )
|
||||||
{
|
{
|
||||||
std::string destfile = destination + "/" + cmSystemTools::GetFilenameName(files[i]);
|
std::string destfile
|
||||||
|
= destination + "/" + cmSystemTools::GetFilenameName(files[i]);
|
||||||
std::string ctarget = files[i].c_str();
|
std::string ctarget = files[i].c_str();
|
||||||
std::string fname = cmSystemTools::GetFilenameName(ctarget);
|
std::string fname = cmSystemTools::GetFilenameName(ctarget);
|
||||||
std::string ext = cmSystemTools::GetFilenameExtension(ctarget);
|
std::string ext = cmSystemTools::GetFilenameExtension(ctarget);
|
||||||
std::string fnamewe = cmSystemTools::GetFilenameWithoutExtension(ctarget);
|
std::string fnamewe
|
||||||
|
= cmSystemTools::GetFilenameWithoutExtension(ctarget);
|
||||||
switch( itype )
|
switch( itype )
|
||||||
{
|
{
|
||||||
case cmTarget::MODULE_LIBRARY:
|
case cmTarget::MODULE_LIBRARY:
|
||||||
@ -372,7 +436,8 @@ bool cmFileCommand::HandleInstallCommand(std::vector<std::string> const& args)
|
|||||||
if ( extra_dir.size() > 0 )
|
if ( extra_dir.size() > 0 )
|
||||||
{
|
{
|
||||||
cmOStringStream str;
|
cmOStringStream str;
|
||||||
str << cmSystemTools::GetFilenamePath(ctarget) << "/" << extra_dir << "/"
|
str << cmSystemTools::GetFilenamePath(ctarget)
|
||||||
|
<< "/" << extra_dir << "/"
|
||||||
<< fname;
|
<< fname;
|
||||||
ctarget = str.str();
|
ctarget = str.str();
|
||||||
}
|
}
|
||||||
@ -381,7 +446,8 @@ bool cmFileCommand::HandleInstallCommand(std::vector<std::string> const& args)
|
|||||||
|
|
||||||
if ( cmSystemTools::FileExists(ctarget.c_str()) )
|
if ( cmSystemTools::FileExists(ctarget.c_str()) )
|
||||||
{
|
{
|
||||||
if ( !cmSystemTools::CopyFileAlways(ctarget.c_str(), destination.c_str()) )
|
if ( !cmSystemTools::CopyFileAlways(ctarget.c_str(),
|
||||||
|
destination.c_str()) )
|
||||||
{
|
{
|
||||||
std::string errstring = "cannot copy file: " + ctarget +
|
std::string errstring = "cannot copy file: " + ctarget +
|
||||||
" to directory : " + destination + ".";
|
" to directory : " + destination + ".";
|
||||||
@ -415,7 +481,8 @@ bool cmFileCommand::HandleInstallCommand(std::vector<std::string> const& args)
|
|||||||
{
|
{
|
||||||
if ( !optional )
|
if ( !optional )
|
||||||
{
|
{
|
||||||
std::string errstring = "cannot find file: " + ctarget + " to install.";
|
std::string errstring = "cannot find file: " +
|
||||||
|
ctarget + " to install.";
|
||||||
this->SetError(errstring.c_str());
|
this->SetError(errstring.c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user