Przeglądaj źródła

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

Fixes: #27463
AJIOB 2 miesięcy temu
rodzic
commit
e347176424
28 zmienionych plików z 193 dodań i 27 usunięć
  1. 19 0
      Help/command/file.rst
  2. 5 0
      Help/manual/cmake.1.rst
  3. 7 0
      Help/release/dev/file-ARCHIVE_CREATE-7z-zip-algorithms.rst
  4. 16 14
      Source/cmFileCommand.cxx
  5. 3 0
      Source/cmSystemTools.cxx
  6. 1 0
      Source/cmSystemTools.h
  7. 10 0
      Tests/RunCMake/File_Archive/7zip-bz2-compression-level.cmake
  8. 8 0
      Tests/RunCMake/File_Archive/7zip-bz2.cmake
  9. 8 0
      Tests/RunCMake/File_Archive/7zip-gz.cmake
  10. 10 0
      Tests/RunCMake/File_Archive/7zip-lzma-compression-level.cmake
  11. 8 0
      Tests/RunCMake/File_Archive/7zip-lzma.cmake
  12. 8 0
      Tests/RunCMake/File_Archive/7zip-lzma2.cmake
  13. 8 0
      Tests/RunCMake/File_Archive/7zip-none.cmake
  14. 10 0
      Tests/RunCMake/File_Archive/7zip-ppmd-compression-level.cmake
  15. 8 0
      Tests/RunCMake/File_Archive/7zip-ppmd.cmake
  16. 0 6
      Tests/RunCMake/File_Archive/7zip-with-bad-compression.cmake
  17. 10 0
      Tests/RunCMake/File_Archive/7zip-xz-compression-level.cmake
  18. 14 1
      Tests/RunCMake/File_Archive/RunCMakeTest.cmake
  19. 0 0
      Tests/RunCMake/File_Archive/gnutar-with-bad-compression-result.txt
  20. 2 2
      Tests/RunCMake/File_Archive/gnutar-with-bad-compression-stderr.txt
  21. 6 0
      Tests/RunCMake/File_Archive/gnutar-with-bad-compression.cmake
  22. 3 2
      Tests/RunCMake/File_Archive/unsupported-compression-level-stderr.txt
  23. 1 0
      Tests/RunCMake/File_Archive/unsupported-compression-level.cmake
  24. 10 0
      Tests/RunCMake/File_Archive/zip-deflate-compression-level.cmake
  25. 8 0
      Tests/RunCMake/File_Archive/zip-deflate.cmake
  26. 8 0
      Tests/RunCMake/File_Archive/zip-none.cmake
  27. 1 1
      Tests/RunCMake/File_Archive/zip-with-bad-compression-stderr.txt
  28. 1 1
      Tests/RunCMake/File_Archive/zip-with-bad-compression.cmake

+ 19 - 0
Help/command/file.rst

@@ -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 - 0
Help/manual/cmake.1.rst

@@ -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

+ 7 - 0
Help/release/dev/file-ARCHIVE_CREATE-7z-zip-algorithms.rst

@@ -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
Source/cmFileCommand.cxx

@@ -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 - 0
Source/cmSystemTools.cxx

@@ -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 - 0
Source/cmSystemTools.h

@@ -550,6 +550,7 @@ public:
     TarCompressLZMA,
     TarCompressXZ,
     TarCompressZstd,
+    TarCompressPPMd,
     TarCompressAuto,
     TarCompressNone
   };

+ 10 - 0
Tests/RunCMake/File_Archive/7zip-bz2-compression-level.cmake

@@ -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")

+ 8 - 0
Tests/RunCMake/File_Archive/7zip-bz2.cmake

@@ -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)

+ 8 - 0
Tests/RunCMake/File_Archive/7zip-gz.cmake

@@ -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)

+ 10 - 0
Tests/RunCMake/File_Archive/7zip-lzma-compression-level.cmake

@@ -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")

+ 8 - 0
Tests/RunCMake/File_Archive/7zip-lzma.cmake

@@ -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)

+ 8 - 0
Tests/RunCMake/File_Archive/7zip-lzma2.cmake

@@ -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)

+ 8 - 0
Tests/RunCMake/File_Archive/7zip-none.cmake

@@ -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)

+ 10 - 0
Tests/RunCMake/File_Archive/7zip-ppmd-compression-level.cmake

@@ -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")

+ 8 - 0
Tests/RunCMake/File_Archive/7zip-ppmd.cmake

@@ -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)

+ 0 - 6
Tests/RunCMake/File_Archive/7zip-with-bad-compression.cmake

@@ -1,6 +0,0 @@
-set(OUTPUT_NAME "test.zip")
-
-set(ARCHIVE_FORMAT 7zip)
-set(COMPRESSION_TYPE XZ)
-
-include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)

+ 10 - 0
Tests/RunCMake/File_Archive/7zip-xz-compression-level.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
Tests/RunCMake/File_Archive/RunCMakeTest.cmake

@@ -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)

+ 0 - 0
Tests/RunCMake/File_Archive/7zip-with-bad-compression-result.txt → Tests/RunCMake/File_Archive/gnutar-with-bad-compression-result.txt


+ 2 - 2
Tests/RunCMake/File_Archive/7zip-with-bad-compression-stderr.txt → Tests/RunCMake/File_Archive/gnutar-with-bad-compression-stderr.txt

@@ -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\)

+ 6 - 0
Tests/RunCMake/File_Archive/gnutar-with-bad-compression.cmake

@@ -0,0 +1,6 @@
+set(OUTPUT_NAME "test.tar")
+
+set(ARCHIVE_FORMAT gnutar)
+set(COMPRESSION_TYPE PPMd)
+
+include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)

+ 3 - 2
Tests/RunCMake/File_Archive/unsupported-compression-level-stderr.txt

@@ -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 - 0
Tests/RunCMake/File_Archive/unsupported-compression-level.cmake

@@ -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)
 

+ 10 - 0
Tests/RunCMake/File_Archive/zip-deflate-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")

+ 8 - 0
Tests/RunCMake/File_Archive/zip-deflate.cmake

@@ -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)

+ 8 - 0
Tests/RunCMake/File_Archive/zip-none.cmake

@@ -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 - 1
Tests/RunCMake/File_Archive/zip-with-bad-compression-stderr.txt

@@ -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 - 1
Tests/RunCMake/File_Archive/zip-with-bad-compression.cmake

@@ -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)