[CMake] CPACK RPM compression type and level

Anil Gunturu anil.gunturu at skyfab.com
Tue Jul 2 14:45:17 EDT 2013


Thanks Eric. Here is the patch for supporting the compression level on
cmake 2.8.7.
-Anil

---
 cmake/modules/patches/CPackRPM.cmake |   51
+++++++++++++++++++++++++++++++---
 1 file changed, 47 insertions(+), 4 deletions(-)

diff --git a/cmake/modules/patches/CPackRPM.cmake
b/cmake/modules/patches/CPackRPM.cmake
index bf476ad..db4823f 100644
--- a/cmake/modules/patches/CPackRPM.cmake
+++ b/cmake/modules/patches/CPackRPM.cmake
@@ -68,6 +68,12 @@
 #     to lzma or xz compression whereas older cannot use such RPM.
 #     Using this one can enforce compression type to be used.
 #     Possible value are: lzma, xz, bzip2 and gzip.
+#  CPACK_RPM_COMPRESSION_LEVEL
+#     Mandatory : NO
+#     Default   : -
+#     May be used to set the compression level. If this is not specified
it defaults
+#     to best possible compression level.
+#     Possible values are: 0-9.
 #  CPACK_RPM_PACKAGE_REQUIRES
 #     Mandatory : NO
 #     Default   : -
@@ -374,17 +380,54 @@ IF (CPACK_RPM_COMPRESSION_TYPE)
    IF(CPACK_RPM_PACKAGE_DEBUG)
      MESSAGE("CPackRPM:Debug: User Specified RPM compression type:
${CPACK_RPM_COMPRESSION_TYPE}")
    ENDIF(CPACK_RPM_PACKAGE_DEBUG)
+
+   IF(DEFINED CPACK_RPM_COMPRESSION_LEVEL)
+     # validate the compression level for the compression type
+     IF(CPACK_RPM_COMPRESSION_LEVEL GREATER 9)
+       IF(CPACK_RPM_PACKAGE_DEBUG)
+        message("CPackRPM:Debug: Compression level should be less than 9
for lzma")
+       ENDIF(CPACK_RPM_PACKAGE_DEBUG)
+       set(CPACK_RPM_COMPRESSION_LEVEL 9)
+     ENDIF(CPACK_RPM_COMPRESSION_LEVEL GREATER 9)
+
+     IF(CPACK_RPM_COMPRESSION_LEVEL LESS 0)
+       IF(CPACK_RPM_PACKAGE_DEBUG)
+        message("CPackRPM:Debug: Compression level should be greater than
0 for lzma")
+       ENDIF(CPACK_RPM_PACKAGE_DEBUG)
+       set(CPACK_RPM_COMPRESSION_LEVEL 0)
+     ENDIF(CPACK_RPM_COMPRESSION_LEVEL LESS 0)
+   ELSE(DEFINED CPACK_RPM_COMPRESSION_LEVEL)
+     # compression level not defined, use the highest level for
+     # given compression type
+     IF(CPACK_RPM_COMPRESSION_TYPE STREQUAL "lzma")
+       SET(CPACK_RPM_COMPRESSION_LEVEL 9)
+     ENDIF(CPACK_RPM_COMPRESSION_TYPE STREQUAL "lzma")
+     IF(CPACK_RPM_COMPRESSION_TYPE STREQUAL "xz")
+       SET(CPACK_RPM_COMPRESSION_LEVEL 7)
+     ENDIF(CPACK_RPM_COMPRESSION_TYPE STREQUAL "xz")
+     IF(CPACK_RPM_COMPRESSION_TYPE STREQUAL "bzip2")
+       SET(CPACK_RPM_COMPRESSION_LEVEL 9)
+     ENDIF(CPACK_RPM_COMPRESSION_TYPE STREQUAL "bzip2")
+     IF(CPACK_RPM_COMPRESSION_TYPE STREQUAL "gzip")
+       SET(CPACK_RPM_COMPRESSION_LEVEL 9)
+     ENDIF(CPACK_RPM_COMPRESSION_TYPE STREQUAL "gzip")
+   ENDIF(DEFINED CPACK_RPM_COMPRESSION_LEVEL)
+
+   IF(CPACK_RPM_PACKAGE_DEBUG)
+     message("CPackRPM:Debug: Compression level set to
${CPACK_RPM_COMPRESSION_LEVEL}")
+   ENDIF(CPACK_RPM_PACKAGE_DEBUG)
+
    IF(CPACK_RPM_COMPRESSION_TYPE STREQUAL "lzma")
-     SET(CPACK_RPM_COMPRESSION_TYPE_TMP "%define _binary_payload w9.lzdio")
+     SET(CPACK_RPM_COMPRESSION_TYPE_TMP "%define _binary_payload
w${CPACK_RPM_COMPRESSION_LEVEL}.lzdio")
    ENDIF(CPACK_RPM_COMPRESSION_TYPE STREQUAL "lzma")
    IF(CPACK_RPM_COMPRESSION_TYPE STREQUAL "xz")
-     SET(CPACK_RPM_COMPRESSION_TYPE_TMP "%define _binary_payload w7.xzdio")
+     SET(CPACK_RPM_COMPRESSION_TYPE_TMP "%define _binary_payload
w${CPACK_RPM_COMPRESSION_LEVEL}.xzdio")
    ENDIF(CPACK_RPM_COMPRESSION_TYPE STREQUAL "xz")
    IF(CPACK_RPM_COMPRESSION_TYPE STREQUAL "bzip2")
-     SET(CPACK_RPM_COMPRESSION_TYPE_TMP "%define _binary_payload w9.bzdio")
+     SET(CPACK_RPM_COMPRESSION_TYPE_TMP "%define _binary_payload
w${CPACK_RPM_COMPRESSION_LEVEL}.bzdio")
    ENDIF(CPACK_RPM_COMPRESSION_TYPE STREQUAL "bzip2")
    IF(CPACK_RPM_COMPRESSION_TYPE STREQUAL "gzip")
-     SET(CPACK_RPM_COMPRESSION_TYPE_TMP "%define _binary_payload w9.gzdio")
+     SET(CPACK_RPM_COMPRESSION_TYPE_TMP "%define _binary_payload
w${CPACK_RPM_COMPRESSION_LEVEL}.gzdio")
    ENDIF(CPACK_RPM_COMPRESSION_TYPE STREQUAL "gzip")
 ELSE(CPACK_RPM_COMPRESSION_TYPE)
    SET(CPACK_RPM_COMPRESSION_TYPE_TMP "")
-- 
1.7.9.5



On Tue, Jul 2, 2013 at 5:24 AM, Eric Noulard <eric.noulard at gmail.com> wrote:

> 2013/7/2 Anil Gunturu <anil.gunturu at skyfab.com>:
> > Hi,
> >
> > I understand that CPACK_RPM_COMPRESSION_TYPE can used to change the
> > compression type. Is it also possible to specify the compression level?
> > Selecting a compression type of gzip puts the following line in the spec
> > file:
> > %define _binary_payload w9.gzdio
> >
> >  But is it possible specific fast compression say for example:
> > %define _binary_payload w6.gzdio
> >
> > I am looking to speed up the time for RPM packaging, at the expense
> > compression ratio.
>
> Currently the compression level is not configurable, since it was not
> designed for that when introduced:
> see http://public.kitware.com/Bug/view.php?id=10363.
>
> Have a look at CPackRPM.cmake module and you'll see:
>
> # CPACK_RPM_COMPRESSION_TYPE
> #
> if (CPACK_RPM_COMPRESSION_TYPE)
>    if(CPACK_RPM_PACKAGE_DEBUG)
>      message("CPackRPM:Debug: User Specified RPM compression type:
> ${CPACK_RPM_COMPRESSION_TYPE}")
>    endif()
>    if(CPACK_RPM_COMPRESSION_TYPE STREQUAL "lzma")
>      set(CPACK_RPM_COMPRESSION_TYPE_TMP "%define _binary_payload w9.lzdio")
>    endif()
>    if(CPACK_RPM_COMPRESSION_TYPE STREQUAL "xz")
>      set(CPACK_RPM_COMPRESSION_TYPE_TMP "%define _binary_payload w7.xzdio")
>    endif()
>    if(CPACK_RPM_COMPRESSION_TYPE STREQUAL "bzip2")
>      set(CPACK_RPM_COMPRESSION_TYPE_TMP "%define _binary_payload w9.bzdio")
>    endif()
>    if(CPACK_RPM_COMPRESSION_TYPE STREQUAL "gzip")
>      set(CPACK_RPM_COMPRESSION_TYPE_TMP "%define _binary_payload w9.gzdio")
>    endif()
> else()
>    set(CPACK_RPM_COMPRESSION_TYPE_TMP "")
> endif()
>
> So if you want to play with the compression level you'll currently
> have to patch CPackRPM.cmake.
> If you wish you could file a feature request
> http://public.kitware.com/Bug/bug_report_page.php
> for adding control for the compression level, if you provide a patch
> I'll have a look.
>
> As an alternative you can use CPACK_RPM_SPEC_MORE_DEFINE like this:
> set(CPACK_RPM_SPEC_MORE_DEFINE "%define _binary_payload w6.gzdio")
> and leave CPACK_RPM_COMPRESSION_TYPE empty/undefined.
>
>
> --
> Erk
> L'élection n'est pas la démocratie -- http://www.le-message.org
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20130702/38d829b4/attachment.htm>


More information about the CMake mailing list