diff --git a/Source/ccommand.cxx b/Source/ccommand.cxx index 7cc560049..9036ddd0a 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 4d6b23c67..5102fa21e 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; }