mirror of
https://gitlab.kitware.com/cmake/cmake.git
synced 2026-09-25 04:09:36 +03:00
file(ARCHIVE_CREATE): Add controls for zip and 7z compression method/level
Fixes: #27463
This commit is contained in:
@@ -966,6 +966,12 @@ Archiving
|
||||
|
||||
This is an alias for ``XZ``.
|
||||
|
||||
* ``PPMd``
|
||||
|
||||
.. versionadded:: 4.3
|
||||
|
||||
This compression method is only supported by the ``7zip`` archive format.
|
||||
|
||||
* ``XZ``
|
||||
* ``Zstd``
|
||||
|
||||
@@ -973,6 +979,10 @@ Archiving
|
||||
With ``FORMAT`` set to ``raw``, only one file will be compressed
|
||||
with the compression type specified by ``COMPRESSION``.
|
||||
|
||||
.. versionadded:: 4.3
|
||||
|
||||
The ``7zip`` and ``zip`` formats support changing the default compression.
|
||||
|
||||
``COMPRESSION_LEVEL <compression-level>``
|
||||
.. versionadded:: 3.19
|
||||
|
||||
@@ -981,10 +991,19 @@ Archiving
|
||||
default being 0. The ``COMPRESSION`` option must be present when
|
||||
``COMPRESSION_LEVEL`` is given.
|
||||
|
||||
The value ``0`` is used to specify the default compression level.
|
||||
It is selected automatically by the archive library backend and
|
||||
not directly set by CMake itself. The default compression level
|
||||
may vary between archive formats, platforms, etc.
|
||||
|
||||
.. versionadded:: 3.26
|
||||
The ``<compression-level>`` of the ``Zstd`` algorithm can be set
|
||||
between 0-19.
|
||||
|
||||
.. versionadded:: 4.3
|
||||
The ``<compression-level>`` can be specified for the ``7zip`` and ``zip``
|
||||
formats too. The ``Zstd`` algorithm compression level can be set between 0-19, except for ``zip`` format.
|
||||
|
||||
``MTIME <mtime>``
|
||||
Specify the modification time recorded in tarball entries.
|
||||
|
||||
|
||||
@@ -1520,6 +1520,11 @@ Available commands are:
|
||||
The ``<compression-level>`` of the ``Zstd`` algorithm can be set
|
||||
between ``0`` and ``19``, except for the ``zip`` format.
|
||||
|
||||
The value ``0`` is used to specify the default compression level.
|
||||
It is selected automatically by the archive library backend and
|
||||
not directly set by CMake itself. The default compression level
|
||||
may vary between archive formats, platforms, etc.
|
||||
|
||||
.. option:: --cmake-tar-threads=<number>
|
||||
|
||||
.. versionadded:: 4.3
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
file-ARCHIVE_CREATE-7z-zip-algorithms
|
||||
-------------------------------------
|
||||
|
||||
* The :command:`file(ARCHIVE_CREATE)` command's ``COMPRESSION`` and
|
||||
``COMPRESSION_LEVEL`` options can be used for ``7zip`` and ``zip`` formats.
|
||||
* The :command:`file(ARCHIVE_CREATE)` command's ``COMPRESSION`` option,
|
||||
supports ``PPMd`` compression algorithm. It can be used for ``7zip`` format only.
|
||||
+16
-14
@@ -3714,15 +3714,6 @@ bool HandleArchiveCreateCommand(std::vector<std::string> const& args,
|
||||
return false;
|
||||
}
|
||||
|
||||
char const* zipFileFormats[] = { "7zip", "zip" };
|
||||
if (!parsedArgs.Compression.empty() &&
|
||||
cm::contains(zipFileFormats, parsedArgs.Format)) {
|
||||
status.SetError(cmStrCat("archive format ", parsedArgs.Format,
|
||||
" does not support COMPRESSION arguments"));
|
||||
cmSystemTools::SetFatalErrorOccurred();
|
||||
return false;
|
||||
}
|
||||
|
||||
static std::map<std::string, cmSystemTools::cmTarCompression>
|
||||
compressionTypeMap = { { "None", cmSystemTools::TarCompressNone },
|
||||
{ "BZip2", cmSystemTools::TarCompressBZip2 },
|
||||
@@ -3730,10 +3721,11 @@ bool HandleArchiveCreateCommand(std::vector<std::string> const& args,
|
||||
{ "GZip", cmSystemTools::TarCompressGZip },
|
||||
{ "LZMA", cmSystemTools::TarCompressLZMA },
|
||||
{ "LZMA2", cmSystemTools::TarCompressXZ },
|
||||
{ "PPMd", cmSystemTools::TarCompressPPMd },
|
||||
{ "XZ", cmSystemTools::TarCompressXZ },
|
||||
{ "Zstd", cmSystemTools::TarCompressZstd } };
|
||||
|
||||
cmSystemTools::cmTarCompression compress = cmSystemTools::TarCompressNone;
|
||||
cmSystemTools::cmTarCompression compress = cmSystemTools::TarCompressAuto;
|
||||
auto typeIt = compressionTypeMap.find(parsedArgs.Compression);
|
||||
if (typeIt != compressionTypeMap.end()) {
|
||||
compress = typeIt->second;
|
||||
@@ -3744,10 +3736,19 @@ bool HandleArchiveCreateCommand(std::vector<std::string> const& args,
|
||||
return false;
|
||||
}
|
||||
|
||||
if (compress == cmSystemTools::TarCompressPPMd &&
|
||||
parsedArgs.Format != "7zip") {
|
||||
status.SetError(cmStrCat("PPMd compression is not supported for ",
|
||||
parsedArgs.Format, " format"));
|
||||
cmSystemTools::SetFatalErrorOccurred();
|
||||
return false;
|
||||
}
|
||||
|
||||
int compressionLevel = 0;
|
||||
constexpr int minCompressionLevel = 0;
|
||||
int maxCompressionLevel = 9;
|
||||
if (compress == cmSystemTools::TarCompressZstd) {
|
||||
if (compress == cmSystemTools::TarCompressZstd &&
|
||||
parsedArgs.Format != "zip") {
|
||||
maxCompressionLevel = 19;
|
||||
}
|
||||
|
||||
@@ -3772,9 +3773,10 @@ bool HandleArchiveCreateCommand(std::vector<std::string> const& args,
|
||||
return false;
|
||||
}
|
||||
if (compress == cmSystemTools::TarCompressNone) {
|
||||
status.SetError(cmStrCat("compression level is not supported for "
|
||||
"compression \"None\"",
|
||||
parsedArgs.Compression));
|
||||
status.SetError(
|
||||
cmStrCat("compression level is not supported for "
|
||||
"compression \"None\". Provided compression level: ",
|
||||
parsedArgs.CompressionLevel));
|
||||
cmSystemTools::SetFatalErrorOccurred();
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -2412,6 +2412,9 @@ bool cmSystemTools::CreateTar(std::string const& outFileName,
|
||||
case TarCompressLZMA:
|
||||
compress = cmArchiveWrite::CompressLZMA;
|
||||
break;
|
||||
case TarCompressPPMd:
|
||||
compress = cmArchiveWrite::CompressPPMd;
|
||||
break;
|
||||
case TarCompressAuto:
|
||||
// Kept for backwards compatibility with pre-4.3 versions of CMake
|
||||
if (format == "zip") {
|
||||
|
||||
@@ -550,6 +550,7 @@ public:
|
||||
TarCompressLZMA,
|
||||
TarCompressXZ,
|
||||
TarCompressZstd,
|
||||
TarCompressPPMd,
|
||||
TarCompressAuto,
|
||||
TarCompressNone
|
||||
};
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
set(OUTPUT_NAME "test.7z")
|
||||
|
||||
set(ARCHIVE_FORMAT 7zip)
|
||||
set(COMPRESSION_TYPE BZip2)
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/compression-level.cmake)
|
||||
|
||||
check_compression_level("1")
|
||||
check_compression_level("5")
|
||||
check_compression_level("9")
|
||||
@@ -0,0 +1,8 @@
|
||||
set(OUTPUT_NAME "test.7z")
|
||||
|
||||
set(ARCHIVE_FORMAT 7zip)
|
||||
set(COMPRESSION_TYPE BZip2)
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
|
||||
|
||||
check_magic("377abcaf271c" LIMIT 6 HEX)
|
||||
@@ -0,0 +1,8 @@
|
||||
set(OUTPUT_NAME "test.7z")
|
||||
|
||||
set(ARCHIVE_FORMAT 7zip)
|
||||
set(COMPRESSION_TYPE GZip)
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
|
||||
|
||||
check_magic("377abcaf271c" LIMIT 6 HEX)
|
||||
@@ -0,0 +1,10 @@
|
||||
set(OUTPUT_NAME "test.7z")
|
||||
|
||||
set(ARCHIVE_FORMAT 7zip)
|
||||
set(COMPRESSION_TYPE LZMA)
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/compression-level.cmake)
|
||||
|
||||
check_compression_level("1")
|
||||
check_compression_level("5")
|
||||
check_compression_level("9")
|
||||
@@ -0,0 +1,8 @@
|
||||
set(OUTPUT_NAME "test.7z")
|
||||
|
||||
set(ARCHIVE_FORMAT 7zip)
|
||||
set(COMPRESSION_TYPE LZMA)
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
|
||||
|
||||
check_magic("377abcaf271c" LIMIT 6 HEX)
|
||||
@@ -0,0 +1,8 @@
|
||||
set(OUTPUT_NAME "test.7z")
|
||||
|
||||
set(ARCHIVE_FORMAT 7zip)
|
||||
set(COMPRESSION_TYPE LZMA2)
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
|
||||
|
||||
check_magic("377abcaf271c" LIMIT 6 HEX)
|
||||
@@ -0,0 +1,8 @@
|
||||
set(OUTPUT_NAME "test.7z")
|
||||
|
||||
set(ARCHIVE_FORMAT 7zip)
|
||||
set(COMPRESSION_TYPE None)
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
|
||||
|
||||
check_magic("377abcaf271c" LIMIT 6 HEX)
|
||||
@@ -0,0 +1,10 @@
|
||||
set(OUTPUT_NAME "test.7z")
|
||||
|
||||
set(ARCHIVE_FORMAT 7zip)
|
||||
set(COMPRESSION_TYPE PPMd)
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/compression-level.cmake)
|
||||
|
||||
check_compression_level("1")
|
||||
check_compression_level("5")
|
||||
check_compression_level("9")
|
||||
@@ -0,0 +1,8 @@
|
||||
set(OUTPUT_NAME "test.7z")
|
||||
|
||||
set(ARCHIVE_FORMAT 7zip)
|
||||
set(COMPRESSION_TYPE PPMd)
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
|
||||
|
||||
check_magic("377abcaf271c" LIMIT 6 HEX)
|
||||
@@ -1,6 +0,0 @@
|
||||
set(OUTPUT_NAME "test.zip")
|
||||
|
||||
set(ARCHIVE_FORMAT 7zip)
|
||||
set(COMPRESSION_TYPE XZ)
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
|
||||
@@ -0,0 +1,10 @@
|
||||
set(OUTPUT_NAME "test.7z")
|
||||
|
||||
set(ARCHIVE_FORMAT 7zip)
|
||||
set(COMPRESSION_TYPE XZ)
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/compression-level.cmake)
|
||||
|
||||
check_compression_level("1")
|
||||
check_compression_level("5")
|
||||
check_compression_level("9")
|
||||
@@ -1,6 +1,12 @@
|
||||
include(RunCMake)
|
||||
|
||||
run_cmake(7zip)
|
||||
run_cmake(7zip-none)
|
||||
run_cmake(7zip-bz2)
|
||||
run_cmake(7zip-gz)
|
||||
run_cmake(7zip-lzma)
|
||||
run_cmake(7zip-lzma2)
|
||||
run_cmake(7zip-ppmd)
|
||||
run_cmake(gnutar)
|
||||
run_cmake(gnutar-gz)
|
||||
run_cmake(gnutar-deflate)
|
||||
@@ -12,6 +18,8 @@ run_cmake(pax-zstd)
|
||||
run_cmake(paxr)
|
||||
run_cmake(paxr-bz2)
|
||||
run_cmake(zip)
|
||||
run_cmake(zip-none)
|
||||
run_cmake(zip-deflate)
|
||||
|
||||
run_cmake(working-directory)
|
||||
|
||||
@@ -30,12 +38,17 @@ run_cmake(extract-missing-args)
|
||||
|
||||
run_cmake(unsupported-format)
|
||||
run_cmake(zip-with-bad-compression)
|
||||
run_cmake(7zip-with-bad-compression)
|
||||
run_cmake(gnutar-with-bad-compression)
|
||||
|
||||
run_cmake(unsupported-compression-level)
|
||||
run_cmake(argument-validation-compression-level-1)
|
||||
run_cmake(argument-validation-compression-level-2)
|
||||
run_cmake(7zip-bz2-compression-level)
|
||||
run_cmake(7zip-lzma-compression-level)
|
||||
run_cmake(7zip-xz-compression-level)
|
||||
run_cmake(7zip-ppmd-compression-level)
|
||||
run_cmake(gnutar-gz-compression-level)
|
||||
run_cmake(pax-xz-compression-level)
|
||||
run_cmake(pax-zstd-compression-level)
|
||||
run_cmake(paxr-bz2-compression-level)
|
||||
run_cmake(zip-deflate-compression-level)
|
||||
|
||||
+2
-2
@@ -1,5 +1,5 @@
|
||||
CMake Error at roundtrip\.cmake:38 \(file\):
|
||||
file archive format 7zip does not support COMPRESSION arguments
|
||||
file PPMd compression is not supported for gnutar format
|
||||
Call Stack \(most recent call first\):
|
||||
7zip-with-bad-compression\.cmake:6 \(include\)
|
||||
gnutar-with-bad-compression\.cmake:6 \(include\)
|
||||
CMakeLists\.txt:3 \(include\)
|
||||
@@ -0,0 +1,6 @@
|
||||
set(OUTPUT_NAME "test.tar")
|
||||
|
||||
set(ARCHIVE_FORMAT gnutar)
|
||||
set(COMPRESSION_TYPE PPMd)
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
|
||||
@@ -1,5 +1,6 @@
|
||||
CMake Error at compression-level\.cmake:39 \(file\):
|
||||
file compression level is not supported for compression "None"
|
||||
file compression level is not supported for compression "None"\. Provided
|
||||
compression level: 1
|
||||
Call Stack \(most recent call first\):
|
||||
unsupported-compression-level\.cmake:7 \(check_compression_level\)
|
||||
unsupported-compression-level\.cmake:8 \(check_compression_level\)
|
||||
CMakeLists\.txt:3 \(include\)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
set(OUTPUT_NAME "test.7z")
|
||||
|
||||
set(ARCHIVE_FORMAT 7zip)
|
||||
set(COMPRESSION_TYPE None)
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/compression-level.cmake)
|
||||
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
set(OUTPUT_NAME "test.zip")
|
||||
|
||||
set(ARCHIVE_FORMAT zip)
|
||||
set(COMPRESSION_TYPE Deflate)
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/compression-level.cmake)
|
||||
|
||||
check_compression_level("1")
|
||||
check_compression_level("5")
|
||||
check_compression_level("9")
|
||||
@@ -0,0 +1,8 @@
|
||||
set(OUTPUT_NAME "test.zip")
|
||||
|
||||
set(ARCHIVE_FORMAT zip)
|
||||
set(COMPRESSION_TYPE Deflate)
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
|
||||
|
||||
check_magic("504b0304" LIMIT 4 HEX)
|
||||
@@ -0,0 +1,8 @@
|
||||
set(OUTPUT_NAME "test.zip")
|
||||
|
||||
set(ARCHIVE_FORMAT zip)
|
||||
set(COMPRESSION_TYPE None)
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
|
||||
|
||||
check_magic("504b0304" LIMIT 4 HEX)
|
||||
@@ -1,5 +1,5 @@
|
||||
CMake Error at roundtrip\.cmake:38 \(file\):
|
||||
file archive format zip does not support COMPRESSION arguments
|
||||
file PPMd compression is not supported for zip format
|
||||
Call Stack \(most recent call first\):
|
||||
zip-with-bad-compression\.cmake:6 \(include\)
|
||||
CMakeLists\.txt:3 \(include\)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
set(OUTPUT_NAME "test.zip")
|
||||
|
||||
set(ARCHIVE_FORMAT zip)
|
||||
set(COMPRESSION_TYPE BZip2)
|
||||
set(COMPRESSION_TYPE PPMd)
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
|
||||
|
||||
Reference in New Issue
Block a user