diff --git a/Help/cpack_gen/deb.rst b/Help/cpack_gen/deb.rst index 6e04bb3bf4..41ca64aed1 100644 --- a/Help/cpack_gen/deb.rst +++ b/Help/cpack_gen/deb.rst @@ -306,6 +306,37 @@ List of CPack DEB generator specific variables: Zstandard compression +.. variable:: CPACK_DEBIAN_COMPRESSION_LEVEL + + .. versionadded:: 4.3 + + The compression level used for creating the Debian package. + + :Mandatory: No + :Default: Automatically determined by the compression tool. + + This variable allows fine-tuning of the compression ratio and speed for the + Debian package archive. It controls the numeric compression level passed to + the compressor defined by :variable:`CPACK_DEBIAN_COMPRESSION_TYPE`. + If ``CPACK_DEBIAN_COMPRESSION_LEVEL`` is not set, or is set to ``0``, + the default value will be used. + + The valid range and interpretation depend on the selected compression type: + + - ``gzip`` – level 1–9 (default 6) + - ``bzip2`` – level 1–9 (default 9) + - ``xz`` – level 1–9 (default 6) + - ``lzma`` – level 1–9 (default 6) + - ``zstd`` – level 1–19 (default 3) + + Example usage: + + .. code-block:: cmake + + set(CPACK_DEBIAN_COMPRESSION_TYPE "xz") + set(CPACK_DEBIAN_COMPRESSION_LEVEL 9) + + include(CPack) .. variable:: CPACK_DEBIAN_PACKAGE_PRIORITY CPACK_DEBIAN__PACKAGE_PRIORITY diff --git a/Help/release/dev/cpack-deb-compression-level.rst b/Help/release/dev/cpack-deb-compression-level.rst new file mode 100644 index 0000000000..8b020edc82 --- /dev/null +++ b/Help/release/dev/cpack-deb-compression-level.rst @@ -0,0 +1,6 @@ +cpack-deb-compression-level +--------------------------- + +* The :cpack_gen:`CPack DEB Generator` gained a new variable + :variable:`CPACK_DEBIAN_COMPRESSION_LEVEL` to control the + compression level used when creating Debian packages. diff --git a/Modules/Internal/CPack/CPackDeb.cmake b/Modules/Internal/CPack/CPackDeb.cmake index 873c7bc332..12ab6aecb8 100644 --- a/Modules/Internal/CPack/CPackDeb.cmake +++ b/Modules/Internal/CPack/CPackDeb.cmake @@ -808,6 +808,10 @@ function(cpack_deb_prepare_package_vars) string(REGEX REPLACE "\.deb$" "-dbgsym.ddeb" CPACK_DBGSYM_OUTPUT_FILE_NAME "${CPACK_OUTPUT_FILE_NAME}") endif() + if(NOT DEFINED CPACK_DEBIAN_COMPRESSION_LEVEL) + set(CPACK_DEBIAN_COMPRESSION_LEVEL "0") + endif() + # Print out some debug information if we were asked for that if(CPACK_DEBIAN_PACKAGE_DEBUG) message("CPackDeb:Debug: CPACK_TOPLEVEL_DIRECTORY = '${CPACK_TOPLEVEL_DIRECTORY}'") @@ -820,6 +824,7 @@ function(cpack_deb_prepare_package_vars) message("CPackDeb:Debug: CPACK_TEMPORARY_PACKAGE_FILE_NAME = '${CPACK_TEMPORARY_PACKAGE_FILE_NAME}'") message("CPackDeb:Debug: CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION = '${CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION}'") message("CPackDeb:Debug: CPACK_DEBIAN_PACKAGE_SOURCE = '${CPACK_DEBIAN_PACKAGE_SOURCE}'") + message("CPackDeb:Debug: CPACK_DEBIAN_COMPRESSION_LEVEL = '${CPACK_DEBIAN_COMPRESSION_LEVEL}'") endif() # For debian source packages: @@ -849,6 +854,7 @@ function(cpack_deb_prepare_package_vars) set(GEN_CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}" PARENT_SCOPE) set(GEN_CPACK_DEBIAN_ARCHIVE_TYPE "${CPACK_DEBIAN_ARCHIVE_TYPE}" PARENT_SCOPE) set(GEN_CPACK_DEBIAN_COMPRESSION_TYPE "${CPACK_DEBIAN_COMPRESSION_TYPE}" PARENT_SCOPE) + set(GEN_CPACK_DEBIAN_COMPRESSION_LEVEL "${CPACK_DEBIAN_COMPRESSION_LEVEL}" PARENT_SCOPE) set(GEN_CPACK_DEBIAN_PACKAGE_RECOMMENDS "${CPACK_DEBIAN_PACKAGE_RECOMMENDS}" PARENT_SCOPE) set(GEN_CPACK_DEBIAN_PACKAGE_SUGGESTS "${CPACK_DEBIAN_PACKAGE_SUGGESTS}" PARENT_SCOPE) set(GEN_CPACK_DEBIAN_PACKAGE_HOMEPAGE "${CPACK_DEBIAN_PACKAGE_HOMEPAGE}" PARENT_SCOPE) diff --git a/Source/CPack/cmCPackDebGenerator.cxx b/Source/CPack/cmCPackDebGenerator.cxx index 1571bd1f31..523a293cb6 100644 --- a/Source/CPack/cmCPackDebGenerator.cxx +++ b/Source/CPack/cmCPackDebGenerator.cxx @@ -32,8 +32,8 @@ class DebGenerator public: DebGenerator(cmCPackLog* logger, std::string outputName, std::string workDir, std::string topLevelDir, std::string temporaryDir, - cmValue debianCompressionType, cmValue numThreads, - cmValue debianArchiveType, + cmValue debianCompressionType, cmValue debianCompressionLevel, + cmValue numThreads, cmValue debianArchiveType, std::map controlValues, bool genShLibs, std::string shLibsFilename, bool genPostInst, std::string postInst, bool genPostRm, std::string postRm, @@ -69,16 +69,18 @@ private: bool const PermissionStrictPolicy; std::vector const PackageFiles; cmArchiveWrite::Compress TarCompressionType; + int CompressionLevel = 0; }; DebGenerator::DebGenerator( cmCPackLog* logger, std::string outputName, std::string workDir, std::string topLevelDir, std::string temporaryDir, - cmValue debCompressionType, cmValue numThreads, cmValue debianArchiveType, - std::map controlValues, bool genShLibs, - std::string shLibsFilename, bool genPostInst, std::string postInst, - bool genPostRm, std::string postRm, cmValue controlExtra, - bool permissionStrictPolicy, std::vector packageFiles) + cmValue debCompressionType, cmValue debCompressionLevel, cmValue numThreads, + cmValue debianArchiveType, std::map controlValues, + bool genShLibs, std::string shLibsFilename, bool genPostInst, + std::string postInst, bool genPostRm, std::string postRm, + cmValue controlExtra, bool permissionStrictPolicy, + std::vector packageFiles) : Logger(logger) , OutputName(std::move(outputName)) , WorkDir(std::move(workDir)) @@ -135,6 +137,19 @@ DebGenerator::DebGenerator( } else { this->NumThreads = 1; } + + if (debCompressionLevel) { + long compressionLevel; + if (!cmStrToLong(*debCompressionLevel, &compressionLevel)) { + compressionLevel = 0; + cmCPackLogger(cmCPackLog::LOG_ERROR, + "Unrecognized compression level: " << debCompressionLevel + << std::endl); + } + this->CompressionLevel = static_cast(compressionLevel); + } else { + this->CompressionLevel = 0; + } } bool DebGenerator::generate() const @@ -192,7 +207,7 @@ bool DebGenerator::generateDataTar() const return false; } cmArchiveWrite data_tar(fileStream_data_tar, this->TarCompressionType, - this->DebianArchiveType, 0, + this->DebianArchiveType, this->CompressionLevel, static_cast(this->NumThreads)); if (!data_tar.Open()) { cmCPackLogger(cmCPackLog::LOG_ERROR, @@ -324,7 +339,7 @@ bool DebGenerator::generateControlTar(std::string const& md5Filename) const return false; } cmArchiveWrite control_tar(fileStream_control_tar, this->TarCompressionType, - this->DebianArchiveType); + this->DebianArchiveType, this->CompressionLevel); if (!control_tar.Open()) { cmCPackLogger(cmCPackLog::LOG_ERROR, "Error opening the archive \"" @@ -846,6 +861,7 @@ bool cmCPackDebGenerator::createDeb() this->GetOption("CPACK_TOPLEVEL_DIRECTORY"), this->GetOption("CPACK_TEMPORARY_DIRECTORY"), this->GetOption("GEN_CPACK_DEBIAN_COMPRESSION_TYPE"), + this->GetOption("GEN_CPACK_DEBIAN_COMPRESSION_LEVEL"), this->GetOption("CPACK_THREADS"), this->GetOption("GEN_CPACK_DEBIAN_ARCHIVE_TYPE"), controlValues, gen_shibs, shlibsfilename, this->IsOn("GEN_CPACK_DEBIAN_GENERATE_POSTINST"), postinst, @@ -901,6 +917,7 @@ bool cmCPackDebGenerator::createDbgsymDDeb() this->GetOption("CPACK_TOPLEVEL_DIRECTORY"), this->GetOption("CPACK_TEMPORARY_DIRECTORY"), this->GetOption("GEN_CPACK_DEBIAN_COMPRESSION_TYPE"), + this->GetOption("GEN_CPACK_DEBIAN_COMPRESSION_LEVEL"), this->GetOption("CPACK_THREADS"), this->GetOption("GEN_CPACK_DEBIAN_ARCHIVE_TYPE"), controlValues, false, "", false, "", false, "", nullptr, diff --git a/Tests/RunCMake/CPack_DEB/Basic-verify-stdout.txt b/Tests/RunCMake/CPack_DEB/Basic-verify-stdout.txt index 299f02e6cd..bcb8a4a5d7 100644 --- a/Tests/RunCMake/CPack_DEB/Basic-verify-stdout.txt +++ b/Tests/RunCMake/CPack_DEB/Basic-verify-stdout.txt @@ -11,4 +11,8 @@ d[rwx-]+ root/root 0 [0-9-]+ [0-9:]+ \./usr/share/ d[rwx-]+ root/root 0 [0-9-]+ [0-9:]+ \./usr/share/doc/ d[rwx-]+ root/root 0 [0-9-]+ [0-9:]+ \./usr/share/doc/basic/ -[rwx-]+ root/root 0 [0-9-]+ [0-9:]+ \./usr/share/doc/basic/basic\.txt +-- ar t +debian-binary +control\.tar\.xz +data\.tar\.xz -- diff --git a/Tests/RunCMake/CPack_DEB/verify.cmake b/Tests/RunCMake/CPack_DEB/verify.cmake index 7084c1eb01..95f63081eb 100644 --- a/Tests/RunCMake/CPack_DEB/verify.cmake +++ b/Tests/RunCMake/CPack_DEB/verify.cmake @@ -2,3 +2,5 @@ message(STATUS "dpkg-deb --info") execute_process(COMMAND dpkg-deb --info ${CMAKE_ARGV4}) message(STATUS "dpkg-deb --contents") execute_process(COMMAND dpkg-deb --contents ${CMAKE_ARGV4}) +message(STATUS "ar t") +execute_process(COMMAND ar t ${CMAKE_ARGV4}) diff --git a/Tests/RunCMake/RunCPack/Basic/CMakeLists.txt b/Tests/RunCMake/RunCPack/Basic/CMakeLists.txt index 50f6b5fb9c..f4593d0ebc 100644 --- a/Tests/RunCMake/RunCPack/Basic/CMakeLists.txt +++ b/Tests/RunCMake/RunCPack/Basic/CMakeLists.txt @@ -3,5 +3,8 @@ project(Basic LANGUAGES NONE VERSION "1.2.3") install(FILES basic.txt DESTINATION share/doc/basic) +set(CPACK_DEBIAN_COMPRESSION_TYPE "xz") +set(CPACK_DEBIAN_COMPRESSION_LEVEL "4") + set(CPACK_PACKAGE_CONTACT "somebody@cmake.org") include(CPack)