CPackDeb.cmake 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586
  1. # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. # file Copyright.txt or https://cmake.org/licensing for details.
  3. # CPack script for creating Debian package
  4. # Author: Mathieu Malaterre
  5. #
  6. # http://wiki.debian.org/HowToPackageForDebian
  7. if(CMAKE_BINARY_DIR)
  8. message(FATAL_ERROR "CPackDeb.cmake may only be used by CPack internally.")
  9. endif()
  10. cmake_policy(PUSH)
  11. cmake_policy(SET CMP0057 NEW) # if IN_LIST
  12. function(cpack_deb_variable_fallback OUTPUT_VAR_NAME)
  13. set(FALLBACK_VAR_NAMES ${ARGN})
  14. foreach(variable_name IN LISTS FALLBACK_VAR_NAMES)
  15. if(${variable_name})
  16. set(${OUTPUT_VAR_NAME} "${${variable_name}}" PARENT_SCOPE)
  17. break()
  18. endif()
  19. endforeach()
  20. endfunction()
  21. function(get_component_package_name var component)
  22. string(TOUPPER "${component}" component_upcase)
  23. if(CPACK_DEBIAN_${component_upcase}_PACKAGE_NAME)
  24. string(TOLOWER "${CPACK_DEBIAN_${component_upcase}_PACKAGE_NAME}" package_name)
  25. else()
  26. string(TOLOWER "${CPACK_DEBIAN_PACKAGE_NAME}-${component}" package_name)
  27. endif()
  28. set("${var}" "${package_name}" PARENT_SCOPE)
  29. endfunction()
  30. #extract library name and version for given shared object
  31. function(extract_so_info shared_object libname version)
  32. if(READELF_EXECUTABLE)
  33. execute_process(COMMAND "${READELF_EXECUTABLE}" -d "${shared_object}"
  34. WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
  35. RESULT_VARIABLE result
  36. OUTPUT_VARIABLE output
  37. ERROR_QUIET
  38. OUTPUT_STRIP_TRAILING_WHITESPACE)
  39. if(result EQUAL 0)
  40. string(REGEX MATCH "\\(SONAME\\)[^\n]*\\[([^\n]+)\\.so\\.([^\n]*)\\]" soname "${output}")
  41. set(${libname} "${CMAKE_MATCH_1}" PARENT_SCOPE)
  42. set(${version} "${CMAKE_MATCH_2}" PARENT_SCOPE)
  43. else()
  44. message(WARNING "Error running readelf for \"${shared_object}\"")
  45. endif()
  46. else()
  47. message(FATAL_ERROR "Readelf utility is not available.")
  48. endif()
  49. endfunction()
  50. function(cpack_deb_prepare_package_vars)
  51. # CPACK_DEBIAN_PACKAGE_SHLIBDEPS
  52. # If specify OFF, only user depends are used
  53. if(NOT DEFINED CPACK_DEBIAN_PACKAGE_SHLIBDEPS)
  54. set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS OFF)
  55. endif()
  56. set(WDIR "${CPACK_TOPLEVEL_DIRECTORY}/${CPACK_PACKAGE_FILE_NAME}${CPACK_DEB_PACKAGE_COMPONENT_PART_PATH}")
  57. # per component automatic discover: some of the component might not have
  58. # binaries.
  59. if(CPACK_DEB_PACKAGE_COMPONENT)
  60. string(TOUPPER "${CPACK_DEB_PACKAGE_COMPONENT}" _local_component_name)
  61. set(_component_shlibdeps_var "CPACK_DEBIAN_${_local_component_name}_PACKAGE_SHLIBDEPS")
  62. # if set, overrides the global configuration
  63. if(DEFINED ${_component_shlibdeps_var})
  64. set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS "${${_component_shlibdeps_var}}")
  65. if(CPACK_DEBIAN_PACKAGE_DEBUG)
  66. message("CPackDeb Debug: component '${CPACK_DEB_PACKAGE_COMPONENT}' dpkg-shlibdeps set to ${CPACK_DEBIAN_PACKAGE_SHLIBDEPS}")
  67. endif()
  68. endif()
  69. endif()
  70. if(CPACK_DEBIAN_PACKAGE_SHLIBDEPS OR CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS)
  71. # Generating binary list - Get type of all install files
  72. file(GLOB_RECURSE FILE_PATHS_ LIST_DIRECTORIES false RELATIVE "${WDIR}" "${WDIR}/*")
  73. find_program(FILE_EXECUTABLE file)
  74. if(NOT FILE_EXECUTABLE)
  75. message(FATAL_ERROR "CPackDeb: file utility is not available. CPACK_DEBIAN_PACKAGE_SHLIBDEPS and CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS options are not available.")
  76. endif()
  77. # get file info so that we can determine if file is executable or not
  78. unset(CPACK_DEB_INSTALL_FILES)
  79. foreach(FILE_ IN LISTS FILE_PATHS_)
  80. execute_process(COMMAND env LC_ALL=C ${FILE_EXECUTABLE} "./${FILE_}"
  81. WORKING_DIRECTORY "${WDIR}"
  82. RESULT_VARIABLE FILE_RESULT_
  83. OUTPUT_VARIABLE INSTALL_FILE_)
  84. if(NOT FILE_RESULT_ EQUAL 0)
  85. message (FATAL_ERROR "CPackDeb: execution of command: '${FILE_EXECUTABLE} ./${FILE_}' failed with exit code: ${FILE_RESULT_}")
  86. endif()
  87. list(APPEND CPACK_DEB_INSTALL_FILES "${INSTALL_FILE_}")
  88. endforeach()
  89. # Only dynamically linked ELF files are included
  90. # Extract only file name infront of ":"
  91. foreach(_FILE IN LISTS CPACK_DEB_INSTALL_FILES)
  92. if(_FILE MATCHES "ELF.*dynamically linked")
  93. string(REGEX MATCH "(^.*):" _FILE_NAME "${_FILE}")
  94. list(APPEND CPACK_DEB_BINARY_FILES "${CMAKE_MATCH_1}")
  95. set(CONTAINS_EXECUTABLE_FILES_ TRUE)
  96. endif()
  97. if(_FILE MATCHES "ELF.*shared object")
  98. string(REGEX MATCH "(^.*):" _FILE_NAME "${_FILE}")
  99. list(APPEND CPACK_DEB_SHARED_OBJECT_FILES "${CMAKE_MATCH_1}")
  100. endif()
  101. endforeach()
  102. endif()
  103. if(CPACK_DEBIAN_PACKAGE_SHLIBDEPS)
  104. # dpkg-shlibdeps is a Debian utility for generating dependency list
  105. find_program(SHLIBDEPS_EXECUTABLE dpkg-shlibdeps)
  106. if(SHLIBDEPS_EXECUTABLE)
  107. # Check version of the dpkg-shlibdeps tool using CPackDEB method
  108. execute_process(COMMAND env LC_ALL=C ${SHLIBDEPS_EXECUTABLE} --version
  109. OUTPUT_VARIABLE _TMP_VERSION
  110. ERROR_QUIET
  111. OUTPUT_STRIP_TRAILING_WHITESPACE)
  112. if(_TMP_VERSION MATCHES "dpkg-shlibdeps version ([0-9]+\\.[0-9]+\\.[0-9]+)")
  113. set(SHLIBDEPS_EXECUTABLE_VERSION "${CMAKE_MATCH_1}")
  114. else()
  115. set(SHLIBDEPS_EXECUTABLE_VERSION "")
  116. endif()
  117. if(CPACK_DEBIAN_PACKAGE_DEBUG)
  118. message("CPackDeb Debug: dpkg-shlibdeps --version output is '${_TMP_VERSION}'")
  119. message("CPackDeb Debug: dpkg-shlibdeps version is <${SHLIBDEPS_EXECUTABLE_VERSION}>")
  120. endif()
  121. if(CONTAINS_EXECUTABLE_FILES_)
  122. message("CPackDeb: - Generating dependency list")
  123. # Create blank control file for running dpkg-shlibdeps
  124. # There might be some other way to invoke dpkg-shlibdeps without creating this file
  125. # but standard debian package should not have anything that can collide with this file or directory
  126. file(MAKE_DIRECTORY ${CPACK_TEMPORARY_DIRECTORY}/debian)
  127. file(WRITE ${CPACK_TEMPORARY_DIRECTORY}/debian/control "")
  128. # Create a DEBIAN directory so that dpkg-shlibdeps can find the package dir when resolving $ORIGIN.
  129. file(MAKE_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}/DEBIAN")
  130. # Add --ignore-missing-info if the tool supports it
  131. execute_process(COMMAND env LC_ALL=C ${SHLIBDEPS_EXECUTABLE} --help
  132. OUTPUT_VARIABLE _TMP_HELP
  133. ERROR_QUIET
  134. OUTPUT_STRIP_TRAILING_WHITESPACE)
  135. if(_TMP_HELP MATCHES "--ignore-missing-info")
  136. set(IGNORE_MISSING_INFO_FLAG "--ignore-missing-info")
  137. endif()
  138. # Execute dpkg-shlibdeps
  139. # --ignore-missing-info : allow dpkg-shlibdeps to run even if some libs do not belong to a package
  140. # -O : print to STDOUT
  141. execute_process(COMMAND ${SHLIBDEPS_EXECUTABLE} ${IGNORE_MISSING_INFO_FLAG} -O ${CPACK_DEB_BINARY_FILES}
  142. WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
  143. OUTPUT_VARIABLE SHLIBDEPS_OUTPUT
  144. RESULT_VARIABLE SHLIBDEPS_RESULT
  145. ERROR_VARIABLE SHLIBDEPS_ERROR
  146. OUTPUT_STRIP_TRAILING_WHITESPACE )
  147. if(CPACK_DEBIAN_PACKAGE_DEBUG)
  148. # dpkg-shlibdeps will throw some warnings if some input files are not binary
  149. message( "CPackDeb Debug: dpkg-shlibdeps warnings \n${SHLIBDEPS_ERROR}")
  150. endif()
  151. if(NOT SHLIBDEPS_RESULT EQUAL 0)
  152. message (FATAL_ERROR "CPackDeb: dpkg-shlibdeps: '${SHLIBDEPS_ERROR}';\n"
  153. "executed command: '${SHLIBDEPS_EXECUTABLE} ${IGNORE_MISSING_INFO_FLAG} -O ${CPACK_DEB_BINARY_FILES}';\n"
  154. "found files: '${INSTALL_FILE_}';\n"
  155. "files info: '${CPACK_DEB_INSTALL_FILES}';\n"
  156. "binary files: '${CPACK_DEB_BINARY_FILES}'")
  157. endif()
  158. #Get rid of prefix generated by dpkg-shlibdeps
  159. string(REGEX REPLACE "^.*Depends=" "" CPACK_DEBIAN_PACKAGE_AUTO_DEPENDS "${SHLIBDEPS_OUTPUT}")
  160. if(CPACK_DEBIAN_PACKAGE_DEBUG)
  161. message("CPackDeb Debug: Found dependency: ${CPACK_DEBIAN_PACKAGE_AUTO_DEPENDS} from output ${SHLIBDEPS_OUTPUT}")
  162. endif()
  163. # Remove blank control file
  164. # Might not be safe if package actual contain file or directory named debian
  165. file(REMOVE_RECURSE "${CPACK_TEMPORARY_DIRECTORY}/debian")
  166. # remove temporary directory that was created only for dpkg-shlibdeps execution
  167. file(REMOVE_RECURSE "${CPACK_TEMPORARY_DIRECTORY}/DEBIAN")
  168. else()
  169. if(CPACK_DEBIAN_PACKAGE_DEBUG)
  170. message(AUTHOR_WARNING "CPackDeb Debug: Using only user-provided depends because package does not contain executable files that link to shared libraries.")
  171. endif()
  172. endif()
  173. else()
  174. message("CPackDeb: Using only user-provided dependencies because dpkg-shlibdeps is not found.")
  175. endif()
  176. else()
  177. if(CPACK_DEBIAN_PACKAGE_DEBUG)
  178. message("CPackDeb Debug: Using only user-provided dependencies")
  179. endif()
  180. endif()
  181. # Let's define the control file found in debian package:
  182. # Binary package:
  183. # http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-binarycontrolfiles
  184. # DEBIAN/control
  185. # debian policy enforce lower case for package name
  186. # Package: (mandatory)
  187. if(NOT CPACK_DEBIAN_PACKAGE_NAME)
  188. string(TOLOWER "${CPACK_PACKAGE_NAME}" CPACK_DEBIAN_PACKAGE_NAME)
  189. endif()
  190. # Version: (mandatory)
  191. if(NOT CPACK_DEBIAN_PACKAGE_VERSION)
  192. if(NOT CPACK_PACKAGE_VERSION)
  193. message(FATAL_ERROR "CPackDeb: Debian package requires a package version")
  194. endif()
  195. set(CPACK_DEBIAN_PACKAGE_VERSION ${CPACK_PACKAGE_VERSION})
  196. endif()
  197. if(DEFINED CPACK_DEBIAN_PACKAGE_RELEASE OR DEFINED CPACK_DEBIAN_PACKAGE_EPOCH)
  198. # only test the version format if CPACK_DEBIAN_PACKAGE_RELEASE or
  199. # CPACK_DEBIAN_PACKAGE_EPOCH is set
  200. if(NOT CPACK_DEBIAN_PACKAGE_VERSION MATCHES "^[0-9][A-Za-z0-9.+~-]*$")
  201. message(FATAL_ERROR
  202. "CPackDeb: Debian package version must confirm to \"^[0-9][A-Za-z0-9.+~-]*$\" regex!")
  203. endif()
  204. else()
  205. # before CMake 3.10 version format was not tested so only warn to preserve
  206. # backward compatibility
  207. if(NOT CPACK_DEBIAN_PACKAGE_VERSION MATCHES "^([0-9]+:)?[0-9][A-Za-z0-9.+~-]*$")
  208. message(AUTHOR_WARNING
  209. "CPackDeb: Debian package versioning ([<epoch>:]<version>[-<release>])"
  210. " should confirm to \"^([0-9]+:)?[0-9][A-Za-z0-9.+~-]*$\" regex in"
  211. " order to satisfy Debian packaging rules.")
  212. endif()
  213. endif()
  214. if(CPACK_DEBIAN_PACKAGE_RELEASE)
  215. if(NOT CPACK_DEBIAN_PACKAGE_RELEASE MATCHES "^[A-Za-z0-9.+~]+$")
  216. message(FATAL_ERROR
  217. "CPackDeb: Debian package release must confirm to \"^[A-Za-z0-9.+~]+$\" regex!")
  218. endif()
  219. string(APPEND CPACK_DEBIAN_PACKAGE_VERSION
  220. "-${CPACK_DEBIAN_PACKAGE_RELEASE}")
  221. elseif(DEFINED CPACK_DEBIAN_PACKAGE_EPOCH)
  222. # only test the version format if CPACK_DEBIAN_PACKAGE_RELEASE or
  223. # CPACK_DEBIAN_PACKAGE_EPOCH is set - versions CPack/Deb generator before
  224. # CMake 3.10 did not check for version format so we have to preserve
  225. # backward compatibility
  226. if(CPACK_DEBIAN_PACKAGE_VERSION MATCHES ".*-.*")
  227. message(FATAL_ERROR
  228. "CPackDeb: Debian package version must not contain hyphens when CPACK_DEBIAN_PACKAGE_RELEASE is not provided!")
  229. endif()
  230. endif()
  231. if(CPACK_DEBIAN_PACKAGE_EPOCH)
  232. if(NOT CPACK_DEBIAN_PACKAGE_EPOCH MATCHES "^[0-9]+$")
  233. message(FATAL_ERROR
  234. "CPackDeb: Debian package epoch must confirm to \"^[0-9]+$\" regex!")
  235. endif()
  236. set(CPACK_DEBIAN_PACKAGE_VERSION
  237. "${CPACK_DEBIAN_PACKAGE_EPOCH}:${CPACK_DEBIAN_PACKAGE_VERSION}")
  238. endif()
  239. # Architecture: (mandatory)
  240. if(CPACK_DEB_PACKAGE_COMPONENT AND CPACK_DEBIAN_${_local_component_name}_PACKAGE_ARCHITECTURE)
  241. set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "${CPACK_DEBIAN_${_local_component_name}_PACKAGE_ARCHITECTURE}")
  242. elseif(NOT CPACK_DEBIAN_PACKAGE_ARCHITECTURE)
  243. # There is no such thing as i686 architecture on debian, you should use i386 instead
  244. # $ dpkg --print-architecture
  245. find_program(DPKG_CMD dpkg)
  246. if(NOT DPKG_CMD)
  247. message(STATUS "CPackDeb: Can not find dpkg in your path, default to i386.")
  248. set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE i386)
  249. endif()
  250. execute_process(COMMAND "${DPKG_CMD}" --print-architecture
  251. OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE
  252. OUTPUT_STRIP_TRAILING_WHITESPACE
  253. )
  254. endif()
  255. # Source: (optional)
  256. # in case several packages are constructed from a unique source
  257. # (multipackaging), the source may be indicated as well.
  258. # The source might contain a version if the generated package
  259. # version is different from the source version
  260. if(NOT CPACK_DEBIAN_PACKAGE_SOURCE)
  261. set(CPACK_DEBIAN_PACKAGE_SOURCE "")
  262. endif()
  263. # have a look at get_property(result GLOBAL PROPERTY ENABLED_FEATURES),
  264. # this returns the successful find_package() calls, maybe this can help
  265. # Depends:
  266. # You should set: DEBIAN_PACKAGE_DEPENDS
  267. # TODO: automate 'objdump -p | grep NEEDED'
  268. # if per-component variable, overrides the global CPACK_DEBIAN_PACKAGE_${variable_type_}
  269. # automatic dependency discovery will be performed afterwards.
  270. if(CPACK_DEB_PACKAGE_COMPONENT)
  271. foreach(value_type_ DEPENDS RECOMMENDS SUGGESTS PREDEPENDS ENHANCES BREAKS CONFLICTS PROVIDES REPLACES SOURCE SECTION PRIORITY NAME)
  272. set(_component_var "CPACK_DEBIAN_${_local_component_name}_PACKAGE_${value_type_}")
  273. # if set, overrides the global variable
  274. if(DEFINED ${_component_var})
  275. set(CPACK_DEBIAN_PACKAGE_${value_type_} "${${_component_var}}")
  276. if(CPACK_DEBIAN_PACKAGE_DEBUG)
  277. message("CPackDeb Debug: component '${_local_component_name}' ${value_type_} "
  278. "value set to '${CPACK_DEBIAN_PACKAGE_${value_type_}}'")
  279. endif()
  280. endif()
  281. endforeach()
  282. if(CPACK_DEBIAN_ENABLE_COMPONENT_DEPENDS)
  283. set(COMPONENT_DEPENDS "")
  284. foreach (_PACK ${CPACK_COMPONENT_${_local_component_name}_DEPENDS})
  285. get_component_package_name(_PACK_NAME "${_PACK}")
  286. if(COMPONENT_DEPENDS)
  287. set(COMPONENT_DEPENDS "${_PACK_NAME} (= ${CPACK_DEBIAN_PACKAGE_VERSION}), ${COMPONENT_DEPENDS}")
  288. else()
  289. set(COMPONENT_DEPENDS "${_PACK_NAME} (= ${CPACK_DEBIAN_PACKAGE_VERSION})")
  290. endif()
  291. endforeach()
  292. if(COMPONENT_DEPENDS)
  293. if(CPACK_DEBIAN_PACKAGE_DEPENDS)
  294. set(CPACK_DEBIAN_PACKAGE_DEPENDS "${COMPONENT_DEPENDS}, ${CPACK_DEBIAN_PACKAGE_DEPENDS}")
  295. else()
  296. set(CPACK_DEBIAN_PACKAGE_DEPENDS "${COMPONENT_DEPENDS}")
  297. endif()
  298. endif()
  299. endif()
  300. endif()
  301. # at this point, the CPACK_DEBIAN_PACKAGE_DEPENDS is properly set
  302. # to the minimal dependency of the package
  303. # Append automatically discovered dependencies .
  304. if(NOT "${CPACK_DEBIAN_PACKAGE_AUTO_DEPENDS}" STREQUAL "")
  305. if (CPACK_DEBIAN_PACKAGE_DEPENDS)
  306. set (CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, ${CPACK_DEBIAN_PACKAGE_AUTO_DEPENDS}")
  307. else ()
  308. set (CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_AUTO_DEPENDS}")
  309. endif ()
  310. endif()
  311. if(NOT CPACK_DEBIAN_PACKAGE_DEPENDS)
  312. message(STATUS "CPACK_DEBIAN_PACKAGE_DEPENDS not set, the package will have no dependencies.")
  313. endif()
  314. # Maintainer: (mandatory)
  315. if(NOT CPACK_DEBIAN_PACKAGE_MAINTAINER)
  316. if(NOT CPACK_PACKAGE_CONTACT)
  317. message(FATAL_ERROR "CPackDeb: Debian package requires a maintainer for a package, set CPACK_PACKAGE_CONTACT or CPACK_DEBIAN_PACKAGE_MAINTAINER")
  318. endif()
  319. set(CPACK_DEBIAN_PACKAGE_MAINTAINER ${CPACK_PACKAGE_CONTACT})
  320. endif()
  321. # Description: (mandatory)
  322. if(NOT CPACK_DEB_PACKAGE_COMPONENT)
  323. if(NOT CPACK_DEBIAN_PACKAGE_DESCRIPTION)
  324. if(NOT CPACK_PACKAGE_DESCRIPTION_SUMMARY)
  325. message(FATAL_ERROR "CPackDeb: Debian package requires a summary for a package, set CPACK_PACKAGE_DESCRIPTION_SUMMARY or CPACK_DEBIAN_PACKAGE_DESCRIPTION")
  326. endif()
  327. set(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${CPACK_PACKAGE_DESCRIPTION_SUMMARY})
  328. endif()
  329. else()
  330. set(component_description_var CPACK_COMPONENT_${_local_component_name}_DESCRIPTION)
  331. # component description overrides package description
  332. if(${component_description_var})
  333. set(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${${component_description_var}})
  334. elseif(NOT CPACK_DEBIAN_PACKAGE_DESCRIPTION)
  335. if(NOT CPACK_PACKAGE_DESCRIPTION_SUMMARY)
  336. message(FATAL_ERROR "CPackDeb: Debian package requires a summary for a package, set CPACK_PACKAGE_DESCRIPTION_SUMMARY or CPACK_DEBIAN_PACKAGE_DESCRIPTION or ${component_description_var}")
  337. endif()
  338. set(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${CPACK_PACKAGE_DESCRIPTION_SUMMARY})
  339. endif()
  340. endif()
  341. # Homepage: (optional)
  342. if(NOT CPACK_DEBIAN_PACKAGE_HOMEPAGE AND CMAKE_PROJECT_HOMEPAGE_URL)
  343. set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "${CMAKE_PROJECT_HOMEPAGE_URL}")
  344. endif()
  345. # Section: (recommended)
  346. if(NOT CPACK_DEBIAN_PACKAGE_SECTION)
  347. set(CPACK_DEBIAN_PACKAGE_SECTION "devel")
  348. endif()
  349. # Priority: (recommended)
  350. if(NOT CPACK_DEBIAN_PACKAGE_PRIORITY)
  351. set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional")
  352. endif()
  353. if(CPACK_DEBIAN_ARCHIVE_TYPE)
  354. set(archive_types_ "paxr;gnutar")
  355. if(NOT CPACK_DEBIAN_ARCHIVE_TYPE IN_LIST archive_types_)
  356. message(FATAL_ERROR "CPACK_DEBIAN_ARCHIVE_TYPE set to unsupported"
  357. "type ${CPACK_DEBIAN_ARCHIVE_TYPE}")
  358. endif()
  359. else()
  360. set(CPACK_DEBIAN_ARCHIVE_TYPE "paxr")
  361. endif()
  362. # Compression: (recommended)
  363. if(NOT CPACK_DEBIAN_COMPRESSION_TYPE)
  364. set(CPACK_DEBIAN_COMPRESSION_TYPE "gzip")
  365. endif()
  366. # Recommends:
  367. # You should set: CPACK_DEBIAN_PACKAGE_RECOMMENDS
  368. # Suggests:
  369. # You should set: CPACK_DEBIAN_PACKAGE_SUGGESTS
  370. # CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
  371. # This variable allow advanced user to add custom script to the control.tar.gz (inside the .deb archive)
  372. # Typical examples are:
  373. # - conffiles
  374. # - postinst
  375. # - postrm
  376. # - prerm
  377. # Usage:
  378. # set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
  379. # "${CMAKE_CURRENT_SOURCE_DIR}/prerm;${CMAKE_CURRENT_SOURCE_DIR}/postrm")
  380. # Are we packaging components ?
  381. if(CPACK_DEB_PACKAGE_COMPONENT)
  382. # override values with per component version if set
  383. foreach(VAR_NAME_ "PACKAGE_CONTROL_EXTRA" "PACKAGE_CONTROL_STRICT_PERMISSION")
  384. if(CPACK_DEBIAN_${_local_component_name}_${VAR_NAME_})
  385. set(CPACK_DEBIAN_${VAR_NAME_} "${CPACK_DEBIAN_${_local_component_name}_${VAR_NAME_}}")
  386. endif()
  387. endforeach()
  388. get_component_package_name(CPACK_DEBIAN_PACKAGE_NAME ${_local_component_name})
  389. endif()
  390. set(CPACK_DEBIAN_PACKAGE_SHLIBS_LIST "")
  391. if (NOT CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS_POLICY)
  392. set(CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS_POLICY "=")
  393. endif()
  394. find_program(READELF_EXECUTABLE NAMES readelf)
  395. if(CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS)
  396. if(READELF_EXECUTABLE)
  397. foreach(_FILE IN LISTS CPACK_DEB_SHARED_OBJECT_FILES)
  398. extract_so_info("${_FILE}" libname soversion)
  399. if(libname AND DEFINED soversion)
  400. list(APPEND CPACK_DEBIAN_PACKAGE_SHLIBS_LIST
  401. "${libname} ${soversion} ${CPACK_DEBIAN_PACKAGE_NAME} (${CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS_POLICY} ${CPACK_DEBIAN_PACKAGE_VERSION})")
  402. else()
  403. message(AUTHOR_WARNING "Shared library '${_FILE}' is missing soname or soversion. Library will not be added to DEBIAN/shlibs control file.")
  404. endif()
  405. endforeach()
  406. if (CPACK_DEBIAN_PACKAGE_SHLIBS_LIST)
  407. string(REPLACE ";" "\n" CPACK_DEBIAN_PACKAGE_SHLIBS_LIST "${CPACK_DEBIAN_PACKAGE_SHLIBS_LIST}")
  408. endif()
  409. else()
  410. message(FATAL_ERROR "Readelf utility is not available. CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS option is not available.")
  411. endif()
  412. endif()
  413. # add ldconfig call in default postrm and postint
  414. set(CPACK_ADD_LDCONFIG_CALL 0)
  415. foreach(_FILE ${CPACK_DEB_SHARED_OBJECT_FILES})
  416. get_filename_component(_DIR ${_FILE} DIRECTORY)
  417. # all files in CPACK_DEB_SHARED_OBJECT_FILES have dot at the beginning
  418. if(_DIR STREQUAL "./lib" OR _DIR STREQUAL "./usr/lib")
  419. set(CPACK_ADD_LDCONFIG_CALL 1)
  420. endif()
  421. endforeach()
  422. if(CPACK_ADD_LDCONFIG_CALL)
  423. set(CPACK_DEBIAN_GENERATE_POSTINST 1)
  424. set(CPACK_DEBIAN_GENERATE_POSTRM 1)
  425. foreach(f ${PACKAGE_CONTROL_EXTRA})
  426. get_filename_component(n "${f}" NAME)
  427. if("${n}" STREQUAL "postinst")
  428. set(CPACK_DEBIAN_GENERATE_POSTINST 0)
  429. endif()
  430. if("${n}" STREQUAL "postrm")
  431. set(CPACK_DEBIAN_GENERATE_POSTRM 0)
  432. endif()
  433. endforeach()
  434. else()
  435. set(CPACK_DEBIAN_GENERATE_POSTINST 0)
  436. set(CPACK_DEBIAN_GENERATE_POSTRM 0)
  437. endif()
  438. cpack_deb_variable_fallback("CPACK_DEBIAN_FILE_NAME"
  439. "CPACK_DEBIAN_${_local_component_name}_FILE_NAME"
  440. "CPACK_DEBIAN_FILE_NAME")
  441. if(CPACK_DEBIAN_FILE_NAME)
  442. if(CPACK_DEBIAN_FILE_NAME STREQUAL "DEB-DEFAULT")
  443. # Patch package file name to be in correct debian format:
  444. # <foo>_<VersionNumber>-<DebianRevisionNumber>_<DebianArchitecture>.deb
  445. set(CPACK_OUTPUT_FILE_NAME
  446. "${CPACK_DEBIAN_PACKAGE_NAME}_${CPACK_DEBIAN_PACKAGE_VERSION}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}.deb")
  447. else()
  448. if(NOT CPACK_DEBIAN_FILE_NAME MATCHES ".*\\.(deb|ipk)")
  449. message(FATAL_ERROR "'${CPACK_DEBIAN_FILE_NAME}' is not a valid DEB package file name as it must end with '.deb' or '.ipk'!")
  450. endif()
  451. set(CPACK_OUTPUT_FILE_NAME "${CPACK_DEBIAN_FILE_NAME}")
  452. endif()
  453. set(CPACK_TEMPORARY_PACKAGE_FILE_NAME "${CPACK_TOPLEVEL_DIRECTORY}/${CPACK_OUTPUT_FILE_NAME}")
  454. get_filename_component(BINARY_DIR "${CPACK_OUTPUT_FILE_PATH}" DIRECTORY)
  455. set(CPACK_OUTPUT_FILE_PATH "${BINARY_DIR}/${CPACK_OUTPUT_FILE_NAME}")
  456. endif() # else() back compatibility - don't change the name
  457. # Print out some debug information if we were asked for that
  458. if(CPACK_DEBIAN_PACKAGE_DEBUG)
  459. message("CPackDeb:Debug: CPACK_TOPLEVEL_DIRECTORY = '${CPACK_TOPLEVEL_DIRECTORY}'")
  460. message("CPackDeb:Debug: CPACK_TOPLEVEL_TAG = '${CPACK_TOPLEVEL_TAG}'")
  461. message("CPackDeb:Debug: CPACK_TEMPORARY_DIRECTORY = '${CPACK_TEMPORARY_DIRECTORY}'")
  462. message("CPackDeb:Debug: CPACK_OUTPUT_FILE_NAME = '${CPACK_OUTPUT_FILE_NAME}'")
  463. message("CPackDeb:Debug: CPACK_OUTPUT_FILE_PATH = '${CPACK_OUTPUT_FILE_PATH}'")
  464. message("CPackDeb:Debug: CPACK_PACKAGE_FILE_NAME = '${CPACK_PACKAGE_FILE_NAME}'")
  465. message("CPackDeb:Debug: CPACK_PACKAGE_INSTALL_DIRECTORY = '${CPACK_PACKAGE_INSTALL_DIRECTORY}'")
  466. message("CPackDeb:Debug: CPACK_TEMPORARY_PACKAGE_FILE_NAME = '${CPACK_TEMPORARY_PACKAGE_FILE_NAME}'")
  467. message("CPackDeb:Debug: CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION = '${CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION}'")
  468. message("CPackDeb:Debug: CPACK_DEBIAN_PACKAGE_SOURCE = '${CPACK_DEBIAN_PACKAGE_SOURCE}'")
  469. endif()
  470. # For debian source packages:
  471. # debian/control
  472. # http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-sourcecontrolfiles
  473. # .dsc
  474. # http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-debiansourcecontrolfiles
  475. # Builds-Depends:
  476. #if(NOT CPACK_DEBIAN_PACKAGE_BUILDS_DEPENDS)
  477. # set(CPACK_DEBIAN_PACKAGE_BUILDS_DEPENDS
  478. # "debhelper (>> 5.0.0), libncurses5-dev, tcl8.4"
  479. # )
  480. #endif()
  481. # move variables to parent scope so that they may be used to create debian package
  482. set(GEN_CPACK_OUTPUT_FILE_NAME "${CPACK_OUTPUT_FILE_NAME}" PARENT_SCOPE)
  483. set(GEN_CPACK_TEMPORARY_PACKAGE_FILE_NAME "${CPACK_TEMPORARY_PACKAGE_FILE_NAME}" PARENT_SCOPE)
  484. set(GEN_CPACK_DEBIAN_PACKAGE_NAME "${CPACK_DEBIAN_PACKAGE_NAME}" PARENT_SCOPE)
  485. set(GEN_CPACK_DEBIAN_PACKAGE_VERSION "${CPACK_DEBIAN_PACKAGE_VERSION}" PARENT_SCOPE)
  486. set(GEN_CPACK_DEBIAN_PACKAGE_SECTION "${CPACK_DEBIAN_PACKAGE_SECTION}" PARENT_SCOPE)
  487. set(GEN_CPACK_DEBIAN_PACKAGE_PRIORITY "${CPACK_DEBIAN_PACKAGE_PRIORITY}" PARENT_SCOPE)
  488. set(GEN_CPACK_DEBIAN_PACKAGE_ARCHITECTURE "${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}" PARENT_SCOPE)
  489. set(GEN_CPACK_DEBIAN_PACKAGE_MAINTAINER "${CPACK_DEBIAN_PACKAGE_MAINTAINER}" PARENT_SCOPE)
  490. set(GEN_CPACK_DEBIAN_PACKAGE_DESCRIPTION "${CPACK_DEBIAN_PACKAGE_DESCRIPTION}" PARENT_SCOPE)
  491. set(GEN_CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}" PARENT_SCOPE)
  492. set(GEN_CPACK_DEBIAN_ARCHIVE_TYPE "${CPACK_DEBIAN_ARCHIVE_TYPE}" PARENT_SCOPE)
  493. set(GEN_CPACK_DEBIAN_COMPRESSION_TYPE "${CPACK_DEBIAN_COMPRESSION_TYPE}" PARENT_SCOPE)
  494. set(GEN_CPACK_DEBIAN_PACKAGE_RECOMMENDS "${CPACK_DEBIAN_PACKAGE_RECOMMENDS}" PARENT_SCOPE)
  495. set(GEN_CPACK_DEBIAN_PACKAGE_SUGGESTS "${CPACK_DEBIAN_PACKAGE_SUGGESTS}" PARENT_SCOPE)
  496. set(GEN_CPACK_DEBIAN_PACKAGE_HOMEPAGE "${CPACK_DEBIAN_PACKAGE_HOMEPAGE}" PARENT_SCOPE)
  497. set(GEN_CPACK_DEBIAN_PACKAGE_PREDEPENDS "${CPACK_DEBIAN_PACKAGE_PREDEPENDS}" PARENT_SCOPE)
  498. set(GEN_CPACK_DEBIAN_PACKAGE_ENHANCES "${CPACK_DEBIAN_PACKAGE_ENHANCES}" PARENT_SCOPE)
  499. set(GEN_CPACK_DEBIAN_PACKAGE_BREAKS "${CPACK_DEBIAN_PACKAGE_BREAKS}" PARENT_SCOPE)
  500. set(GEN_CPACK_DEBIAN_PACKAGE_CONFLICTS "${CPACK_DEBIAN_PACKAGE_CONFLICTS}" PARENT_SCOPE)
  501. set(GEN_CPACK_DEBIAN_PACKAGE_PROVIDES "${CPACK_DEBIAN_PACKAGE_PROVIDES}" PARENT_SCOPE)
  502. set(GEN_CPACK_DEBIAN_PACKAGE_REPLACES "${CPACK_DEBIAN_PACKAGE_REPLACES}" PARENT_SCOPE)
  503. set(GEN_CPACK_DEBIAN_PACKAGE_SHLIBS "${CPACK_DEBIAN_PACKAGE_SHLIBS_LIST}" PARENT_SCOPE)
  504. set(GEN_CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA}" PARENT_SCOPE)
  505. set(GEN_CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION
  506. "${CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION}" PARENT_SCOPE)
  507. set(GEN_CPACK_DEBIAN_PACKAGE_SOURCE
  508. "${CPACK_DEBIAN_PACKAGE_SOURCE}" PARENT_SCOPE)
  509. set(GEN_CPACK_DEBIAN_GENERATE_POSTINST "${CPACK_DEBIAN_GENERATE_POSTINST}" PARENT_SCOPE)
  510. set(GEN_CPACK_DEBIAN_GENERATE_POSTRM "${CPACK_DEBIAN_GENERATE_POSTRM}" PARENT_SCOPE)
  511. set(GEN_WDIR "${WDIR}" PARENT_SCOPE)
  512. endfunction()
  513. cpack_deb_prepare_package_vars()
  514. cmake_policy(POP)