CPackRPM.cmake 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. # - The builtin (binary) CPack RPM generator (Unix only)
  2. # CPackRPM may be used to create RPM package using CPack.
  3. # CPackRPM is a CPack generator thus it uses the CPACK_XXX variables
  4. # used by CPack : http://www.cmake.org/Wiki/CMake:CPackConfiguration
  5. #
  6. # However CPackRPM has specific features which are controlled by
  7. # the specifics CPACK_RPM_XXX variables.You'll find a detailed usage on
  8. # the wiki:
  9. # http://www.cmake.org/Wiki/CMake:CPackPackageGenerators#RPM_.28Unix_Only.29
  10. # However as a handy reminder here comes the list of specific variables:
  11. #
  12. # CPACK_RPM_PACKAGE_SUMMARY
  13. # Mandatory : YES
  14. # Default : CPACK_PACKAGE_DESCRIPTION
  15. # The RPM package summary
  16. # CPACK_RPM_PACKAGE_NAME
  17. # Mandatory : YES
  18. # Default : CPACK_PACKAGE_NAME
  19. # The RPM package name
  20. # CPACK_RPM_PACKAGE_VERSION
  21. # Mandatory : YES
  22. # Default : CPACK_PACKAGE_VERSION
  23. # The RPM package version
  24. # CPACK_RPM_PACKAGE_ARCHITECTURE
  25. # Mandatory : NO
  26. # Default : -
  27. # The RPM package architecture. This may be set to "noarch" if you
  28. # know you are building a noarch package.
  29. # CPACK_RPM_PACKAGE_RELEASE
  30. # Mandatory : YES
  31. # Default : 1
  32. # The RPM package release. This is the numbering of the RPM package
  33. # itself, i.e. the version of the packaging and not the version of the
  34. # content (see CPACK_RPM_PACKAGE_VERSION). One may change the default
  35. # value if the previous packaging was buggy and/or you want to put here
  36. # a fancy Linux distro specific numbering.
  37. # CPACK_RPM_PACKAGE_LICENSE
  38. # Mandatory : YES
  39. # Default : "unknown"
  40. # The RPM package license policy.
  41. # CPACK_RPM_PACKAGE_GROUP
  42. # Mandatory : YES
  43. # Default : "unknown"
  44. # The RPM package group.
  45. # CPACK_RPM_PACKAGE_VENDOR
  46. # Mandatory : YES
  47. # Default : CPACK_PACKAGE_VENDOR if set or"unknown"
  48. # The RPM package group.
  49. # CPACK_RPM_PACKAGE_DESCRIPTION
  50. # Mandatory : YES
  51. # Default : CPACK_PACKAGE_DESCRIPTION_FILE if set or "no package description available"
  52. # CPACK_RPM_PACKAGE_REQUIRES
  53. # Mandatory : NO
  54. # Default : -
  55. # May be used to set RPM dependencies.
  56. # CPACK_RPM_SPEC_INSTALL_POST
  57. # Mandatory : NO
  58. # Default : -
  59. # May be used to set an RPM post-install command inside the spec file.
  60. # For example setting it to "/bin/true" may be used to prevent
  61. # rpmbuild to strip binaries.
  62. # CPACK_RPM_SPEC_MORE_DEFINE
  63. # Mandatory : NO
  64. # Default : -
  65. # May be used to add any %define lines to the generated spec file.
  66. # CPACK_RPM_PACKAGE_DEBUG
  67. # Mandatory : NO
  68. # Default : -
  69. # May be set when invoking cpack in order to trace debug informations
  70. # during CPack RPM run. For example you may launch CPack like this
  71. # cpack -D CPACK_RPM_PACKAGE_DEBUG=1 -G RPM
  72. #=============================================================================
  73. # Copyright 2007-2009 Kitware, Inc.
  74. #
  75. # Distributed under the OSI-approved BSD License (the "License");
  76. # see accompanying file Copyright.txt for details.
  77. #
  78. # This software is distributed WITHOUT ANY WARRANTY; without even the
  79. # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  80. # See the License for more information.
  81. #=============================================================================
  82. # (To distributed this file outside of CMake, substitute the full
  83. # License text for the above reference.)
  84. # Author: Eric Noulard with the help of Alexander Neundorf.
  85. IF(CMAKE_BINARY_DIR)
  86. MESSAGE(FATAL_ERROR "CPackRPM.cmake may only be used by CPack internally.")
  87. ENDIF(CMAKE_BINARY_DIR)
  88. IF(NOT UNIX)
  89. MESSAGE(FATAL_ERROR "CPackRPM.cmake may only be used under UNIX.")
  90. ENDIF(NOT UNIX)
  91. # rpmbuild is the basic command for building RPM package
  92. # it may be a simple (symbolic) link to rpmb command.
  93. FIND_PROGRAM(RPMBUILD_EXECUTABLE rpmbuild)
  94. # Check version of the rpmbuild tool this would be easier to
  95. # track bugs with users and CPackRPM debug mode.
  96. # We may use RPM version in order to check for available version dependent features
  97. IF(RPMBUILD_EXECUTABLE)
  98. execute_process(COMMAND ${RPMBUILD_EXECUTABLE} --version
  99. OUTPUT_VARIABLE _TMP_VERSION
  100. ERROR_QUIET
  101. OUTPUT_STRIP_TRAILING_WHITESPACE)
  102. string(REGEX REPLACE "^.*\ " ""
  103. RPMBUILD_EXECUTABLE_VERSION
  104. ${_TMP_VERSION})
  105. IF(CPACK_RPM_PACKAGE_DEBUG)
  106. MESSAGE("CPackRPM:Debug: rpmbuild version is <${RPMBUILD_EXECUTABLE_VERSION}>")
  107. ENDIF(CPACK_RPM_PACKAGE_DEBUG)
  108. ENDIF(RPMBUILD_EXECUTABLE)
  109. IF(NOT RPMBUILD_EXECUTABLE)
  110. MESSAGE(FATAL_ERROR "RPM package requires rpmbuild executable")
  111. ENDIF(NOT RPMBUILD_EXECUTABLE)
  112. # We may use RPM version in the future in order
  113. # to shut down warning about space in buildtree
  114. # some recent RPM version should support space in different places.
  115. # not checked [yet].
  116. IF(CPACK_TOPLEVEL_DIRECTORY MATCHES ".* .*")
  117. MESSAGE(FATAL_ERROR "${RPMBUILD_EXECUTABLE} can't handle paths with spaces, use a build directory without spaces for building RPMs.")
  118. ENDIF(CPACK_TOPLEVEL_DIRECTORY MATCHES ".* .*")
  119. # If rpmbuild is found
  120. # we try to discover alien since we may be on non RPM distro like Debian.
  121. # In this case we may try to to use more advanced features
  122. # like generating RPM directly from DEB using alien.
  123. # FIXME feature not finished (yet)
  124. FIND_PROGRAM(ALIEN_EXECUTABLE alien)
  125. IF(ALIEN_EXECUTABLE)
  126. MESSAGE(STATUS "alien found, we may be on a Debian based distro.")
  127. ENDIF(ALIEN_EXECUTABLE)
  128. #
  129. # Use user-defined RPM specific variables value
  130. # or generate reasonable default value from
  131. # CPACK_xxx generic values.
  132. # The variables comes from the needed (mandatory or not)
  133. # values found in the RPM specification file aka ".spec" file.
  134. # The variables which may/should be defined are:
  135. #
  136. # CPACK_RPM_PACKAGE_SUMMARY (mandatory)
  137. IF(NOT CPACK_RPM_PACKAGE_SUMMARY)
  138. # if neither var is defined lets use the name as summary
  139. IF(NOT CPACK_PACKAGE_DESCRIPTION_SUMMARY)
  140. STRING(TOLOWER "${CPACK_PACKAGE_NAME}" CPACK_RPM_PACKAGE_SUMMARY)
  141. ELSE(NOT CPACK_PACKAGE_DESCRIPTION_SUMMARY)
  142. SET(CPACK_RPM_PACKAGE_SUMMARY ${CPACK_PACKAGE_DESCRIPTION_SUMMARY})
  143. ENDIF(NOT CPACK_PACKAGE_DESCRIPTION_SUMMARY)
  144. ENDIF(NOT CPACK_RPM_PACKAGE_SUMMARY)
  145. # CPACK_RPM_PACKAGE_NAME (mandatory)
  146. IF(NOT CPACK_RPM_PACKAGE_NAME)
  147. STRING(TOLOWER "${CPACK_PACKAGE_NAME}" CPACK_RPM_PACKAGE_NAME)
  148. ENDIF(NOT CPACK_RPM_PACKAGE_NAME)
  149. # CPACK_RPM_PACKAGE_VERSION (mandatory)
  150. IF(NOT CPACK_RPM_PACKAGE_VERSION)
  151. IF(NOT CPACK_PACKAGE_VERSION)
  152. MESSAGE(FATAL_ERROR "RPM package requires a package version")
  153. ENDIF(NOT CPACK_PACKAGE_VERSION)
  154. SET(CPACK_RPM_PACKAGE_VERSION ${CPACK_PACKAGE_VERSION})
  155. ENDIF(NOT CPACK_RPM_PACKAGE_VERSION)
  156. # CPACK_RPM_PACKAGE_ARCHITECTURE (optional)
  157. IF(CPACK_RPM_PACKAGE_ARCHITECTURE)
  158. SET(TMP_RPM_BUILDARCH "Buildarch: ${CPACK_RPM_PACKAGE_ARCHITECTURE}")
  159. IF(CPACK_RPM_PACKAGE_DEBUG)
  160. MESSAGE("CPackRPM:Debug: using user-specified build arch = ${CPACK_RPM_PACKAGE_ARCHITECTURE}")
  161. ENDIF(CPACK_RPM_PACKAGE_DEBUG)
  162. ELSE(CPACK_RPM_PACKAGE_ARCHITECTURE)
  163. SET(TMP_RPM_BUILDARCH "")
  164. ENDIF(CPACK_RPM_PACKAGE_ARCHITECTURE)
  165. # CPACK_RPM_PACKAGE_RELEASE
  166. # The RPM release is the numbering of the RPM package ITSELF
  167. # this is the version of the PACKAGING and NOT the version
  168. # of the CONTENT of the package.
  169. # You may well need to generate a new RPM package release
  170. # without changing the version of the packaged software.
  171. # This is the case when the packaging is buggy (not) the software :=)
  172. # If not set, 1 is a good candidate
  173. IF(NOT CPACK_RPM_PACKAGE_RELEASE)
  174. SET(CPACK_RPM_PACKAGE_RELEASE 1)
  175. ENDIF(NOT CPACK_RPM_PACKAGE_RELEASE)
  176. # CPACK_RPM_PACKAGE_LICENSE
  177. IF(NOT CPACK_RPM_PACKAGE_LICENSE)
  178. SET(CPACK_RPM_PACKAGE_LICENSE "unknown")
  179. ENDIF(NOT CPACK_RPM_PACKAGE_LICENSE)
  180. # CPACK_RPM_PACKAGE_GROUP
  181. IF(NOT CPACK_RPM_PACKAGE_GROUP)
  182. SET(CPACK_RPM_PACKAGE_GROUP "unknown")
  183. ENDIF(NOT CPACK_RPM_PACKAGE_GROUP)
  184. # CPACK_RPM_PACKAGE_VENDOR
  185. IF(NOT CPACK_RPM_PACKAGE_VENDOR)
  186. IF(CPACK_PACKAGE_VENDOR)
  187. SET(CPACK_RPM_PACKAGE_VENDOR "${CPACK_PACKAGE_VENDOR}")
  188. ELSE(CPACK_PACKAGE_VENDOR)
  189. SET(CPACK_RPM_PACKAGE_VENDOR "unknown")
  190. ENDIF(CPACK_PACKAGE_VENDOR)
  191. ENDIF(NOT CPACK_RPM_PACKAGE_VENDOR)
  192. # CPACK_RPM_PACKAGE_SOURCE
  193. # The name of the source tarball in case we generate a source RPM
  194. # CPACK_RPM_PACKAGE_DESCRIPTION
  195. # The variable content may be either
  196. # - explicitely given by tthe user or
  197. # - filled with the content of CPACK_PACKAGE_DESCRIPTION_FILE
  198. # if it is defined
  199. # - set to a default value
  200. #
  201. IF (NOT CPACK_RPM_PACKAGE_DESCRIPTION)
  202. IF (CPACK_PACKAGE_DESCRIPTION_FILE)
  203. FILE(READ ${CPACK_PACKAGE_DESCRIPTION_FILE} CPACK_RPM_PACKAGE_DESCRIPTION)
  204. ELSE (CPACK_PACKAGE_DESCRIPTION_FILE)
  205. SET(CPACK_RPM_PACKAGE_DESCRIPTION "no package description available")
  206. ENDIF (CPACK_PACKAGE_DESCRIPTION_FILE)
  207. ENDIF (NOT CPACK_RPM_PACKAGE_DESCRIPTION)
  208. # CPACK_RPM_PACKAGE_REQUIRES
  209. # Placeholder used to specify binary RPM dependencies (if any)
  210. # see http://www.rpm.org/max-rpm/s1-rpm-depend-manual-dependencies.html
  211. IF(CPACK_RPM_PACKAGE_REQUIRES)
  212. IF(CPACK_RPM_PACKAGE_DEBUG)
  213. MESSAGE("CPackRPM:Debug: User defined Requires:\n ${CPACK_RPM_PACKAGE_REQUIRES}")
  214. ENDIF(CPACK_RPM_PACKAGE_DEBUG)
  215. SET(TMP_RPM_REQUIRES "Requires: ${CPACK_RPM_PACKAGE_REQUIRES}")
  216. ENDIF(CPACK_RPM_PACKAGE_REQUIRES)
  217. # CPACK_RPM_SPEC_INSTALL_POST
  218. # May be used to define a RPM post intallation script
  219. # for example setting it to "/bin/true" may prevent
  220. # rpmbuild from stripping binaries.
  221. IF(CPACK_RPM_SPEC_INSTALL_POST)
  222. IF(CPACK_RPM_PACKAGE_DEBUG)
  223. MESSAGE("CPackRPM:Debug: User defined CPACK_RPM_SPEC_INSTALL_POST = ${CPACK_RPM_SPEC_INSTALL_POST}")
  224. ENDIF(CPACK_RPM_PACKAGE_DEBUG)
  225. SET(TMP_RPM_SPEC_INSTALL_POST "%define __spec_install_post ${CPACK_RPM_SPEC_INSTALL_POST}")
  226. ENDIF(CPACK_RPM_SPEC_INSTALL_POST)
  227. # CPACK_RPM_SPEC_MORE_DEFINE
  228. # This is a generated spec rpm file spaceholder
  229. IF(CPACK_RPM_SPEC_MORE_DEFINE)
  230. IF(CPACK_RPM_PACKAGE_DEBUG)
  231. MESSAGE("CPackRPM:Debug: User defined more define spec line specified:\n ${CPACK_RPM_SPEC_MORE_DEFINE}")
  232. ENDIF(CPACK_RPM_PACKAGE_DEBUG)
  233. ENDIF(CPACK_RPM_SPEC_MORE_DEFINE)
  234. # CPACK_RPM_USER_BINARY_SPECFILE
  235. # FIXME when this is set then CPack should us the
  236. # user provided file.
  237. # Now we may create the RPM build tree structure
  238. SET(CPACK_RPM_ROOTDIR "${CPACK_TOPLEVEL_DIRECTORY}")
  239. MESSAGE(STATUS "CPackRPM:Debug: Using CPACK_RPM_ROOTDIR=${CPACK_RPM_ROOTDIR}")
  240. # Prepare RPM build tree
  241. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR})
  242. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR}/tmp)
  243. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR}/BUILD)
  244. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR}/RPMS)
  245. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR}/SOURCES)
  246. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR}/SPECS)
  247. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR}/SRPMS)
  248. #SET(CPACK_RPM_FILE_NAME "${CPACK_RPM_PACKAGE_NAME}-${CPACK_RPM_PACKAGE_VERSION}-${CPACK_RPM_PACKAGE_RELEASE}-${CPACK_RPM_PACKAGE_ARCHITECTURE}.rpm")
  249. SET(CPACK_RPM_FILE_NAME "${CPACK_OUTPUT_FILE_NAME}")
  250. # it seems rpmbuild can't handle spaces in the path
  251. # neither escaping (as below) nor putting quotes around the path seem to help
  252. #STRING(REGEX REPLACE " " "\\\\ " CPACK_RPM_DIRECTORY "${CPACK_TOPLEVEL_DIRECTORY}")
  253. SET(CPACK_RPM_DIRECTORY "${CPACK_TOPLEVEL_DIRECTORY}")
  254. SET(CPACK_RPM_BINARY_SPECFILE "${CPACK_RPM_ROOTDIR}/SPECS/${CPACK_RPM_PACKAGE_NAME}.spec")
  255. IF(CPACK_RPM_USER_BINARY_SPECFILE)
  256. # User may have specified SPECFILE just use it
  257. MESSAGE("CPackRPM: Will use user specified spec file: ${CPACK_RPM_USER_BINARY_SPECFILE}")
  258. # Note that user provided file is processed for @var replacement
  259. CONFIGURE_FILE(${CPACK_RPM_USER_BINARY_SPECFILE} ${CPACK_RPM_BINARY_SPECFILE} @ONLY)
  260. ELSE(CPACK_RPM_USER_BINARY_SPECFILE)
  261. # No User specified spec file generate a valid one using var values
  262. IF(CPACK_RPM_PACKAGE_DEBUG)
  263. MESSAGE("CPackRPM:Debug: CPACK_TOPLEVEL_DIRECTORY = ${CPACK_TOPLEVEL_DIRECTORY}")
  264. MESSAGE("CPackRPM:Debug: CPACK_TOPLEVEL_TAG = ${CPACK_TOPLEVEL_TAG}")
  265. MESSAGE("CPackRPM:Debug: CPACK_TEMPORARY_DIRECTORY = ${CPACK_TEMPORARY_DIRECTORY}")
  266. MESSAGE("CPackRPM:Debug: CPACK_OUTPUT_FILE_NAME = ${CPACK_OUTPUT_FILE_NAME}")
  267. MESSAGE("CPackRPM:Debug: CPACK_OUTPUT_FILE_PATH = ${CPACK_OUTPUT_FILE_PATH}")
  268. MESSAGE("CPackRPM:Debug: CPACK_PACKAGE_FILE_NAME = ${CPACK_PACKAGE_FILE_NAME}")
  269. MESSAGE("CPackRPM:Debug: CPACK_RPM_BINARY_SPECFILE = ${CPACK_RPM_BINARY_SPECFILE}")
  270. MESSAGE("CPackRPM:Debug: CPACK_PACKAGE_INSTALL_DIRECTORY = ${CPACK_PACKAGE_INSTALL_DIRECTORY}")
  271. MESSAGE("CPackRPM:Debug: CPACK_TEMPORARY_PACKAGE_FILE_NAME = ${CPACK_TEMPORARY_PACKAGE_FILE_NAME}")
  272. ENDIF(CPACK_RPM_PACKAGE_DEBUG)
  273. FILE(WRITE ${CPACK_RPM_BINARY_SPECFILE}
  274. "# -*- rpm-spec -*-
  275. Buildroot: ${CPACK_RPM_DIRECTORY}/${CPACK_PACKAGE_FILE_NAME}
  276. Summary: ${CPACK_RPM_PACKAGE_SUMMARY}
  277. Name: ${CPACK_RPM_PACKAGE_NAME}
  278. Version: ${CPACK_RPM_PACKAGE_VERSION}
  279. Release: ${CPACK_RPM_PACKAGE_RELEASE}
  280. License: ${CPACK_RPM_PACKAGE_LICENSE}
  281. Group: ${CPACK_RPM_PACKAGE_GROUP}
  282. Vendor: ${CPACK_RPM_PACKAGE_VENDOR}
  283. ${TMP_RPM_REQUIRES}
  284. ${TMP_RPM_BUILDARCH}
  285. #p define prefix ${CMAKE_INSTALL_PREFIX}
  286. %define _rpmdir ${CPACK_RPM_DIRECTORY}
  287. %define _rpmfilename ${CPACK_RPM_FILE_NAME}
  288. %define _unpackaged_files_terminate_build 0
  289. %define _topdir ${CPACK_RPM_DIRECTORY}
  290. ${TMP_RPM_SPEC_INSTALL_POST}
  291. ${CPACK_RPM_SPEC_MORE_DEFINE}
  292. %description
  293. ${CPACK_RPM_PACKAGE_DESCRIPTION}
  294. # This is a shortcutted spec file
  295. # generated by CMake RPM generator
  296. # we skip the _prepn _build and _install
  297. # steps because CPack does that for us
  298. #p prep
  299. #p build
  300. #p install
  301. %clean
  302. %files
  303. %defattr(-,root,root,-)
  304. #p dir %{prefix}
  305. #p {prefix}/*
  306. /*
  307. %changelog
  308. * Mon Oct 03 2008 Erk <[email protected]>
  309. Update generator to handle optional dependencies using Requires
  310. Update DEBUG output typos.
  311. * Mon Aug 25 2008 Erk <[email protected]>
  312. Update generator to handle optional post-install
  313. * Tue Aug 16 2007 Erk <[email protected]>
  314. Generated by CPack RPM Generator and associated macros
  315. ")
  316. ENDIF(CPACK_RPM_USER_BINARY_SPECFILE)
  317. IF(RPMBUILD_EXECUTABLE)
  318. # Now call rpmbuild using the SPECFILE
  319. EXECUTE_PROCESS(
  320. COMMAND "${RPMBUILD_EXECUTABLE}" -bb
  321. --buildroot "${CPACK_RPM_DIRECTORY}/${CPACK_PACKAGE_FILE_NAME}"
  322. "${CPACK_RPM_BINARY_SPECFILE}"
  323. WORKING_DIRECTORY "${CPACK_TOPLEVEL_DIRECTORY}/${CPACK_PACKAGE_FILE_NAME}"
  324. ERROR_FILE "${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild.err"
  325. OUTPUT_FILE "${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild.out")
  326. IF(CPACK_RPM_PACKAGE_DEBUG)
  327. MESSAGE("CPackRPM:Debug: You may consult rpmbuild logs in: ")
  328. MESSAGE("CPackRPM:Debug: - ${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild.err")
  329. MESSAGE("CPackRPM:Debug: - ${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild.out")
  330. ENDIF(CPACK_RPM_PACKAGE_DEBUG)
  331. ELSE(RPMBUILD_EXECUTABLE)
  332. IF(ALIEN_EXECUTABLE)
  333. MESSAGE(FATAL_ERROR "RPM packaging through alien not done (yet)")
  334. ENDIF(ALIEN_EXECUTABLE)
  335. ENDIF(RPMBUILD_EXECUTABLE)