您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

DpkgDeb.cmake 9.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. # DpkgDeb : Create debian packages for your projects and sub projects. Written by Mehdi Rabah
  2. # Was heavily inspired by UseDebian (Mathieu Malaterre) and UseRPMTools (TSP Team) modules
  3. # need /usr/bin/dpkg
  4. # USAGE : ADD_DEBIAN_PACKAGE ( DEB_TARGET_NAME [CONTROL_FILE] )
  5. # You need to set the control file either by setting these variables
  6. # or by giving as second parameter the path to the control file you want to use
  7. # If you choose to set the variables, you must set the mandatory variables:
  8. # (see man 5 deb-control for more details)
  9. #
  10. # -- MANDATORY Variables
  11. # Package: ${PACKAGE_NAME}. Must be a lowercase string
  12. # Version: ${PACKAGE_VERSION}. Like 1.1.0
  13. # Release: ${PACKAGE_RELEASE}. A number beetween 0 and 9
  14. # Maintainer: ${PACKAGE_MAINTAINER_NAME} and ${PACKAGE_MAINTAINER_EMAIL}.
  15. # Description summary: ${PACKAGE_DESCRIPTION_SUMMARY}. Project summary
  16. # Description : ${PACKAGE_DESCRIPTION}. Warning : for now, use of special characters (>, (, ', ... ) is not allowed
  17. #
  18. # -- OPTIONAL Variables
  19. # Architecture: ${DEBIAN_ARCHITECTURE}, by default i386 for intel on debian like
  20. # Depends: ${CPACK_DEBIAN_PACKAGE_DEPENDS}
  21. # Section: ${PACKAGE_SECTION}
  22. # Priority: ${PACKAGE_PRIORITY}
  23. # Essential: ${PACKAGE_ESSENTIAL}
  24. # Source: ${PACKAGE_SOURCE}
  25. # Pre-Depends: ${PACKAGE_PREDEPENDS}
  26. # Recommends: ${PACKAGE_RECOMMENDS}
  27. # Suggests: ${PACKAGE_SUGGESTS}
  28. # Breaks: ${PACKAGE_BREAKS}
  29. # Conflicts: ${PACKAGE_CONFLICTS}
  30. # Replaces: ${PACKAGE_REPLACES}
  31. # Provides: ${PACKAGE_PROVIDES}
  32. # TODO: Make clean does not clean the DEBIAN_DIR folder
  33. # TODO: use objdump -p to automatically generate depedencies (cf dh_makeshlibs)
  34. FIND_PROGRAM(DPKG
  35. NAMES dpkg-deb
  36. PATHS "/usr/bin")
  37. IF ( DPKG )
  38. GET_FILENAME_COMPONENT(DPKG_PATH ${DPKG} ABSOLUTE)
  39. MESSAGE(STATUS "Found dpkg-deb : ${DPKG_PATH}")
  40. SET(DPKG_FOUND "YES")
  41. ELSE ( DPKG )
  42. MESSAGE(STATUS "dpkg-deb NOT found. deb generation will not be available")
  43. SET(DPKG_FOUND "NO")
  44. ENDIF ( DPKG )
  45. # Main and only command of this module. For more details, visit this webpage
  46. # http://tldp.org/HOWTO/Debian-Binary-Package-Building-HOWTO/
  47. MACRO(ADD_DEBIAN_PACKAGE DEBNAME)
  48. SET ( CONTROL_FILE ${PROJECT_BINARY_DIR}/control_${PROJECT_NAME} )
  49. # First choice for control file : user defined variables
  50. IF ("${ARGV1}" STREQUAL "")
  51. # Check if the mandatory variables are here
  52. IF(NOT PACKAGE_NAME OR NOT PACKAGE_VERSION OR NOT DEFINED PACKAGE_RELEASE OR
  53. NOT PACKAGE_MAINTAINER_NAME OR NOT PACKAGE_MAINTAINER_EMAIL OR
  54. NOT PACKAGE_DESCRIPTION_SUMMARY OR NOT PACKAGE_DESCRIPTION )
  55. message ( FATAL_ERROR "ADD_DEBIAN_PACKAGE command was not correctly configured for ${PROJECT_NAME}. See the documentation for more details" )
  56. ENDIF(NOT PACKAGE_NAME OR NOT PACKAGE_VERSION OR NOT DEFINED PACKAGE_RELEASE OR
  57. NOT PACKAGE_MAINTAINER_NAME OR NOT PACKAGE_MAINTAINER_EMAIL OR
  58. NOT PACKAGE_DESCRIPTION_SUMMARY OR NOT PACKAGE_DESCRIPTION )
  59. IF(NOT DEBIAN_ARCHITECTURE)
  60. EXECUTE_PROCESS(COMMAND "/usr/bin/dpkg" "--print-architecture" OUTPUT_VARIABLE DEBIAN_ARCHITECTURE OUTPUT_STRIP_TRAILING_WHITESPACE)
  61. ENDIF(NOT DEBIAN_ARCHITECTURE)
  62. # Writing the control file
  63. # see man 5 deb-control for more details
  64. ADD_CUSTOM_COMMAND(
  65. OUTPUT ${CONTROL_FILE}
  66. COMMAND ${CMAKE_COMMAND} -E echo
  67. "Package: ${PACKAGE_NAME}" > ${CONTROL_FILE}
  68. COMMAND ${CMAKE_COMMAND} -E echo
  69. "Version: ${PACKAGE_VERSION}" >> ${CONTROL_FILE}
  70. COMMAND ${CMAKE_COMMAND} -E echo
  71. "Maintainer: ${PACKAGE_MAINTAINER_NAME}"
  72. \"<"${PACKAGE_MAINTAINER_EMAIL}\">" >> ${CONTROL_FILE}
  73. COMMAND ${CMAKE_COMMAND}
  74. ARGS -E echo "Architecture: ${DEBIAN_ARCHITECTURE}" >> ${CONTROL_FILE}
  75. )
  76. IF ( DEFINED CPACK_DEBIAN_PACKAGE_DEPENDS )
  77. ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
  78. COMMAND ${CMAKE_COMMAND} -E echo
  79. "Depends: ${CPACK_DEBIAN_PACKAGE_DEPENDS}" >> ${CONTROL_FILE}
  80. APPEND )
  81. ENDIF ( DEFINED CPACK_DEBIAN_PACKAGE_DEPENDS )
  82. IF ( DEFINED PACKAGE_SECTION )
  83. ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
  84. COMMAND ${CMAKE_COMMAND} -E echo
  85. "Section: ${PACKAGE_SECTION}" >> ${CONTROL_FILE}
  86. APPEND )
  87. ENDIF ( DEFINED PACKAGE_SECTION)
  88. IF ( DEFINED PACKAGE_HOMEPAGE )
  89. ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
  90. COMMAND ${CMAKE_COMMAND} -E echo
  91. "Homepage: ${PACKAGE_HOMEPAGE}" >> ${CONTROL_FILE}
  92. APPEND )
  93. ENDIF ( DEFINED PACKAGE_HOMEPAGE)
  94. IF ( DEFINED PACKAGE_PRIORITY )
  95. ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
  96. COMMAND ${CMAKE_COMMAND} -E echo
  97. "Priority: ${PACKAGE_PRIORITY}" >> ${CONTROL_FILE}
  98. APPEND)
  99. ENDIF ( DEFINED PACKAGE_PRIORITY)
  100. IF ( DEFINED PACKAGE_ESSENTIAL )
  101. ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
  102. COMMAND ${CMAKE_COMMAND} -E echo
  103. "Essential: ${PACKAGE_ESSENTIAL}" >> ${CONTROL_FILE}
  104. APPEND)
  105. ENDIF ( DEFINED PACKAGE_ESSENTIAL)
  106. IF ( DEFINED PACKAGE_SOURCE )
  107. ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
  108. COMMAND ${CMAKE_COMMAND} -E echo
  109. "Source: ${PACKAGE_SOURCE}" >> ${CONTROL_FILE}
  110. APPEND)
  111. ENDIF ( DEFINED PACKAGE_SOURCE)
  112. IF ( DEFINED PACKAGE_PREDEPENDS )
  113. ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
  114. COMMAND ${CMAKE_COMMAND} -E echo
  115. "Pre-Depends: ${PACKAGE_PREDEPENDS}" >> ${CONTROL_FILE}
  116. APPEND)
  117. ENDIF ( DEFINED PACKAGE_PREDEPENDS )
  118. IF ( DEFINED PACKAGE_RECOMMENDS )
  119. ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
  120. COMMAND ${CMAKE_COMMAND} -E echo
  121. "Recommends: ${PACKAGE_RECOMMENDS}" >> ${CONTROL_FILE}
  122. APPEND)
  123. ENDIF ( DEFINED PACKAGE_RECOMMENDS)
  124. IF ( DEFINED PACKAGE_SUGGESTS )
  125. ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
  126. COMMAND ${CMAKE_COMMAND} -E echo
  127. "Suggests: ${PACKAGE_SUGGESTS}" >> ${CONTROL_FILE}
  128. APPEND)
  129. ENDIF ( DEFINED PACKAGE_SUGGESTS )
  130. IF ( DEFINED PACKAGE_BREAKS )
  131. ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
  132. COMMAND ${CMAKE_COMMAND} -E echo
  133. "Breaks: ${PACKAGE_BREAKS}" >> ${CONTROL_FILE}
  134. APPEND)
  135. ENDIF ( DEFINED PACKAGE_BREAKS )
  136. IF ( DEFINED PACKAGE_CONFLICTS )
  137. ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
  138. COMMAND ${CMAKE_COMMAND} -E echo
  139. "Conflicts: ${PACKAGE_CONFLICTS}" >> ${CONTROL_FILE}
  140. APPEND)
  141. ENDIF ( DEFINED PACKAGE_CONFLICTS )
  142. IF ( DEFINED PACKAGE_REPLACES )
  143. ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
  144. COMMAND ${CMAKE_COMMAND} -E echo
  145. "Replaces: ${PACKAGE_REPLACES}" >> ${CONTROL_FILE}
  146. APPEND)
  147. ENDIF ( DEFINED PACKAGE_REPLACES )
  148. IF ( DEFINED PACKAGE_PROVIDES )
  149. ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
  150. COMMAND ${CMAKE_COMMAND} -E echo
  151. "Provides: ${PACKAGE_PROVIDES}" >> ${CONTROL_FILE}
  152. APPEND)
  153. ENDIF ( DEFINED PACKAGE_PROVIDES )
  154. ADD_CUSTOM_COMMAND( OUTPUT ${CONTROL_FILE}
  155. COMMAND ${CMAKE_COMMAND} -E echo
  156. "Description: ${PACKAGE_DESCRIPTION_SUMMARY}" >> ${CONTROL_FILE}
  157. COMMAND ${CMAKE_COMMAND} -E echo
  158. " ." >> ${CONTROL_FILE}
  159. COMMAND ${CMAKE_COMMAND} -E echo
  160. " ${PACKAGE_DESCRIPTION}" >> ${CONTROL_FILE}
  161. COMMAND ${CMAKE_COMMAND} -E echo
  162. " ." >> ${CONTROL_FILE}
  163. COMMAND ${CMAKE_COMMAND} -E echo
  164. "" >> ${CONTROL_FILE}
  165. COMMENT "Generating control file"
  166. APPEND
  167. )
  168. ELSE ("${ARGV1}" STREQUAL "")
  169. ADD_CUSTOM_COMMAND(
  170. OUTPUT ${CONTROL_FILE}
  171. COMMAND ${CMAKE_COMMAND} -E copy "${ARGV1}" ${CONTROL_FILE}
  172. COMMENT "Copying user specified control file : ${ARGV1}"
  173. )
  174. ENDIF("${ARGV1}" STREQUAL "")
  175. # let's create a directory to call 'make install DESTDIR=...' into:
  176. SET ( DEBIAN_DIR ${CMAKE_BINARY_DIR}/${PACKAGE_NAME}_${PACKAGE_VERSION}-${PACKAGE_RELEASE}_${DEBIAN_ARCHITECTURE} )
  177. FILE ( REMOVE ${DEBIAN_DIR} )
  178. FILE ( MAKE_DIRECTORY ${DEBIAN_DIR} )
  179. FILE ( MAKE_DIRECTORY ${DEBIAN_DIR}/DEBIAN )
  180. # Calling "make install DESTDIR=${DEBIAN_DIR}"
  181. ADD_CUSTOM_TARGET(deb_destdir_install
  182. COMMAND ${CMAKE_MAKE_PROGRAM} install CMAKE_INSTALL_PREFIX=/ DESTDIR=${DEBIAN_DIR}
  183. DEPENDS ${CMAKE_BINARY_DIR}/cmake_install.cmake
  184. COMMENT "Installing with DESTDIR = ${DEBIAN_DIR}"
  185. )
  186. ADD_DEPENDENCIES(deb_destdir_install deb_destdir_preinstall)
  187. ADD_CUSTOM_TARGET(deb_destdir_preinstall
  188. COMMAND ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=/ -DDESTDIR=${DEBIAN_DIR} .
  189. DEPENDS ${CMAKE_BINARY_DIR}/cmake_install.cmake
  190. COMMENT "Configuring with DESTDIR = ${DEBIAN_DIR}"
  191. )
  192. ADD_DEPENDENCIES(deb_destdir_preinstall all preinstall)
  193. # Calling dpkg --build
  194. ADD_CUSTOM_COMMAND(
  195. OUTPUT ${CMAKE_BINARY_DIR}/${PACKAGE_NAME}_${PACKAGE_VERSION}-${PACKAGE_RELEASE}_${DEBIAN_ARCHITECTURE}.deb
  196. COMMAND ${CMAKE_COMMAND} -E copy ${CONTROL_FILE} ${DEBIAN_DIR}/DEBIAN/control
  197. COMMAND ${DPKG_PATH} --build ${DEBIAN_DIR}
  198. # removing control, so its (re)generated each time we need to build the package
  199. COMMAND ${CMAKE_COMMAND} -E remove ${CONTROL_FILE}
  200. DEPENDS ${CONTROL_FILE}
  201. COMMENT "Generating deb package"
  202. )
  203. # the final target:
  204. ADD_CUSTOM_TARGET(${DEBNAME}_deb
  205. DEPENDS ${CMAKE_BINARY_DIR}/${PACKAGE_NAME}_${PACKAGE_VERSION}-${PACKAGE_RELEASE}_${DEBIAN_ARCHITECTURE}.deb
  206. )
  207. ADD_DEPENDENCIES(${DEBNAME}_deb deb_destdir_install)
  208. ENDMACRO(ADD_DEBIAN_PACKAGE DEBNAME)