diff options
author | Sebastien Barre <sebastien.barre@kitware.com> | 2002-03-25 20:59:47 (GMT) |
---|---|---|
committer | Sebastien Barre <sebastien.barre@kitware.com> | 2002-03-25 20:59:47 (GMT) |
commit | 32fb77fff2a4a95e4f3d505e4e879c06713350d3 (patch) | |
tree | fcab0d021e5aaf0ef53727292116ea1f63a3ca8b /Source | |
parent | 41be7a401b78f1a46ecebd2c3dbefa38569406b8 (diff) | |
download | CMake-32fb77fff2a4a95e4f3d505e4e879c06713350d3.zip CMake-32fb77fff2a4a95e4f3d505e4e879c06713350d3.tar.gz CMake-32fb77fff2a4a95e4f3d505e4e879c06713350d3.tar.bz2 |
ENH: cmCopyFile ; the path to the destination file will be created ; second arg can be a directory.
Diffstat (limited to 'Source')
-rw-r--r-- | Source/ccommand.cxx | 6 | ||||
-rw-r--r-- | Source/cmSystemTools.cxx | 29 |
2 files changed, 30 insertions, 5 deletions
diff --git a/Source/ccommand.cxx b/Source/ccommand.cxx index 7cc5600..9036ddd 100644 --- a/Source/ccommand.cxx +++ b/Source/ccommand.cxx @@ -25,9 +25,9 @@ void CMakeCommandUsage(const char* program) errorStream << "cmake version " << cmMakefile::GetMajorVersion() << "." << cmMakefile::GetMinorVersion() << "\n"; errorStream << "Usage: " << program << " [command] [arguments ...]\n" - << " Available commands: \n" - << " copy file1 file2 - copy first file to the second one\n" - << " remove file1 file2 ... - remove the file(s)\n"; + << "Available commands: \n" + << " copy file destination - copy file to destination (either file or directory)\n" + << " remove file1 file2 ... - remove the file(s)\n"; errorStream << std::ends; cmSystemTools::Error(errorStream.str()); } diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 4d6b23c..5102fa2 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -872,6 +872,7 @@ void cmSystemTools::cmCopyFile(const char* source, { const int bufferSize = 4096; char buffer[bufferSize]; + std::ifstream fin(source, #ifdef _WIN32 std::ios::binary | @@ -883,7 +884,31 @@ void cmSystemTools::cmCopyFile(const char* source, source, "\""); return; } - std::ofstream fout(destination, + + // If destination is a directory, try to create a file with the same + // name as the source in that directory. + + const char* dest = destination; + + std::string new_destination; + if(cmSystemTools::FileExists(destination) && + cmSystemTools::FileIsDirectory(destination)) + { + new_destination = destination; + cmSystemTools::ConvertToUnixSlashes(new_destination); + new_destination += '/'; + std::string source_name = source; + new_destination += cmSystemTools::GetFilenameName(source_name); + dest = new_destination.c_str(); + } + + // Create destination directory + + std::string destination_dir = dest; + destination_dir = cmSystemTools::GetFilenamePath(destination_dir); + cmSystemTools::MakeDirectory(destination_dir.c_str()); + + std::ofstream fout(dest, #ifdef _WIN32 std::ios::binary | #endif @@ -891,7 +916,7 @@ void cmSystemTools::cmCopyFile(const char* source, if(!fout) { cmSystemTools::Error("CopyFile failed to open output file \"", - destination, "\""); + dest, "\""); return; } |