Ver código fonte

ENH: cmCopyFile ; the path to the destination file will be created ; second arg can be a directory.

Sebastien Barre 23 anos atrás
pai
commit
32fb77fff2
2 arquivos alterados com 30 adições e 5 exclusões
  1. 3 3
      Source/ccommand.cxx
  2. 27 2
      Source/cmSystemTools.cxx

+ 3 - 3
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());
 }

+ 27 - 2
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;
     }