summaryrefslogtreecommitdiffstats
path: root/cmake/cpack/CPackConfigDEB.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/cpack/CPackConfigDEB.cmake')
-rw-r--r--cmake/cpack/CPackConfigDEB.cmake349
1 files changed, 349 insertions, 0 deletions
diff --git a/cmake/cpack/CPackConfigDEB.cmake b/cmake/cpack/CPackConfigDEB.cmake
new file mode 100644
index 0000000..800daa5
--- /dev/null
+++ b/cmake/cpack/CPackConfigDEB.cmake
@@ -0,0 +1,349 @@
1# include Macros.cmake to automate generation of time/date stamps, maintainer, etc.
2include(${CMAKE_SOURCE_DIR}/cmake/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})
76
77# package version
78if(DEBIAN_PACKAGE_EPOCH)
79 set(CPACK_DEBIAN_PACKAGE_VERSION ${DEBIAN_PACKAGE_EPOCH}:${PACKAGE_NAME_VERSION})
80else()
81 set(CPACK_DEBIAN_PACKAGE_VERSION 2:${PACKAGE_NAME_VERSION})
82endif()
83
84# architecture
85if(NOT CPACK_DEBIAN_PACKAGE_ARCHITECTURE)
86 if(NOT DPKG_CMD)
87 message(WARNING "DEB Generator: Can't find dpkg in your path. Setting CPACK_DEBIAN_PACKAGE_ARCHITECTURE to i386.")
88 set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE i386)
89 endif()
90 execute_process(COMMAND "${DPKG_CMD}" --print-architecture
91 OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE
92 OUTPUT_STRIP_TRAILING_WHITESPACE)
93endif()
94
95# package maintainer
96if(NOT CPACK_DEBIAN_PACKAGE_MAINTAINER)
97 userstamp()
98 set(CPACK_DEBIAN_PACKAGE_MAINTAINER ${PACKAGE_MAINTAINER})
99 unset(PACKAGE_MAINTAINER)
100endif()
101
102# package description common to all packages
103if(NOT CPACK_DEBIAN_PACKAGE_DESCRIPTION)
104 file(STRINGS ${CMAKE_SOURCE_DIR}/cmake/cpack/deb/package-description.txt DESC_LINES)
105 foreach(LINE IN LISTS DESC_LINES)
106 set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "${CPACK_DEBIAN_PACKAGE_DESCRIPTION} ${LINE}\n")
107 endforeach()
108endif()
109
110# package homepage
111if(NOT CPACK_DEBIAN_PACKAGE_HOMEPAGE)
112 set(CPACK_DEBIAN_PACKAGE_HOMEPAGE ${APP_WEBSITE})
113endif()
114
115# generate a Debian compliant changelog
116set(CHANGELOG_HEADER "${APP_NAME_LC} (${CPACK_DEBIAN_PACKAGE_VERSION}) ${DISTRO_CODENAME}\; urgency=high")
117rfc2822stamp()
118# two spaces between maintainer and timestamp is NOT a mistake
119set(CHANGELOG_FOOTER " -- ${CPACK_DEBIAN_PACKAGE_MAINTAINER} ${RFC2822_TIMESTAMP}")
120
121if(GIT_FOUND AND GZIP_CMD AND EXISTS ${CMAKE_SOURCE_DIR}/.git)
122 execute_process(COMMAND ${GIT_EXECUTABLE} log --no-merges --pretty=format:"%n [%an]%n * %s" --since="30 days ago"
123 OUTPUT_VARIABLE CHANGELOG
124 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
125 OUTPUT_STRIP_TRAILING_WHITESPACE)
126 string(REPLACE "\"" "" CHANGELOG ${CHANGELOG})
127 file(WRITE ${CPACK_PACKAGE_DIRECTORY}/deb/changelog.Debian ${CHANGELOG_HEADER}\n${CHANGELOG}\n\n${CHANGELOG_FOOTER})
128 execute_process(COMMAND ${GZIP_CMD} -f -9 -n ${CPACK_PACKAGE_DIRECTORY}/deb/changelog.Debian)
129 unset(CHANGELOG_HEADER)
130 unset(CHANGELOG_FOOTER)
131 unset(RFC2822_TIMESTAMP)
132else()
133 message(WARNING "DEB Generator: Can't find git and/or gzip in your path. DEB packages will be missing changelog.Debian.gz.")
134endif()
135
136# Generate NEWS.Debian
137configure_file(${CMAKE_SOURCE_DIR}/cmake/cpack/deb/NEWS.Debian
138 ${CPACK_PACKAGE_DIRECTORY}/deb/NEWS.Debian @ONLY)
139if(GZIP_CMD)
140 execute_process(COMMAND ${GZIP_CMD} -f -9 -n ${CPACK_PACKAGE_DIRECTORY}/deb/NEWS.Debian)
141else()
142 message(WARNING "DEB Generator: Can't find gzip in your path. DEB packages will be missing NEWS.Debian.")
143endif()
144
145# Generate man pages
146configure_file(${CMAKE_SOURCE_DIR}/docs/manpages/kodi.bin.1
147 ${CPACK_PACKAGE_DIRECTORY}/deb/kodi.1 COPYONLY)
148configure_file(${CMAKE_SOURCE_DIR}/docs/manpages/kodi.bin.1
149 ${CPACK_PACKAGE_DIRECTORY}/deb/kodi.bin.1 COPYONLY)
150configure_file(${CMAKE_SOURCE_DIR}/docs/manpages/kodi-standalone.1
151 ${CPACK_PACKAGE_DIRECTORY}/deb/kodi-standalone.1 COPYONLY)
152if(ENABLE_EVENTCLIENTS)
153 configure_file(${CMAKE_SOURCE_DIR}/docs/manpages/kodi-ps3remote.1
154 ${CPACK_PACKAGE_DIRECTORY}/deb/kodi-ps3remote.1 COPYONLY)
155 configure_file(${CMAKE_SOURCE_DIR}/docs/manpages/kodi-send.1
156 ${CPACK_PACKAGE_DIRECTORY}/deb/kodi-send.1 COPYONLY)
157 configure_file(${CMAKE_SOURCE_DIR}/docs/manpages/kodi-wiiremote.1
158 ${CPACK_PACKAGE_DIRECTORY}/deb/kodi-wiiremote.1 COPYONLY)
159endif()
160
161if(GZIP_CMD)
162 execute_process(COMMAND ${GZIP_CMD} -f -9 -n ${CPACK_PACKAGE_DIRECTORY}/deb/kodi.1)
163 execute_process(COMMAND ${GZIP_CMD} -f -9 -n ${CPACK_PACKAGE_DIRECTORY}/deb/kodi.bin.1)
164 execute_process(COMMAND ${GZIP_CMD} -f -9 -n ${CPACK_PACKAGE_DIRECTORY}/deb/kodi-standalone.1)
165 if(ENABLE_EVENTCLIENTS)
166 execute_process(COMMAND ${GZIP_CMD} -f -9 -n ${CPACK_PACKAGE_DIRECTORY}/deb/kodi-ps3remote.1)
167 execute_process(COMMAND ${GZIP_CMD} -f -9 -n ${CPACK_PACKAGE_DIRECTORY}/deb/kodi-send.1)
168 execute_process(COMMAND ${GZIP_CMD} -f -9 -n ${CPACK_PACKAGE_DIRECTORY}/deb/kodi-wiiremote.1)
169 endif()
170else()
171 message(WARNING "DEB Generator: Can't find gzip in your path. Several DEB packages will be missing man pages.")
172endif()
173
174install(FILES ${CPACK_PACKAGE_DIRECTORY}/deb/kodi.1.gz
175 ${CPACK_PACKAGE_DIRECTORY}/deb/kodi.bin.1.gz
176 ${CPACK_PACKAGE_DIRECTORY}/deb/kodi-standalone.1.gz
177 DESTINATION share/man/man1
178 COMPONENT kodi)
179if(ENABLE_EVENTCLIENTS)
180install(FILES ${CPACK_PACKAGE_DIRECTORY}/deb/kodi-ps3remote.1.gz
181 DESTINATION share/man/man1
182 COMPONENT kodi-eventclients-ps3)
183install(FILES ${CPACK_PACKAGE_DIRECTORY}/deb/kodi-send.1.gz
184 DESTINATION share/man/man1
185 COMPONENT kodi-eventclients-xbmc-send)
186install(FILES ${CPACK_PACKAGE_DIRECTORY}/deb/kodi-wiiremote.1.gz
187 DESTINATION share/man/man1
188 COMPONENT kodi-eventclients-wiiremote)
189endif()
190
191# configure package metadata files
192file(GLOB DEBIAN_PACKAGE_FILES ${CMAKE_SOURCE_DIR}/cmake/cpack/deb/packages/*.txt.in)
193foreach(file ${DEBIAN_PACKAGE_FILES})
194 get_filename_component(package ${file} NAME_WE)
195 # filter eventclients so we don't have to support two more deps
196 # (libbluetooth-dev and libcwiid-dev) just because of wii-remote
197 string(SUBSTRING ${package} 0 17 PACKAGE_FILTER)
198 if(NOT ENABLE_EVENTCLIENTS AND PACKAGE_FILTER STREQUAL kodi-eventclients)
199 message(STATUS "DEB Generator: ${package} matches ${PACKAGE_FILTER}, skipping.")
200 # do nothing
201 else()
202 configure_file(${file}
203 ${CPACK_PACKAGE_DIRECTORY}/deb/${package}.txt @ONLY)
204 list(APPEND DEBIAN_PACKAGES ${package})
205 endif()
206endforeach()
207unset(DEBIAN_PACKAGE_FILES)
208
209# generate packages
210include(CMakeParseArguments)
211foreach(file ${DEBIAN_PACKAGES})
212 core_file_read_filtered(DEBIAN_METADATA ${CPACK_PACKAGE_DIRECTORY}/deb/${file}.txt)
213 string(REPLACE " " ";" DEBIAN_METADATA "${DEBIAN_METADATA}")
214 cmake_parse_arguments(DEB
215 ""
216 "PACKAGE_NAME;PACKAGE_ARCHITECTURE;PACKAGE_SECTION;PACKAGE_PRIORITY;PACKAGE_SHLIBDEPS"
217 "PACKAGE_DEPENDS;PACKAGE_RECOMMENDS;PACKAGE_SUGGESTS;PACKAGE_BREAKS;PACKAGE_REPLACES;PACKAGE_PROVIDES;PACKAGE_DESCRIPTION_HEADER;PACKAGE_DESCRIPTION_FOOTER"
218 ${DEBIAN_METADATA})
219 string(REPLACE ";" " " DEB_PACKAGE_DEPENDS "${DEB_PACKAGE_DEPENDS}")
220 string(REPLACE ";" " " DEB_PACKAGE_RECOMMENDS "${DEB_PACKAGE_RECOMMENDS}")
221 string(REPLACE ";" " " DEB_PACKAGE_SUGGESTS "${DEB_PACKAGE_SUGGESTS}")
222 string(REPLACE ";" " " DEB_PACKAGE_BREAKS "${DEB_PACKAGE_BREAKS}")
223 string(REPLACE ";" " " DEB_PACKAGE_REPLACES "${DEB_PACKAGE_REPLACES}")
224 string(REPLACE ";" " " DEB_PACKAGE_PROVIDES "${DEB_PACKAGE_PROVIDES}")
225 string(REPLACE ";" " " DEB_PACKAGE_DESCRIPTION_HEADER "${DEB_PACKAGE_DESCRIPTION_HEADER}")
226 string(REPLACE ";" " " DEB_PACKAGE_DESCRIPTION_FOOTER "${DEB_PACKAGE_DESCRIPTION_FOOTER}")
227
228 string(TOUPPER ${file} COMPONENT)
229
230 if(NOT DEB_PACKAGE_ARCHITECTURE)
231 message(STATUS "DEB Generator: Mandatory variable CPACK_DEBIAN_${COMPONENT}_PACKAGE_ARCHITECTURE is empty. Setting to ${CPACK_SYSTEM_NAME}.")
232 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_ARCHITECTURE ${CPACK_SYSTEM_NAME})
233 else()
234 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_ARCHITECTURE ${DEB_PACKAGE_ARCHITECTURE})
235 endif()
236
237 if(DEB_PACKAGE_NAME)
238 if(DEB_PACKAGE_ARCHITECTURE)
239 set(CPACK_DEBIAN_${COMPONENT}_FILE_NAME ${DEB_PACKAGE_NAME}_${PACKAGE_NAME_VERSION}_${DEB_PACKAGE_ARCHITECTURE}.deb)
240 else()
241 set(CPACK_DEBIAN_${COMPONENT}_FILE_NAME ${DEB_PACKAGE_NAME}_${PACKAGE_NAME_VERSION}_${CPACK_SYSTEM_NAME}.deb)
242 endif()
243 else()
244 message(FATAL_ERROR "DEB Generator: Mandatory variable CPACK_DEBIAN_${COMPONENT}_FILE_NAME is not set.")
245 endif()
246
247 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_SOURCE ${APP_NAME_LC})
248
249 if(DEB_PACKAGE_NAME)
250 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_NAME ${DEB_PACKAGE_NAME})
251 else()
252 message(FATAL_ERROR "DEB Generator: Mandatory variable CPACK_DEBIAN_${COMPONENT}_PACKAGE_NAME is not set.")
253 endif()
254
255 if(DEB_PACKAGE_SECTION)
256 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_SECTION ${DEB_PACKAGE_SECTION})
257 else()
258 message(FATAL_ERROR "DEB Generator: Mandatory variable CPACK_DEBIAN_${COMPONENT}_PACKAGE_SECTION is not set.")
259 endif()
260
261 if(DEB_PACKAGE_PRIORITY)
262 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_PRIORITY ${DEB_PACKAGE_PRIORITY})
263 else()
264 message(FATAL_ERROR "DEB Generator: Mandatory variable CPACK_DEBIAN_${COMPONENT}_PACKAGE_PRIORITY is not set.")
265 endif()
266
267 if(DEB_PACKAGE_SHLIBDEPS)
268 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_SHLIBDEPS ON)
269 endif()
270
271 if(DEB_PACKAGE_DEPENDS)
272 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_DEPENDS "${DEB_PACKAGE_DEPENDS}")
273 endif()
274
275 if(DEB_PACKAGE_RECOMMENDS)
276 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_RECOMMENDS "${DEB_PACKAGE_RECOMMENDS}")
277 endif()
278
279 if(DEB_PACKAGE_SUGGESTS)
280 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_SUGGESTS "${DEB_PACKAGE_SUGGESTS}")
281 endif()
282
283 if(DEB_PACKAGE_BREAKS)
284 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_BREAKS "${DEB_PACKAGE_BREAKS}")
285 endif()
286
287 if(DEB_PACKAGE_REPLACES)
288 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_REPLACES "${DEB_PACKAGE_REPLACES}")
289 endif()
290
291 if(DEB_PACKAGE_PROVIDES)
292 set(CPACK_DEBIAN_${COMPONENT}_PACKAGE_PROVIDES "${DEB_PACKAGE_PROVIDES}")
293 endif()
294
295 if(NOT DEB_PACKAGE_DESCRIPTION_HEADER OR NOT DEB_PACKAGE_DESCRIPTION_FOOTER)
296 message(FATAL_ERROR "DEB Generator: Mandatory variable CPACK_COMPONENT_${COMPONENT}_DESCRIPTION is not set.")
297 else()
298 set(CPACK_COMPONENT_${COMPONENT}_DESCRIPTION "\
299${DEB_PACKAGE_DESCRIPTION_HEADER}\n\
300${CPACK_DEBIAN_PACKAGE_DESCRIPTION} \
301${DEB_PACKAGE_DESCRIPTION_FOOTER}")
302 endif()
303
304 install(FILES ${CPACK_PACKAGE_DIRECTORY}/deb/changelog.Debian.gz
305 ${CPACK_PACKAGE_DIRECTORY}/deb/NEWS.Debian.gz
306 ${CMAKE_SOURCE_DIR}/cmake/cpack/deb/copyright
307 DESTINATION share/doc/${file}
308 COMPONENT ${file})
309
310 # kodi package exclusive files
311 if(CPACK_DEBIAN_KODI_PACKAGE_NAME)
312 set(CPACK_DEBIAN_KODI_PACKAGE_CONTROL_EXTRA
313 "${CMAKE_SOURCE_DIR}/cmake/cpack/deb/postinst;${CMAKE_SOURCE_DIR}/cmake/cpack/deb/postrm")
314 install(FILES ${CMAKE_SOURCE_DIR}/cmake/cpack/deb/lintian/overrides/kodi
315 DESTINATION share/lintian/overrides
316 COMPONENT kodi)
317 install(FILES ${CMAKE_SOURCE_DIR}/cmake/cpack/deb/menu/kodi
318 DESTINATION share/menu
319 COMPONENT kodi)
320 endif()
321endforeach()
322unset(DEBIAN_PACKAGES)
323
324### source package generation specific variables
325# source generator
326set(CPACK_SOURCE_GENERATOR TGZ)
327
328# source package name
329set(CPACK_SOURCE_PACKAGE_FILE_NAME ${APP_NAME_LC}_${APP_VERSION_MAJOR}.${APP_VERSION_MINOR}~git${PACKAGE_TIMESTAMP}-${RELEASE_IDENTIFIER}.orig)
330unset(RELEASE_IDENTIFIER)
331
332# ignore files for source package
333set(CPACK_SOURCE_IGNORE_FILES
334 "/build/"
335 "/debian/"
336 "/.git/"
337 ".gitignore"
338 "yml$"
339 "~$")
340
341# unset variables
342unset(PACKAGE_TIMESTAMP)
343unset(DISTRO_CODENAME)
344
345# reference docs
346# https://cmake.org/cmake/help/latest/module/CPack.html
347# https://cmake.org/cmake/help/latest/module/CPackDeb.html
348# https://cmake.org/cmake/help/latest/module/CPackComponent.html
349include(CPack)