file(ARCHIVE_CREATE): Add controls for zip and 7z compression method/level

Fixes: #27463
This commit is contained in:
AJIOB
2025-12-17 14:38:30 -05:00
committed by Brad King
parent 70dcdffb1f
commit e347176424
28 changed files with 193 additions and 27 deletions
+19
View File
@@ -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.
+5
View File
@@ -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
View File
@@ -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;
}
+3
View File
@@ -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") {
+1
View File
@@ -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")
+14 -1
View File
@@ -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)
@@ -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)