diff options
author | Andy Cedilnik <andy.cedilnik@kitware.com> | 2004-02-13 02:44:24 (GMT) |
---|---|---|
committer | Andy Cedilnik <andy.cedilnik@kitware.com> | 2004-02-13 02:44:24 (GMT) |
commit | c44d0ef7333b274db929281aaba7b26146ebfac3 (patch) | |
tree | 57a31e38906bc2fece8ca61d61087ce453ee16ea /Source | |
parent | 41c8677a954111393bc43652d9451552c15e5ef1 (diff) | |
download | CMake-c44d0ef7333b274db929281aaba7b26146ebfac3.zip CMake-c44d0ef7333b274db929281aaba7b26146ebfac3.tar.gz CMake-c44d0ef7333b274db929281aaba7b26146ebfac3.tar.bz2 |
ENH: Add DESTDIR support
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmFileCommand.cxx | 91 |
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; } |