CPackDeb.cmake 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. ##section Variables specific to CPack Debian (DEB) generator
  2. ##end
  3. ##module
  4. # - The builtin (binary) CPack Deb generator (Unix only)
  5. # CPackDeb may be used to create Deb package using CPack.
  6. # CPackDeb is a CPack generator thus it uses the CPACK_XXX variables
  7. # used by CPack : http://www.cmake.org/Wiki/CMake:CPackConfiguration.
  8. # CPackDeb generator should work on any linux host but it will
  9. # produce better deb package when Debian specific tools 'dpkg-xxx'
  10. # are usable on the build system.
  11. #
  12. # CPackDeb has specific features which are controlled by
  13. # the specifics CPACK_DEBIAN_XXX variables.You'll find a detailed usage on
  14. # the wiki:
  15. # http://www.cmake.org/Wiki/CMake:CPackPackageGenerators#DEB_.28UNIX_only.29
  16. # However as a handy reminder here comes the list of specific variables:
  17. ##end
  18. #
  19. ##variable
  20. # CPACK_DEBIAN_PACKAGE_NAME
  21. # Mandatory : YES
  22. # Default : CPACK_PACKAGE_NAME (lower case)
  23. # The debian package summary
  24. ##end
  25. ##variable
  26. # CPACK_DEBIAN_PACKAGE_VERSION
  27. # Mandatory : YES
  28. # Default : CPACK_PACKAGE_VERSION
  29. # The debian package version
  30. ##end
  31. ##variable
  32. # CPACK_DEBIAN_PACKAGE_ARCHITECTURE
  33. # Mandatory : YES
  34. # Default : Output of dpkg --print-architecture (or i386 if dpkg is not found)
  35. # The debian package architecture
  36. ##end
  37. ##variable
  38. # CPACK_DEBIAN_PACKAGE_DEPENDS
  39. # Mandatory : NO
  40. # Default : -
  41. # May be used to set deb dependencies.
  42. ##end
  43. ##variable
  44. # CPACK_DEBIAN_PACKAGE_MAINTAINER
  45. # Mandatory : YES
  46. # Default : CPACK_PACKAGE_CONTACT
  47. # The debian package maintainer
  48. ##end
  49. ##variable
  50. # CPACK_DEBIAN_PACKAGE_DESCRIPTION
  51. # Mandatory : YES
  52. # Default : CPACK_PACKAGE_DESCRIPTION_SUMMARY
  53. # The debian package description
  54. ##end
  55. ##variable
  56. # CPACK_DEBIAN_PACKAGE_SECTION
  57. # Mandatory : YES
  58. # Default : 'devel'
  59. # The debian package section
  60. ##end
  61. ##variable
  62. # CPACK_DEBIAN_PACKAGE_PRIORITY
  63. # Mandatory : YES
  64. # Default : 'optional'
  65. # The debian package priority
  66. ##end
  67. ##variable
  68. # CPACK_DEBIAN_PACKAGE_HOMEPAGE
  69. # Mandatory : NO
  70. # Default : -
  71. # The URL of the web site for this package
  72. ##end
  73. ##variable
  74. # CPACK_DEBIAN_PACKAGE_SHLIBDEPS
  75. # Mandatory : NO
  76. # Default : OFF
  77. # May be set to ON in order to use dpkg-shlibdeps to generate
  78. # better package dependency list.
  79. # You may need set CMAKE_INSTALL_RPATH toi appropriate value
  80. # if you use this feature, because if you don't dpkg-shlibdeps
  81. # may fail to find your own shared libs.
  82. # See http://www.cmake.org/Wiki/CMake_RPATH_handling.
  83. ##end
  84. ##variable
  85. # CPACK_DEBIAN_PACKAGE_DEBUG
  86. # Mandatory : NO
  87. # Default : -
  88. # May be set when invoking cpack in order to trace debug information
  89. # during CPackDeb run.
  90. ##end
  91. ##variable
  92. # CPACK_DEBIAN_PACKAGE_PREDEPENDS
  93. # Mandatory : NO
  94. # Default : -
  95. # see http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
  96. # This field is like Depends, except that it also forces dpkg to complete installation of
  97. # the packages named before even starting the installation of the package which declares
  98. # the pre-dependency.
  99. ##end
  100. ##variable
  101. # CPACK_DEBIAN_PACKAGE_ENHANCES
  102. # Mandatory : NO
  103. # Default : -
  104. # see http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
  105. # This field is similar to Suggests but works in the opposite direction.
  106. # It is used to declare that a package can enhance the functionality of another package.
  107. ##end
  108. ##variable
  109. # CPACK_DEBIAN_PACKAGE_BREAKS
  110. # Mandatory : NO
  111. # Default : -
  112. # see http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
  113. # When one binary package declares that it breaks another, dpkg will refuse to allow the
  114. # package which declares Breaks be installed unless the broken package is deconfigured first,
  115. # and it will refuse to allow the broken package to be reconfigured.
  116. ##end
  117. ##variable
  118. # CPACK_DEBIAN_PACKAGE_CONFLICTS
  119. # Mandatory : NO
  120. # Default : -
  121. # see http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
  122. # When one binary package declares a conflict with another using a Conflicts field,
  123. # dpkg will refuse to allow them to be installed on the system at the same time.
  124. ##end
  125. ##variable
  126. # CPACK_DEBIAN_PACKAGE_PROVIDES
  127. # Mandatory : NO
  128. # Default : -
  129. # see http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
  130. # A virtual package is one which appears in the Provides control field of another package.
  131. ##end
  132. ##variable
  133. # CPACK_DEBIAN_PACKAGE_REPLACES
  134. # Mandatory : NO
  135. # Default : -
  136. # see http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
  137. # Packages can declare in their control file that they should overwrite
  138. # files in certain other packages, or completely replace other packages.
  139. ##end
  140. #=============================================================================
  141. # Copyright 2007-2009 Kitware, Inc.
  142. # Copyright 2007-2009 Mathieu Malaterre <[email protected]>
  143. #
  144. # Distributed under the OSI-approved BSD License (the "License");
  145. # see accompanying file Copyright.txt for details.
  146. #
  147. # This software is distributed WITHOUT ANY WARRANTY; without even the
  148. # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  149. # See the License for more information.
  150. #=============================================================================
  151. # (To distribute this file outside of CMake, substitute the full
  152. # License text for the above reference.)
  153. # CPack script for creating Debian package
  154. # Author: Mathieu Malaterre
  155. #
  156. # http://wiki.debian.org/HowToPackageForDebian
  157. IF(CMAKE_BINARY_DIR)
  158. MESSAGE(FATAL_ERROR "CPackDeb.cmake may only be used by CPack internally.")
  159. ENDIF(CMAKE_BINARY_DIR)
  160. IF(NOT UNIX)
  161. MESSAGE(FATAL_ERROR "CPackDeb.cmake may only be used under UNIX.")
  162. ENDIF(NOT UNIX)
  163. # CPACK_DEBIAN_PACKAGE_SHLIBDEPS
  164. # If specify OFF, only user depends are used
  165. IF(NOT DEFINED CPACK_DEBIAN_PACKAGE_SHLIBDEPS)
  166. SET(CPACK_DEBIAN_PACKAGE_SHLIBDEPS OFF)
  167. ENDIF(NOT DEFINED CPACK_DEBIAN_PACKAGE_SHLIBDEPS)
  168. FIND_PROGRAM(FAKEROOT_EXECUTABLE fakeroot)
  169. IF(FAKEROOT_EXECUTABLE)
  170. SET(CPACK_DEBIAN_FAKEROOT_EXECUTABLE ${FAKEROOT_EXECUTABLE})
  171. ENDIF(FAKEROOT_EXECUTABLE)
  172. IF(CPACK_DEBIAN_PACKAGE_SHLIBDEPS)
  173. # dpkg-shlibdeps is a Debian utility for generating dependency list
  174. FIND_PROGRAM(SHLIBDEPS_EXECUTABLE dpkg-shlibdeps)
  175. # Check version of the dpkg-shlibdeps tool using CPackRPM method
  176. IF(SHLIBDEPS_EXECUTABLE)
  177. EXECUTE_PROCESS(COMMAND ${SHLIBDEPS_EXECUTABLE} --version
  178. OUTPUT_VARIABLE _TMP_VERSION
  179. ERROR_QUIET
  180. OUTPUT_STRIP_TRAILING_WHITESPACE)
  181. STRING(REGEX MATCH "dpkg-shlibdeps version ([0-9]+\\.[0-9]+\\.[0-9]+)"
  182. SHLIBDEPS_EXECUTABLE_VERSION
  183. ${_TMP_VERSION})
  184. SET(SHLIBDEPS_EXECUTABLE_VERSION "${CMAKE_MATCH_1}")
  185. IF(CPACK_DEBIAN_PACKAGE_DEBUG)
  186. MESSAGE( "CPackDeb Debug: dpkg-shlibdeps version is <${SHLIBDEPS_EXECUTABLE_VERSION}>")
  187. ENDIF(CPACK_DEBIAN_PACKAGE_DEBUG)
  188. # Generating binary list - Get type of all install files
  189. EXECUTE_PROCESS(COMMAND find -type f
  190. COMMAND xargs file
  191. WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
  192. OUTPUT_VARIABLE CPACK_DEB_INSTALL_FILES)
  193. # Convert to CMake list
  194. STRING(REGEX REPLACE "\n" ";" CPACK_DEB_INSTALL_FILES ${CPACK_DEB_INSTALL_FILES})
  195. # Only dynamically linked ELF files are included
  196. # Extract only file name infront of ":"
  197. FOREACH ( _FILE ${CPACK_DEB_INSTALL_FILES})
  198. IF ( ${_FILE} MATCHES "ELF.*dynamically linked")
  199. STRING(REGEX MATCH "(^.*):" _FILE_NAME ${_FILE})
  200. LIST(APPEND CPACK_DEB_BINARY_FILES ${CMAKE_MATCH_1})
  201. ENDIF()
  202. ENDFOREACH()
  203. MESSAGE( "CPackDeb: - Generating dependency list")
  204. # Create blank control file for running dpkg-shlibdeps
  205. # There might be some other way to invoke dpkg-shlibdeps without creating this file
  206. # but standard debian package should not have anything that can collide with this file or directory
  207. FILE(MAKE_DIRECTORY ${CPACK_TEMPORARY_DIRECTORY}/debian)
  208. FILE(WRITE ${CPACK_TEMPORARY_DIRECTORY}/debian/control "")
  209. # Execute dpkg-shlibdeps
  210. # --ignore-missing-info : allow dpkg-shlibdeps to run even if some libs do not belong to a package
  211. # -O : print to STDOUT
  212. EXECUTE_PROCESS(COMMAND ${SHLIBDEPS_EXECUTABLE} --ignore-missing-info -O ${CPACK_DEB_BINARY_FILES}
  213. WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
  214. OUTPUT_VARIABLE SHLIBDEPS_OUTPUT
  215. RESULT_VARIABLE SHLIBDEPS_RESULT
  216. ERROR_VARIABLE SHLIBDEPS_ERROR
  217. OUTPUT_STRIP_TRAILING_WHITESPACE )
  218. IF(CPACK_DEBIAN_PACKAGE_DEBUG)
  219. # dpkg-shlibdeps will throw some warnings if some input files are not binary
  220. MESSAGE( "CPackDeb Debug: dpkg-shlibdeps warnings \n${SHLIBDEPS_ERROR}")
  221. ENDIF(CPACK_DEBIAN_PACKAGE_DEBUG)
  222. IF (NOT SHLIBDEPS_RESULT EQUAL 0)
  223. MESSAGE (FATAL_ERROR "CPackDeb: dpkg-shlibdeps: ${SHLIBDEPS_ERROR}")
  224. ENDIF (NOT SHLIBDEPS_RESULT EQUAL 0)
  225. #Get rid of prefix generated by dpkg-shlibdeps
  226. string (REGEX REPLACE "^.*Depends=" "" CPACK_DEBIAN_PACKAGE_AUTO_DEPENDS ${SHLIBDEPS_OUTPUT})
  227. IF(CPACK_DEBIAN_PACKAGE_DEBUG)
  228. MESSAGE( "CPackDeb Debug: Found dependency: ${CPACK_DEBIAN_PACKAGE_AUTO_DEPENDS}")
  229. ENDIF(CPACK_DEBIAN_PACKAGE_DEBUG)
  230. # Remove blank control file
  231. # Might not be safe if package actual contain file or directory named debian
  232. FILE(REMOVE_RECURSE "${CPACK_TEMPORARY_DIRECTORY}/debian")
  233. # Append user depend if set
  234. IF (CPACK_DEBIAN_PACKAGE_DEPENDS)
  235. SET (CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_AUTO_DEPENDS}, ${CPACK_DEBIAN_PACKAGE_DEPENDS}")
  236. ELSE (CPACK_DEBIAN_PACKAGE_DEPENDS)
  237. SET (CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_AUTO_DEPENDS}")
  238. ENDIF (CPACK_DEBIAN_PACKAGE_DEPENDS)
  239. ELSE (SHLIBDEPS_EXECUTABLE)
  240. IF(CPACK_DEBIAN_PACKAGE_DEBUG)
  241. MESSAGE( "CPackDeb Debug: Using only user-provided depends because dpkg-shlibdeps is not found.")
  242. ENDIF(CPACK_DEBIAN_PACKAGE_DEBUG)
  243. ENDIF(SHLIBDEPS_EXECUTABLE)
  244. ELSE (CPACK_DEBIAN_PACKAGE_SHLIBDEPS)
  245. IF(CPACK_DEBIAN_PACKAGE_DEBUG)
  246. MESSAGE( "CPackDeb Debug: Using only user-provided depends")
  247. ENDIF(CPACK_DEBIAN_PACKAGE_DEBUG)
  248. ENDIF(CPACK_DEBIAN_PACKAGE_SHLIBDEPS)
  249. # Let's define the control file found in debian package:
  250. # Binary package:
  251. # http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-binarycontrolfiles
  252. # DEBIAN/control
  253. # debian policy enforce lower case for package name
  254. # Package: (mandatory)
  255. IF(NOT CPACK_DEBIAN_PACKAGE_NAME)
  256. STRING(TOLOWER "${CPACK_PACKAGE_NAME}" CPACK_DEBIAN_PACKAGE_NAME)
  257. ENDIF(NOT CPACK_DEBIAN_PACKAGE_NAME)
  258. # Version: (mandatory)
  259. IF(NOT CPACK_DEBIAN_PACKAGE_VERSION)
  260. IF(NOT CPACK_PACKAGE_VERSION)
  261. MESSAGE(FATAL_ERROR "CPackDeb: Debian package requires a package version")
  262. ENDIF(NOT CPACK_PACKAGE_VERSION)
  263. SET(CPACK_DEBIAN_PACKAGE_VERSION ${CPACK_PACKAGE_VERSION})
  264. ENDIF(NOT CPACK_DEBIAN_PACKAGE_VERSION)
  265. # Architecture: (mandatory)
  266. IF(NOT CPACK_DEBIAN_PACKAGE_ARCHITECTURE)
  267. # There is no such thing as i686 architecture on debian, you should use i386 instead
  268. # $ dpkg --print-architecture
  269. FIND_PROGRAM(DPKG_CMD dpkg)
  270. IF(NOT DPKG_CMD)
  271. MESSAGE(STATUS "CPackDeb: Can not find dpkg in your path, default to i386.")
  272. SET(CPACK_DEBIAN_PACKAGE_ARCHITECTURE i386)
  273. ENDIF(NOT DPKG_CMD)
  274. EXECUTE_PROCESS(COMMAND "${DPKG_CMD}" --print-architecture
  275. OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE
  276. OUTPUT_STRIP_TRAILING_WHITESPACE
  277. )
  278. ENDIF(NOT CPACK_DEBIAN_PACKAGE_ARCHITECTURE)
  279. # have a look at GET_PROPERTY(result GLOBAL PROPERTY ENABLED_FEATURES),
  280. # this returns the successful FIND_PACKAGE() calls, maybe this can help
  281. # Depends:
  282. # You should set: DEBIAN_PACKAGE_DEPENDS
  283. # TODO: automate 'objdump -p | grep NEEDED'
  284. IF(NOT CPACK_DEBIAN_PACKAGE_DEPENDS)
  285. MESSAGE(STATUS "CPACK_DEBIAN_PACKAGE_DEPENDS not set, the package will have no dependencies.")
  286. ENDIF(NOT CPACK_DEBIAN_PACKAGE_DEPENDS)
  287. # Maintainer: (mandatory)
  288. IF(NOT CPACK_DEBIAN_PACKAGE_MAINTAINER)
  289. IF(NOT CPACK_PACKAGE_CONTACT)
  290. MESSAGE(FATAL_ERROR "CPackDeb: Debian package requires a maintainer for a package, set CPACK_PACKAGE_CONTACT or CPACK_DEBIAN_PACKAGE_MAINTAINER")
  291. ENDIF(NOT CPACK_PACKAGE_CONTACT)
  292. SET(CPACK_DEBIAN_PACKAGE_MAINTAINER ${CPACK_PACKAGE_CONTACT})
  293. ENDIF(NOT CPACK_DEBIAN_PACKAGE_MAINTAINER)
  294. # Description: (mandatory)
  295. IF(NOT CPACK_DEBIAN_PACKAGE_DESCRIPTION)
  296. IF(NOT CPACK_PACKAGE_DESCRIPTION_SUMMARY)
  297. MESSAGE(FATAL_ERROR "CPackDeb: Debian package requires a summary for a package, set CPACK_PACKAGE_DESCRIPTION_SUMMARY or CPACK_DEBIAN_PACKAGE_DESCRIPTION")
  298. ENDIF(NOT CPACK_PACKAGE_DESCRIPTION_SUMMARY)
  299. SET(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${CPACK_PACKAGE_DESCRIPTION_SUMMARY})
  300. ENDIF(NOT CPACK_DEBIAN_PACKAGE_DESCRIPTION)
  301. # Section: (recommended)
  302. IF(NOT CPACK_DEBIAN_PACKAGE_SECTION)
  303. SET(CPACK_DEBIAN_PACKAGE_SECTION "devel")
  304. ENDIF(NOT CPACK_DEBIAN_PACKAGE_SECTION)
  305. # Priority: (recommended)
  306. IF(NOT CPACK_DEBIAN_PACKAGE_PRIORITY)
  307. SET(CPACK_DEBIAN_PACKAGE_PRIORITY "optional")
  308. ENDIF(NOT CPACK_DEBIAN_PACKAGE_PRIORITY )
  309. # Recommends:
  310. # You should set: CPACK_DEBIAN_PACKAGE_RECOMMENDS
  311. # Suggests:
  312. # You should set: CPACK_DEBIAN_PACKAGE_SUGGESTS
  313. # CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
  314. # This variable allow advanced user to add custom script to the control.tar.gz (inside the .deb archive)
  315. # Typical examples are:
  316. # - conffiles
  317. # - postinst
  318. # - postrm
  319. # - prerm"
  320. # Usage:
  321. # SET(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
  322. # "${CMAKE_CURRENT_SOURCE_DIR/prerm;${CMAKE_CURRENT_SOURCE_DIR}/postrm")
  323. # Are we packaging components ?
  324. IF(CPACK_DEB_PACKAGE_COMPONENT)
  325. SET(CPACK_DEB_PACKAGE_COMPONENT_PART_NAME "-${CPACK_DEB_PACKAGE_COMPONENT}")
  326. SET(CPACK_DEB_PACKAGE_COMPONENT_PART_PATH "/${CPACK_DEB_PACKAGE_COMPONENT}")
  327. SET(WDIR "${CPACK_TOPLEVEL_DIRECTORY}/${CPACK_PACKAGE_FILE_NAME}/${CPACK_DEB_PACKAGE_COMPONENT}")
  328. STRING(TOLOWER "${CPACK_PACKAGE_NAME}${CPACK_DEB_PACKAGE_COMPONENT_PART_NAME}" CPACK_DEBIAN_PACKAGE_NAME)
  329. ELSE(CPACK_DEB_PACKAGE_COMPONENT)
  330. SET(CPACK_DEB_PACKAGE_COMPONENT_PART_NAME "")
  331. SET(CPACK_DEB_PACKAGE_COMPONENT_PART_PATH "")
  332. SET(WDIR "${CPACK_TOPLEVEL_DIRECTORY}/${CPACK_PACKAGE_FILE_NAME}")
  333. ENDIF(CPACK_DEB_PACKAGE_COMPONENT)
  334. # Print out some debug information if we were asked for that
  335. IF(CPACK_DEBIAN_PACKAGE_DEBUG)
  336. MESSAGE("CPackDeb:Debug: CPACK_TOPLEVEL_DIRECTORY = ${CPACK_TOPLEVEL_DIRECTORY}")
  337. MESSAGE("CPackDeb:Debug: CPACK_TOPLEVEL_TAG = ${CPACK_TOPLEVEL_TAG}")
  338. MESSAGE("CPackDeb:Debug: CPACK_TEMPORARY_DIRECTORY = ${CPACK_TEMPORARY_DIRECTORY}")
  339. MESSAGE("CPackDeb:Debug: CPACK_OUTPUT_FILE_NAME = ${CPACK_OUTPUT_FILE_NAME}")
  340. MESSAGE("CPackDeb:Debug: CPACK_OUTPUT_FILE_PATH = ${CPACK_OUTPUT_FILE_PATH}")
  341. MESSAGE("CPackDeb:Debug: CPACK_PACKAGE_FILE_NAME = ${CPACK_PACKAGE_FILE_NAME}")
  342. MESSAGE("CPackDeb:Debug: CPACK_PACKAGE_INSTALL_DIRECTORY = ${CPACK_PACKAGE_INSTALL_DIRECTORY}")
  343. MESSAGE("CPackDeb:Debug: CPACK_TEMPORARY_PACKAGE_FILE_NAME = ${CPACK_TEMPORARY_PACKAGE_FILE_NAME}")
  344. ENDIF(CPACK_DEBIAN_PACKAGE_DEBUG)
  345. # For debian source packages:
  346. # debian/control
  347. # http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-sourcecontrolfiles
  348. # .dsc
  349. # http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-debiansourcecontrolfiles
  350. # Builds-Depends:
  351. #IF(NOT CPACK_DEBIAN_PACKAGE_BUILDS_DEPENDS)
  352. # SET(CPACK_DEBIAN_PACKAGE_BUILDS_DEPENDS
  353. # "debhelper (>> 5.0.0), libncurses5-dev, tcl8.4"
  354. # )
  355. #ENDIF(NOT CPACK_DEBIAN_PACKAGE_BUILDS_DEPENDS)