851b4f97801d89205679ab01ca4208b51a02ba3d
[contrib/mraa.git] / cmake / modules / CPackDeb.cmake
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@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/maa
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" )