summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorAndy Cedilnik <andy.cedilnik@kitware.com>2004-02-13 02:44:24 (GMT)
committerAndy Cedilnik <andy.cedilnik@kitware.com>2004-02-13 02:44:24 (GMT)
commitc44d0ef7333b274db929281aaba7b26146ebfac3 (patch)
tree57a31e38906bc2fece8ca61d61087ce453ee16ea /Source
parent41c8677a954111393bc43652d9451552c15e5ef1 (diff)
downloadCMake-c44d0ef7333b274db929281aaba7b26146ebfac3.zip
CMake-c44d0ef7333b274db929281aaba7b26146ebfac3.tar.gz
CMake-c44d0ef7333b274db929281aaba7b26146ebfac3.tar.bz2
ENH: Add DESTDIR support
Diffstat (limited to 'Source')
-rw-r--r--Source/cmFileCommand.cxx91
1 files changed, 79 insertions, 12 deletions
diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx
index 5b55b23..18489cc 100644
--- a/Source/cmFileCommand.cxx
+++ b/Source/cmFileCommand.cxx
@@ -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 )
{
@@ -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 )
{
@@ -246,7 +248,10 @@ bool cmFileCommand::HandleInstallCommand(std::vector<std::string> const& args)
std::string destination = "";
std::string stype = "FILES";
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 = "";
int debug = 0;
if ( build_type )
@@ -259,7 +264,6 @@ bool cmFileCommand::HandleInstallCommand(std::vector<std::string> const& args)
}
}
-
std::vector<std::string> 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;
}
+
+ 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 )
{
- this->SetError("called with inapropriate arguments. No FILES provided.");
+ this->SetError(
+ "called with inapropriate arguments. No FILES provided.");
return false;
}
if ( stype == "EXECUTABLE" )
@@ -354,11 +416,13 @@ bool cmFileCommand::HandleInstallCommand(std::vector<std::string> const& args)
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 fname = cmSystemTools::GetFilenameName(ctarget);
std::string ext = cmSystemTools::GetFilenameExtension(ctarget);
- std::string fnamewe = cmSystemTools::GetFilenameWithoutExtension(ctarget);
+ std::string fnamewe
+ = cmSystemTools::GetFilenameWithoutExtension(ctarget);
switch( itype )
{
case cmTarget::MODULE_LIBRARY:
@@ -372,7 +436,8 @@ bool cmFileCommand::HandleInstallCommand(std::vector<std::string> const& args)
if ( extra_dir.size() > 0 )
{
cmOStringStream str;
- str << cmSystemTools::GetFilenamePath(ctarget) << "/" << extra_dir << "/"
+ str << cmSystemTools::GetFilenamePath(ctarget)
+ << "/" << extra_dir << "/"
<< fname;
ctarget = str.str();
}
@@ -381,7 +446,8 @@ bool cmFileCommand::HandleInstallCommand(std::vector<std::string> const& args)
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 +
" to directory : " + destination + ".";
@@ -415,7 +481,8 @@ bool cmFileCommand::HandleInstallCommand(std::vector<std::string> const& args)
{
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());
return false;
}