diff options
author | Bartosz Kosiorek <gang65@poczta.onet.pl> | 2019-03-11 22:26:04 (GMT) |
---|---|---|
committer | Bartosz Kosiorek <gang65@poczta.onet.pl> | 2019-05-22 01:46:55 (GMT) |
commit | 53cb1f2d04bc9ca7bd50bd3b1a60dc933eab0777 (patch) | |
tree | c0c9a75e128ad3962065264948f41c16a9d7296b | |
parent | 0bf53483295a4b7de358e8b85ad44866d89633c5 (diff) | |
download | CMake-53cb1f2d04bc9ca7bd50bd3b1a60dc933eab0777.zip CMake-53cb1f2d04bc9ca7bd50bd3b1a60dc933eab0777.tar.gz CMake-53cb1f2d04bc9ca7bd50bd3b1a60dc933eab0777.tar.bz2 |
cmake: Teach cmake -E tar command, Zstandard compression
Fixes #18657
-rw-r--r-- | Help/manual/cmake.1.rst | 13 | ||||
-rw-r--r-- | Help/release/dev/cmake-e-tar-zstd-support.rst | 7 | ||||
-rw-r--r-- | Source/cmArchiveWrite.cxx | 7 | ||||
-rw-r--r-- | Source/cmArchiveWrite.h | 3 | ||||
-rw-r--r-- | Source/cmSystemTools.cxx | 3 | ||||
-rw-r--r-- | Source/cmSystemTools.h | 1 | ||||
-rw-r--r-- | Source/cmcmd.cxx | 9 | ||||
-rw-r--r-- | Tests/RunCMake/CommandLineTar/RunCMakeTest.cmake | 1 | ||||
-rw-r--r-- | Tests/RunCMake/CommandLineTar/pax-zstd.cmake | 10 |
9 files changed, 45 insertions, 9 deletions
diff --git a/Help/manual/cmake.1.rst b/Help/manual/cmake.1.rst index df0d4c5..eddc3cb 100644 --- a/Help/manual/cmake.1.rst +++ b/Help/manual/cmake.1.rst @@ -546,20 +546,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. diff --git a/Help/release/dev/cmake-e-tar-zstd-support.rst b/Help/release/dev/cmake-e-tar-zstd-support.rst new file mode 100644 index 0000000..e3488b5 --- /dev/null +++ b/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. diff --git a/Source/cmArchiveWrite.cxx b/Source/cmArchiveWrite.cxx index 177ba02..359d57a 100644 --- a/Source/cmArchiveWrite.cxx +++ b/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) { diff --git a/Source/cmArchiveWrite.h b/Source/cmArchiveWrite.h index 1f23dae..9ea88d3 100644 --- a/Source/cmArchiveWrite.h +++ b/Source/cmArchiveWrite.h @@ -49,7 +49,8 @@ public: CompressGZip, CompressBZip2, CompressLZMA, - CompressXZ + CompressXZ, + CompressZstd }; /** Construct with output stream to which to write archive. */ diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 545e6c5..4ba04ed 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -1614,6 +1614,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; diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h index d145d47..64d6d7a 100644 --- a/Source/cmSystemTools.h +++ b/Source/cmSystemTools.h @@ -451,6 +451,7 @@ public: TarCompressGZip, TarCompressBZip2, TarCompressXZ, + TarCompressZstd, TarCompressNone }; diff --git a/Source/cmcmd.cxx b/Source/cmcmd.cxx index 3c75957..e1b6f48 100644 --- a/Source/cmcmd.cxx +++ b/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) { diff --git a/Tests/RunCMake/CommandLineTar/RunCMakeTest.cmake b/Tests/RunCMake/CommandLineTar/RunCMakeTest.cmake index 5deb110..4ed9535 100644 --- a/Tests/RunCMake/CommandLineTar/RunCMakeTest.cmake +++ b/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) diff --git a/Tests/RunCMake/CommandLineTar/pax-zstd.cmake b/Tests/RunCMake/CommandLineTar/pax-zstd.cmake new file mode 100644 index 0000000..c2a304d --- /dev/null +++ b/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) |