Browse Source

Merge topic 'tar-zstd-compression'

53cb1f2d04 cmake: Teach cmake -E tar command, Zstandard compression

Acked-by: Kitware Robot <[email protected]>
Merge-request: !3357
Brad King 6 years ago
parent
commit
05af1770a0

+ 8 - 5
Help/manual/cmake.1.rst

@@ -552,20 +552,23 @@ Available commands are:
     Compress the resulting archive with bzip2.
   ``J``
     Compress the resulting archive with XZ.
-  ``--``
-    Stop interpreting options and treat all remaining arguments
-    as file names even if they start in ``-``.
+  ``--zstd``
+    Compress the resulting archive with Zstandard.
   ``--files-from=<file>``
     Read file names from the given file, one per line.
     Blank lines are ignored.  Lines may not start in ``-``
     except for ``--add-file=<name>`` to add files whose
     names start in ``-``.
-  ``--mtime=<date>``
-    Specify modification time recorded in tarball entries.
   ``--format=<format>``
     Specify the format of the archive to be created.
     Supported formats are: ``7zip``, ``gnutar``, ``pax``,
     ``paxr`` (restricted pax, default), and ``zip``.
+  ``--mtime=<date>``
+    Specify modification time recorded in tarball entries.
+  ``--``
+    Stop interpreting options and treat all remaining arguments
+    as file names, even if they start with ``-``.
+
 
 ``time <command> [<args>...]``
   Run command and display elapsed time.

+ 7 - 0
Help/release/dev/cmake-e-tar-zstd-support.rst

@@ -0,0 +1,7 @@
+Help/release/dev/cmake-e-tar-zstd-support
+-----------------------------------------
+
+* The :manual:`cmake(1)` ``-E tar`` tool now support Zstandard compression
+  algorithm with ``--zstd`` option. Zstandard was designed to give
+  a compression ratio comparable to that of the DEFLATE (zip) algorithm,
+  but faster, especially for decompression.

+ 7 - 0
Source/cmArchiveWrite.cxx

@@ -137,6 +137,13 @@ cmArchiveWrite::cmArchiveWrite(std::ostream& os, Compress c,
         return;
       }
       break;
+    case CompressZstd:
+      if (archive_write_add_filter_zstd(this->Archive) != ARCHIVE_OK) {
+        this->Error = "archive_write_add_filter_zstd: ";
+        this->Error += cm_archive_error_string(this->Archive);
+        return;
+      }
+      break;
   }
 #if !defined(_WIN32) || defined(__CYGWIN__)
   if (archive_read_disk_set_standard_lookup(this->Disk) != ARCHIVE_OK) {

+ 2 - 1
Source/cmArchiveWrite.h

@@ -49,7 +49,8 @@ public:
     CompressGZip,
     CompressBZip2,
     CompressLZMA,
-    CompressXZ
+    CompressXZ,
+    CompressZstd
   };
 
   /** Construct with output stream to which to write archive.  */

+ 3 - 0
Source/cmSystemTools.cxx

@@ -1557,6 +1557,9 @@ bool cmSystemTools::CreateTar(const char* outFileName,
     case TarCompressXZ:
       compress = cmArchiveWrite::CompressXZ;
       break;
+    case TarCompressZstd:
+      compress = cmArchiveWrite::CompressZstd;
+      break;
     case TarCompressNone:
       compress = cmArchiveWrite::CompressNone;
       break;

+ 1 - 0
Source/cmSystemTools.h

@@ -447,6 +447,7 @@ public:
     TarCompressGZip,
     TarCompressBZip2,
     TarCompressXZ,
+    TarCompressZstd,
     TarCompressNone
   };
 

+ 6 - 3
Source/cmcmd.cxx

@@ -1043,11 +1043,17 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string> const& args)
       std::vector<std::string> files;
       std::string mtime;
       std::string format;
+      cmSystemTools::cmTarCompression compress =
+        cmSystemTools::TarCompressNone;
+      int nCompress = 0;
       bool doing_options = true;
       for (auto const& arg : cmMakeRange(args).advance(4)) {
         if (doing_options && cmHasLiteralPrefix(arg, "--")) {
           if (arg == "--") {
             doing_options = false;
+          } else if (arg == "--zstd") {
+            compress = cmSystemTools::TarCompressZstd;
+            ++nCompress;
           } else if (cmHasLiteralPrefix(arg, "--mtime=")) {
             mtime = arg.substr(8);
           } else if (cmHasLiteralPrefix(arg, "--files-from=")) {
@@ -1075,10 +1081,7 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string> const& args)
         }
       }
       cmSystemTools::cmTarAction action = cmSystemTools::TarActionNone;
-      cmSystemTools::cmTarCompression compress =
-        cmSystemTools::TarCompressNone;
       bool verbose = false;
-      int nCompress = 0;
 
       for (auto flag : flags) {
         switch (flag) {

+ 1 - 0
Tests/RunCMake/CommandLineTar/RunCMakeTest.cmake

@@ -27,6 +27,7 @@ run_cmake(gnutar)
 run_cmake(gnutar-gz)
 run_cmake(pax)
 run_cmake(pax-xz)
+run_cmake(pax-zstd)
 run_cmake(paxr)
 run_cmake(paxr-bz2)
 run_cmake(zip)

+ 10 - 0
Tests/RunCMake/CommandLineTar/pax-zstd.cmake

@@ -0,0 +1,10 @@
+set(OUTPUT_NAME "test.tar.zstd")
+
+set(COMPRESSION_FLAGS cvf)
+set(COMPRESSION_OPTIONS --format=pax --zstd)
+
+set(DECOMPRESSION_FLAGS xvf)
+
+include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
+
+check_magic("28b52ffd0058" LIMIT 6 HEX)