Home | History | Annotate | Download | only in modules
      1 # - The builtin (binary) CPack Deb generator (Unix only)
      2 # CPackDeb may be used to create Deb package using CPack.
      3 # CPackDeb is a CPack generator thus it uses the CPACK_XXX variables
      4 # used by CPack : http://www.cmake.org/Wiki/CMake:CPackConfiguration
      5 #
      6 # However CPackRPM has specific features which are controlled by
      7 # the specifics CPACK_RPM_XXX variables.You'll find a detailed usage on 
      8 # the wiki: 
      9 #  http://www.cmake.org/Wiki/CMake:CPackPackageGenerators#DEB_.28UNIX_only.29
     10 # However as a handy reminder here comes the list of specific variables:
     11 #
     12 #  CPACK_DEBIAN_PACKAGE_NAME
     13 #     Mandatory : YES
     14 #     Default   : CPACK_PACKAGE_NAME (lower case)
     15 #     The debian package summary
     16 # CPACK_DEBIAN_PACKAGE_VERSION
     17 #     Mandatory : YES
     18 #     Default   : CPACK_PACKAGE_VERSION
     19 #     The debian package version
     20 # CPACK_DEBIAN_PACKAGE_ARCHITECTURE)
     21 #     Mandatory : YES
     22 #     Default   : Output of dpkg --print-architecture or i386
     23 #     The debian package architecture
     24 # CPACK_DEBIAN_PACKAGE_DEPENDS
     25 #     Mandatory : NO
     26 #     Default   : -
     27 #     May be used to set deb dependencies. 
     28 # CPACK_DEBIAN_PACKAGE_MAINTAINER
     29 #     Mandatory : YES
     30 #     Default   : CPACK_PACKAGE_CONTACT
     31 #     The debian package maintainer
     32 # CPACK_DEBIAN_PACKAGE_DESCRIPTION
     33 #     Mandatory : YES
     34 #     Default   : CPACK_PACKAGE_DESCRIPTION_SUMMARY
     35 #     The debian package description
     36 # CPACK_DEBIAN_PACKAGE_SECTION
     37 #     Mandatory : YES
     38 #     Default   : 'devel'
     39 #     The debian package section
     40 # CPACK_DEBIAN_PACKAGE_PRIORITY
     41 #     Mandatory : YES
     42 #     Default   : 'optional'
     43 #     The debian package priority
     44 
     45 #=============================================================================
     46 # Copyright 2007-2009 Kitware, Inc.
     47 # Copyright 2007-2009 Mathieu Malaterre <mathieu.malaterre (a] gmail.com>
     48 #
     49 # Distributed under the OSI-approved BSD License (the "License");
     50 # see accompanying file Copyright.txt for details.
     51 #
     52 # This software is distributed WITHOUT ANY WARRANTY; without even the
     53 # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     54 # See the License for more information.
     55 #=============================================================================
     56 # (To distributed this file outside of CMake, substitute the full
     57 #  License text for the above reference.)
     58 
     59 # CPack script for creating Debian package
     60 # Author: Mathieu Malaterre
     61 #
     62 # http://wiki.debian.org/HowToPackageForDebian
     63 
     64 IF(CMAKE_BINARY_DIR)
     65   MESSAGE(FATAL_ERROR "CPackDeb.cmake may only be used by CPack internally.")
     66 ENDIF(CMAKE_BINARY_DIR)
     67 
     68 IF(NOT UNIX)
     69   MESSAGE(FATAL_ERROR "CPackDeb.cmake may only be used under UNIX.")
     70 ENDIF(NOT UNIX)
     71 
     72 # Let's define the control file found in debian package:
     73 
     74 # Binary package:
     75 # http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-binarycontrolfiles
     76 
     77 # DEBIAN/control
     78 # debian policy enforce lower case for package name
     79 # Package: (mandatory)
     80 IF(NOT CPACK_DEBIAN_PACKAGE_NAME)
     81   STRING(TOLOWER "${CPACK_PACKAGE_NAME}" CPACK_DEBIAN_PACKAGE_NAME)
     82 ENDIF(NOT CPACK_DEBIAN_PACKAGE_NAME)
     83 
     84 # Version: (mandatory)
     85 IF(NOT CPACK_DEBIAN_PACKAGE_VERSION)
     86   IF(NOT CPACK_PACKAGE_VERSION)
     87     MESSAGE(FATAL_ERROR "Debian package requires a package version")
     88   ENDIF(NOT CPACK_PACKAGE_VERSION)
     89   SET(CPACK_DEBIAN_PACKAGE_VERSION ${CPACK_PACKAGE_VERSION})
     90 ENDIF(NOT CPACK_DEBIAN_PACKAGE_VERSION)
     91 
     92 # Architecture: (mandatory)
     93 IF(NOT CPACK_DEBIAN_PACKAGE_ARCHITECTURE)
     94   # There is no such thing as i686 architecture on debian, you should use i386 instead
     95   # $ dpkg --print-architecture
     96   FIND_PROGRAM(DPKG_CMD dpkg)
     97   IF(NOT DPKG_CMD)
     98     MESSAGE(STATUS "Can not find dpkg in your path, default to i386.")
     99     SET(CPACK_DEBIAN_PACKAGE_ARCHITECTURE i386)
    100   ENDIF(NOT DPKG_CMD)
    101   EXECUTE_PROCESS(COMMAND "${DPKG_CMD}" --print-architecture
    102     OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE
    103     OUTPUT_STRIP_TRAILING_WHITESPACE
    104     )
    105 ENDIF(NOT CPACK_DEBIAN_PACKAGE_ARCHITECTURE)
    106 
    107 # have a look at GET_PROPERTY(result GLOBAL PROPERTY ENABLED_FEATURES),
    108 # this returns the successful FIND_PACKAGE() calls, maybe this can help
    109 # Depends:
    110 # You should set: DEBIAN_PACKAGE_DEPENDS
    111 # TODO: automate 'objdump -p | grep NEEDED'
    112 IF(NOT CPACK_DEBIAN_PACKAGE_DEPENDS)
    113   MESSAGE(STATUS "CPACK_DEBIAN_PACKAGE_DEPENDS not set, the package will have no dependencies.")
    114 ENDIF(NOT CPACK_DEBIAN_PACKAGE_DEPENDS)
    115 
    116 # Maintainer: (mandatory)
    117 IF(NOT CPACK_DEBIAN_PACKAGE_MAINTAINER)
    118   IF(NOT CPACK_PACKAGE_CONTACT)
    119     MESSAGE(FATAL_ERROR "Debian package requires a maintainer for a package, set CPACK_PACKAGE_CONTACT or CPACK_DEBIAN_PACKAGE_MAINTAINER")
    120   ENDIF(NOT CPACK_PACKAGE_CONTACT)
    121   SET(CPACK_DEBIAN_PACKAGE_MAINTAINER ${CPACK_PACKAGE_CONTACT})
    122 ENDIF(NOT CPACK_DEBIAN_PACKAGE_MAINTAINER)
    123 
    124 # Description: (mandatory)
    125 IF(NOT CPACK_DEBIAN_PACKAGE_DESCRIPTION)
    126   IF(NOT CPACK_PACKAGE_DESCRIPTION_SUMMARY)
    127     MESSAGE(FATAL_ERROR "Debian package requires a summary for a package, set CPACK_PACKAGE_DESCRIPTION_SUMMARY or CPACK_DEBIAN_PACKAGE_DESCRIPTION")
    128   ENDIF(NOT CPACK_PACKAGE_DESCRIPTION_SUMMARY)
    129   SET(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${CPACK_PACKAGE_DESCRIPTION_SUMMARY})
    130 ENDIF(NOT CPACK_DEBIAN_PACKAGE_DESCRIPTION)
    131 
    132 # Section: (recommended)
    133 IF(NOT CPACK_DEBIAN_PACKAGE_SECTION)
    134   SET(CPACK_DEBIAN_PACKAGE_SECTION "devel")
    135 ENDIF(NOT CPACK_DEBIAN_PACKAGE_SECTION)
    136 
    137 # Priority: (recommended)
    138 IF(NOT CPACK_DEBIAN_PACKAGE_PRIORITY)
    139   SET(CPACK_DEBIAN_PACKAGE_PRIORITY "optional")
    140 ENDIF(NOT CPACK_DEBIAN_PACKAGE_PRIORITY )
    141 
    142 # Recommends:
    143 # You should set: CPACK_DEBIAN_PACKAGE_RECOMMENDS
    144 
    145 # Suggests:
    146 # You should set: CPACK_DEBIAN_PACKAGE_SUGGESTS
    147 
    148 # CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
    149 # This variable allow advanced user to add custom script to the control.tar.gz (inside the .deb archive)
    150 # Typical examples are: 
    151 # - conffiles
    152 # - postinst
    153 # - postrm
    154 # - prerm"
    155 # Usage:
    156 # SET(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA 
    157 #    "${CMAKE_CURRENT_SOURCE_DIR/prerm;${CMAKE_CURRENT_SOURCE_DIR}/postrm")
    158 
    159 
    160 # For debian source packages:
    161 # debian/control
    162 # http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-sourcecontrolfiles
    163 
    164 # .dsc
    165 # http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-debiansourcecontrolfiles
    166 
    167 # Builds-Depends:
    168 #IF(NOT CPACK_DEBIAN_PACKAGE_BUILDS_DEPENDS)
    169 #  SET(CPACK_DEBIAN_PACKAGE_BUILDS_DEPENDS
    170 #    "debhelper (>> 5.0.0), libncurses5-dev, tcl8.4"
    171 #  )
    172 #ENDIF(NOT CPACK_DEBIAN_PACKAGE_BUILDS_DEPENDS)
    173 
    174 # Description: (mandatory)
    175 #if(NOT CPACK_SECTION)
    176 #    message(FATAL_ERROR "opkg package requires a package section")
    177 #endif(NOT CPACK_SECTION)
    178 
    179 # Package for opkg
    180 FIND_PROGRAM(OPKG_CMD opkg-build)
    181 if( ${OPKG_CMD} STREQUAL "OPKG_CMD-NOTFOUND" )
    182   message("CPack: opkg-build not found. Skipping packaging")
    183 else( ${OPKG_CMD} STREQUAL "OPKG_CMD-NOTFOUND" )
    184   SET(CPACK_OPKG_ROOTDIR "${CPACK_TOPLEVEL_DIRECTORY}/${CPACK_PACKAGE_FILE_NAME}")
    185   FILE(MAKE_DIRECTORY ${CPACK_OPKG_ROOTDIR}/CONTROL)
    186   set(CPACK_OPKG_CONTROL_FILE "${CPACK_OPKG_ROOTDIR}/CONTROL/control")
    187   # Write controlfile
    188   FILE(WRITE ${CPACK_OPKG_CONTROL_FILE}
    189     "Package: ${CPACK_PACKAGE_NAME}
    190 Version: ${CPACK_PACKAGE_VERSION}
    191 Description: ${CPACK_PACKAGE_DESCRIPTION_SUMMARY}
    192 Architecture: ${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}
    193 Section: ${CPACK_DEBIAN_PACKAGE_SECTION}
    194 Priority: optional
    195 Maintainer: ${CPACK_DEBIAN_PACKAGE_MAINTAINER}
    196 Depends:
    197 Provides: ${CPACK_DEBIAN_PACKAGE_PROVIDES}
    198 Replaces: ${CPACK_DEBIAN_PACKAGE_REPLACES}
    199 Conflicts: ${CPACK_DEBIAN_PACKAGE_CONFLICTS}
    200 Source: https://github.com/intel-iot-devkit/mraa
    201 #Essential: no
    202 ")
    203 
    204 set(OPKG_FILE_NAME "${CPACK_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}")
    205   execute_process(
    206     COMMAND "${OPKG_CMD}" "-o" "0" "${CPACK_PACKAGE_FILE_NAME}" "."
    207     RESULT_VARIABLE _result
    208     OUTPUT_VARIABLE _res_output
    209     ERROR_VARIABLE  _res_error
    210     WORKING_DIRECTORY ${CPACK_TOPLEVEL_DIRECTORY}
    211     )
    212 
    213   if(${_result})
    214     message("Result '${_result}'")
    215     message("Output '${_res_output}'")
    216     message("Error  '${_res_error}'")
    217   else(${_result})
    218     message("CPack: Package ${OPKG_FILE_NAME}.ipk generated.")
    219     set(WDIR "${CPACK_TOPLEVEL_DIRECTORY}/${CPACK_PACKAGE_FILE_NAME}")
    220     file(RENAME ${CPACK_TOPLEVEL_DIRECTORY}/${OPKG_FILE_NAME}.ipk ${CPACK_BINARY_DIR}/${OPKG_FILE_NAME}.ipk)
    221   endif(${_result})
    222 endif( ${OPKG_CMD} STREQUAL "OPKG_CMD-NOTFOUND" )
    223