summaryrefslogtreecommitdiffstats
path: root/project/cmake/cpack/CPackConfigDEB.cmake
diff options
context:
space:
mode:
authormanuel <manuel@mausz.at>2016-11-24 21:27:41 +0100
committermanuel <manuel@mausz.at>2016-11-24 21:27:41 +0100
commit8cdf8dec703d882b46ca50a769fabb95ffc48e2c (patch)
treef7fe8233508f79d3dc94f8f445ce6342e7dfbdbb /project/cmake/cpack/CPackConfigDEB.cmake
parent5823b05feb29a59510c32a9c28ca18b50b9b6399 (diff)
downloadkodi-pvr-build-8cdf8dec703d882b46ca50a769fabb95ffc48e2c.tar.gz
kodi-pvr-build-8cdf8dec703d882b46ca50a769fabb95ffc48e2c.tar.bz2
kodi-pvr-build-8cdf8dec703d882b46ca50a769fabb95ffc48e2c.zip
sync with upstream
Diffstat (limited to 'project/cmake/cpack/CPackConfigDEB.cmake')
-rw-r--r--project/cmake/cpack/CPackConfigDEB.cmake352
1 files changed, 352 insertions, 0 deletions
diff --git a/project/cmake/cpack/CPackConfigDEB.cmake b/project/cmake/cpack/CPackConfigDEB.cmake
new file mode 100644
index 0000000..cb8e59e
--- /dev/null
+++ b/project/cmake/cpack/CPackConfigDEB.cmake
@@ -0,0 +1,352 @@
1# include Macros.cmake to automate generation of time/date stamps, maintainer, etc.
2include(${PROJECT_SOURCE_DIR}/scripts/common/Macros.cmake)
3
4# find stuff we need
5find_program(LSB_RELEASE_CMD lsb_release)
6find_program(DPKG_CMD dpkg)
7find_package(Git)
8find_program(GZIP_CMD gzip)
9
10# set packaging dir
11if(NOT CPACK_PACKAGE_DIRECTORY)
12 set(CPACK_PACKAGE_DIRECTORY ${CMAKE_BINARY_DIR}/packages)
13endif()
14
15# force CPack generated DEBs to use the same path as CMAKE_INSTALL_PREFIX
16set(CPACK_SET_DESTDIR true)
17
18# set architecture
19if(NOT CPACK_SYSTEM_NAME)
20 set(CPACK_SYSTEM_NAME ${CMAKE_SYSTEM_PROCESSOR})
21 # sanity check
22 if(CPACK_SYSTEM_NAME STREQUAL x86_64)
23 set(CPACK_SYSTEM_NAME amd64)
24 endif()
25endif()
26
27# set packaging by components
28set(CPACK_DEB_COMPONENT_INSTALL ON)
29
30# enforce Debian policy permission rules
31set(CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION ON)
32
33# packaging by components doesn't fully work with CMake/CPack <3.6.0
34# CPACK_DEBIAN_<COMPONENT>_FILE_NAME is a 3.6.0 addition
35# warn if detected version is lower
36if(CMAKE_VERSION VERSION_LESS 3.6)
37 message(WARNING "DEB Generator: CMake/CPack 3.6 or higher is needed to produce correctly named packages.")
38endif()
39
40# distro codename
41if(NOT DISTRO_CODENAME)
42 if(NOT LSB_RELEASE_CMD)
43 message(WARNING "DEB Generator: Can't find lsb_release in your path. Setting DISTRO_CODENAME to unknown.")
44 set(DISTRO_CODENAME unknown)
45 else()
46 execute_process(COMMAND ${LSB_RELEASE_CMD} -cs
47 OUTPUT_VARIABLE DISTRO_CODENAME
48 OUTPUT_STRIP_TRAILING_WHITESPACE)
49 endif()
50endif()
51
52# package version
53if(DEBIAN_PACKAGE_VERSION)
54 set(DISTRO_CODENAME ${DEBIAN_PACKAGE_VERSION}${DISTRO_CODENAME})
55else()
56 set(DISTRO_CODENAME 0${DISTRO_CODENAME})
57endif()
58
59# package revision
60if(DEBIAN_PACKAGE_REVISION)
61 set(DISTRO_CODENAME ${DISTRO_CODENAME}${DEBIAN_PACKAGE_REVISION})
62endif()
63
64# package type
65if(DEBIAN_PACKAGE_TYPE STREQUAL stable)
66 set(RELEASE_IDENTIFIER final)
67elseif(DEBIAN_PACKAGE_TYPE STREQUAL unstable)
68 set(RELEASE_IDENTIFIER ${APP_VERSION_TAG_LC})
69else()
70 core_find_git_rev(RELEASE_IDENTIFIER)
71endif()
72
73# package name
74string(TIMESTAMP PACKAGE_TIMESTAMP "%Y%m%d.%H%M" UTC)
75set(PACKAGE_NAME_VERSION ${APP_VERSION_MAJOR}.${APP_VERSION_MINOR}~git${PACKAGE_TIMESTAMP}-${RELEASE_IDENTIFIER}-${DISTRO_CODENAME})
76unset(RELEASE_IDENTIFIER)
77
78# package version
79if(DEBIAN_PACKAGE_EPOCH)
80 set(CPACK_DEBIAN_PACKAGE_VERSION ${DEBIAN_PACKAGE_EPOCH}:${PACKAGE_NAME_VERSION})
81else()
82 set(CPACK_DEBIAN_PACKAGE_VERSION 2:${PACKAGE_NAME_VERSION})
83endif()
84
85# architecture
86if(NOT CPACK_DEBIAN_PACKAGE_ARCHITECTURE)
87 if(NOT DPKG_CMD)
88 message(WARNING "DEB Generator: Can't find dpkg in your path. Setting CPACK_DEBIAN_PACKAGE_ARCHITECTURE to i386.")
89 set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE i386)
90 endif()
91 execute_process(COMMAND "${DPKG_CMD}" --print-architecture
92 OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE
93 OUTPUT_STRIP_TRAILING_WHITESPACE)
94endif()
95
96# package maintainer
97if(NOT CPACK_DEBIAN_PACKAGE_MAINTAINER)
98 userstamp()
99 set(CPACK_DEBIAN_PACKAGE_MAINTAINER ${PACKAGE_MAINTAINER})
100 unset(PACKAGE_MAINTAINER)
101endif()
102
103# package description common to all packages
104if(NOT CPACK_DEBIAN_PACKAGE_DESCRIPTION)
105 file(STRINGS ${PROJECT_SOURCE_DIR}/cpack/deb/package-description.txt DESC_LINES)
106 foreach(LINE IN LISTS DESC_LINES)
107 set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "${CPACK_DEBIAN_PACKAGE_DESCRIPTION} ${LINE}\n")
108 endforeach()
109endif()
110
111# package homepage
112if(NOT CPACK_DEBIAN_PACKAGE_HOMEPAGE)
113 set(CPACK_DEBIAN_PACKAGE_HOMEPAGE ${APP_WEBSITE})
114endif()
115
116# generate a Debian compliant changelog
117set(CHANGELOG_HEADER "${APP_NAME_LC} (${CPACK_DEBIAN_PACKAGE_VERSION}) ${DISTRO_CODENAME}\; urgency=high")
118rfc2822stamp()
119# two spaces between maintainer and timestamp is NOT a mistake
120set(CHANGELOG_FOOTER " -- ${CPACK_DEBIAN_PACKAGE_MAINTAINER} ${RFC2822_TIMESTAMP}")
121
122if(GIT_FOUND AND GZIP_CMD AND EXISTS ${CORE_SOURCE_DIR}/.git)
123 execute_process(COMMAND ${GIT_EXECUTABLE} log --no-merges --pretty=format:"%n [%an]%n * %s" --since="last month"
124 OUTPUT_VARIABLE CHANGELOG
125 WORKING_DIRECTORY ${CORE_SOURCE_DIR}
126 OUTPUT_STRIP_TRAILING_WHITESPACE)
127 string(REPLACE "\"" "" CHANGELOG ${CHANGELOG})
128 file(WRITE ${CPACK_PACKAGE_DIRECTORY}/deb/changelog.Debian ${CHANGELOG_HEADER}\n${CHANGELOG}\n\n${CHANGELOG_FOOTER})
129 execute_process(COMMAND ${GZIP_CMD} -f -9 -n ${CPACK_PACKAGE_DIRECTORY}/deb/changelog.Debian)
130 unset(CHANGELOG_HEADER)
131 unset(CHANGELOG_FOOTER)
132 unset(RFC2822_TIMESTAMP)
133else()
134 message(WARNING "DEB Generator: Can't find git and/or gzip in your path. DEB packages will be missing changelog.Debian.gz.")
135endif()
136
137# Generate NEWS.Debian
138configure_file(${PROJECT_SOURCE_DIR}/cpack/deb/NEWS.Debian
139 ${CPACK_PACKAGE_DIRECTORY}/deb/NEWS.Debian @ONLY)
140if(GZIP_CMD)
141 execute_process(COMMAND ${GZIP_CMD} -f -9 -n ${CPACK_PACKAGE_DIRECTORY}/deb/NEWS.Debian)
142else()
143 message(WARNING "DEB Generator: Can't find gzip in your path. DEB packages will be missing NEWS.Debian.")
144endif()
145
146# Generate man pages
147configure_file(${CORE_SOURCE_DIR}/docs/manpages/kodi.bin.1
148 ${CPACK_PACKAGE_DIRECTORY}/deb/kodi.1 COPYONLY)
149configure_file(${CORE_SOURCE_DIR}/docs/manpages/kodi.bin.1
150 ${CPACK_PACKAGE_DIRECTORY}/deb/kodi.bin.1 COPYONLY)
151configure_file(${CORE_SOURCE_DIR}/docs/manpages/kodi-standalone.1
152 ${CPACK_PACKAGE_DIRECTORY}/deb/kodi-standalone.1 COPYONLY)
153if(ENABLE_EVENTCLIENTS)
154 configure_file(${CORE_SOURCE_DIR}/docs/manpages/kodi-ps3remote.1
155 ${CPACK_PACKAGE_DIRECTORY}/deb/kodi-ps3remote.1 COPYONLY)
156 configure_file(${CORE_SOURCE_DIR}/docs/manpages/kodi-send.1
157 ${CPACK_PACKAGE_DIRECTORY}/deb/kodi-send.1 COPYONLY)
158 configure_file(${CORE_SOURCE_DIR}/docs/manpages/kodi-wiiremote.1
159 ${CPACK_PACKAGE_DIRECTORY}/deb/kodi-wiiremote.1 COPYONLY)
160endif()
161
162if(GZIP_CMD)
163 execute_process(COMMAND ${GZIP_CMD} -f -9 -n ${CPACK_PACKAGE_DIRECTORY}/deb/kodi.1)
164 execute_process(COMMAND ${GZIP_CMD} -f -9 -n ${CPACK_PACKAGE_DIRECTORY}/deb/kodi.bin.1)
165 execute_process(COMMAND ${GZIP_CMD} -f -9 -n ${CPACK_PACKAGE_DIRECTORY}/deb/kodi-standalone.1)
166 if(ENABLE_EVENTCLIENTS)
167 execute_process(COMMAND ${GZIP_CMD} -f -9 -n ${CPACK_PACKAGE_DIRECTORY}/deb/kodi-ps3remote.1)
168 execute_process(COMMAND ${GZIP_CMD} -f -9 -n ${CPACK_PACKAGE_DIRECTORY}/deb/kodi-send.1)
169 execute_process(COMMAND ${GZIP_CMD} -f -9 -n ${CPACK_PACKAGE_DIRECTORY}/deb/kodi-wiiremote.1)
170 endif()
171else()
172 message(WARNING "DEB Generator: Can't find gzip in your path. Several DEB packages will be missing man pages.")
173endif()
174
175install(FILES ${CPACK_PACKAGE_DIRECTORY}/deb/kodi.1.gz
176 ${CPACK_PACKAGE_DIRECTORY}/deb/kodi.bin.1.gz
177 ${CPACK_PACKAGE_DIRECTORY}/deb/kodi-standalone.1.gz
178 DESTINATION share/man/man1
179 COMPONENT kodi)
180if(ENABLE_EVENTCLIENTS)
181install(FILES ${CPACK_PACKAGE_DIRECTORY}/deb/kodi-ps3remote.1.gz
182 DESTINATION share/man/man1
183 COMPONENT kodi-eventclients-ps3)
184install(FILES ${CPACK_PACKAGE_DIRECTORY}/deb/kodi-send.1.gz
185 DESTINATION share/man/man1
186 COMPONENT kodi-eventclients-xbmc-send)
187install(FILES ${CPACK_PACKAGE_DIRECTORY}/deb/kodi-wiiremote.1.gz
188 DESTINATION share/man/man1
189 COMPONENT kodi-eventclients-wiiremote)
190endif()
191
192# configure package metadata files
193file(GLOB DEBIAN_PACKAGE_FILES ${PROJECT_SOURCE_DIR}/cpack/deb/packages/*.txt.in)
194foreach(file ${DEBIAN_PACKAGE_FILES})
195 get_filename_component(package ${file} NAME_WE)
196 # filter eventclients so we don't have to support two more deps
197 # (libbluetooth-dev and libcwiid-dev) just because of wii-remote
198 string(SUBSTRING ${package} 0 17 PACKAGE_FILTER)
199 if(NOT ENABLE_EVENTCLIENTS AND PACKAGE_FILTER STREQUAL kodi-eventclients)
200 message(STATUS "DEB Generator: ${package} matches ${PACKAGE_FILTER}, skipping.")
201 # do nothing
202 else()
203 configure_file(${file}
204 ${CPACK_PACKAGE_DIRECTORY}/deb/${package}.txt @ONLY)
205 list(APPEND DEBIAN_PACKAGES ${package})
206 endif()
207endforeach()
208unset(DEBIAN_PACKAGE_FILES)
209
210# generate packages
211include(CMakeParseArguments)
212foreach(file ${DEBIAN_PACKAGES})
213 core_file_read_filtered(DEBIAN_METADATA ${CPACK_PACKAGE_DIRECTORY}/deb/${file}.txt)
214 string(REPLACE " " ";" DEBIAN_METADATA "${DEBIAN_METADATA}")
215 cmake_parse_arguments(DEB
216 ""
217 "PACKAGE_NAME;PACKAGE_ARCHITECTURE;PACKAGE_SECTION;PACKAGE_PRIORITY;PACKAGE_SHLIBDEPS"
218 "PACKAGE_DEPENDS;PACKAGE_RECOMMENDS;PACKAGE_SUGGESTS;PACKAGE_BREAKS;PACKAGE_REPLACES;PACKAGE_PROVIDES;PACKAGE_DESCRIPTION_HEADER;PACKAGE_DESCRIPTION_FOOTER"
219 ${DEBIAN_METADATA})
220 string(REPLACE ";" " " DEB_PACKAGE_DEPENDS "${DEB_PACKAGE_DEPENDS}")
221 string(REPLACE ";" " " DEB_PACKAGE_RECOMMENDS "${DEB_PACKAGE_RECOMMENDS}")
222 string(REPLACE ";" " " DEB_PACKAGE_SUGGESTS "${DEB_PACKAGE_SUGGESTS}")
223 string(REPLACE ";" " " DEB_PACKAGE_BREAKS "${DEB_PACKAGE_BREAKS}")
224 string(REPLACE ";" " " DEB_PACKAGE_REPLACES "${DEB_PACKAGE_REPLACES}")
225 string(REPLACE ";" " " DEB_PACKAGE_PROVIDES "${DEB_PACKAGE_PROVIDES}")
226 string(REPLACE ";" " " DEB_PACKAGE_DESCRIPTION_HEADER "${DEB_PACKAGE_DESCRIPTION_HEADER}")
227 string(REPLACE ";" " " DEB_PACKAGE_DESCRIPTION_FOOTER "${DEB_PACKAGE_DESCRIPTION_FOOTER}")
228
229 string(TOUPPER ${file} COMPONENT)
230
231 if(NOT DEB_PACKAGE_ARCHITECTURE)
232 message(STATUS "DEB Generator: Mandatory variable CPACK_DEBIAN_${COMPONENT}_PACKAGE_ARCHITECTURE is empty. Setting to ${CPACK_SYSTEM_NAME}.")
233 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_ARCHITECTURE ${CPACK_SYSTEM_NAME})
234 else()
235 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_ARCHITECTURE ${DEB_PACKAGE_ARCHITECTURE})
236 endif()
237
238 if(DEB_PACKAGE_NAME)
239 if(DEB_PACKAGE_ARCHITECTURE)
240 set(CPACK_DEBIAN_${COMPONENT}_FILE_NAME ${DEB_PACKAGE_NAME}_${PACKAGE_NAME_VERSION}_${DEB_PACKAGE_ARCHITECTURE}.deb)
241 else()
242 set(CPACK_DEBIAN_${COMPONENT}_FILE_NAME ${DEB_PACKAGE_NAME}_${PACKAGE_NAME_VERSION}_${CPACK_SYSTEM_NAME}.deb)
243 endif()
244 else()
245 message(FATAL_ERROR "DEB Generator: Mandatory variable CPACK_DEBIAN_${COMPONENT}_FILE_NAME is not set.")
246 endif()
247
248 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_SOURCE ${APP_NAME_LC})
249
250 if(DEB_PACKAGE_NAME)
251 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_NAME ${DEB_PACKAGE_NAME})
252 else()
253 message(FATAL_ERROR "DEB Generator: Mandatory variable CPACK_DEBIAN_${COMPONENT}_PACKAGE_NAME is not set.")
254 endif()
255
256 if(DEB_PACKAGE_SECTION)
257 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_SECTION ${DEB_PACKAGE_SECTION})
258 else()
259 message(FATAL_ERROR "DEB Generator: Mandatory variable CPACK_DEBIAN_${COMPONENT}_PACKAGE_SECTION is not set.")
260 endif()
261
262 if(DEB_PACKAGE_PRIORITY)
263 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_PRIORITY ${DEB_PACKAGE_PRIORITY})
264 else()
265 message(FATAL_ERROR "DEB Generator: Mandatory variable CPACK_DEBIAN_${COMPONENT}_PACKAGE_PRIORITY is not set.")
266 endif()
267
268 if(DEB_PACKAGE_SHLIBDEPS)
269 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_SHLIBDEPS ON)
270 else()
271 if(DEB_PACKAGE_DEPENDS)
272 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_DEPENDS "${DEB_PACKAGE_DEPENDS}")
273 endif()
274 endif()
275
276 if(DEB_PACKAGE_RECOMMENDS)
277 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_RECOMMENDS "${DEB_PACKAGE_RECOMMENDS}")
278 endif()
279
280 if(DEB_PACKAGE_SUGGESTS)
281 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_SUGGESTS "${DEB_PACKAGE_SUGGESTS}")
282 endif()
283
284 if(DEB_PACKAGE_BREAKS)
285 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_BREAKS "${DEB_PACKAGE_BREAKS}")
286 endif()
287
288 if(DEB_PACKAGE_REPLACES)
289 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_REPLACES "${DEB_PACKAGE_REPLACES}")
290 endif()
291
292 if(DEB_PACKAGE_PROVIDES)
293 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_PROVIDES "${DEB_PACKAGE_PROVIDES}")
294 endif()
295
296 if(NOT DEB_PACKAGE_DESCRIPTION_HEADER OR NOT DEB_PACKAGE_DESCRIPTION_FOOTER)
297 message(FATAL_ERROR "DEB Generator: Mandatory variable CPACK_COMPONENT_${COMPONENT}_DESCRIPTION is not set.")
298 else()
299 set(CPACK_COMPONENT_${COMPONENT}_DESCRIPTION "\
300${DEB_PACKAGE_DESCRIPTION_HEADER}\n\
301${CPACK_DEBIAN_PACKAGE_DESCRIPTION} \
302${DEB_PACKAGE_DESCRIPTION_FOOTER}")
303 endif()
304
305 install(FILES ${CPACK_PACKAGE_DIRECTORY}/deb/changelog.Debian.gz
306 ${CPACK_PACKAGE_DIRECTORY}/deb/NEWS.Debian.gz
307 ${PROJECT_SOURCE_DIR}/cpack/deb/copyright
308 DESTINATION share/doc/${file}
309 COMPONENT ${file})
310
311 # kodi package exclusive files
312 if(CPACK_DEBIAN_KODI_PACKAGE_NAME)
313 set(CPACK_DEBIAN_KODI_PACKAGE_CONTROL_EXTRA
314 "${PROJECT_SOURCE_DIR}/cpack/deb/postinst;${PROJECT_SOURCE_DIR}/cpack/deb/postrm")
315 install(FILES ${PROJECT_SOURCE_DIR}/cpack/deb/lintian/overrides/kodi
316 DESTINATION share/lintian/overrides
317 COMPONENT kodi)
318 install(FILES ${PROJECT_SOURCE_DIR}/cpack/deb/menu/kodi
319 DESTINATION share/menu
320 COMPONENT kodi)
321 endif()
322endforeach()
323unset(DEBIAN_PACKAGES)
324
325### source package generation specific variables
326# source generator
327set(CPACK_SOURCE_GENERATOR TGZ)
328
329# source package name
330set(CPACK_SOURCE_PACKAGE_FILE_NAME ${APP_NAME_LC}_${APP_VERSION_MAJOR}.${APP_VERSION_MINOR}~git${PACKAGE_TIMESTAMP}-${GIT_HASH}.orig)
331
332# source dir
333set(CMAKE_SOURCE_DIR ${CORE_SOURCE_DIR})
334
335# ignore files for source package
336set(CPACK_SOURCE_IGNORE_FILES
337 "/build/"
338 "/debian/"
339 "/.git/"
340 ".gitignore"
341 "yml$"
342 "~$")
343
344# unset variables
345unset(PACKAGE_TIMESTAMP)
346unset(DISTRO_CODENAME)
347
348# reference docs
349# https://cmake.org/cmake/help/latest/module/CPack.html
350# https://cmake.org/cmake/help/latest/module/CPackDeb.html
351# https://cmake.org/cmake/help/latest/module/CPackComponent.html
352include(CPack)