CPackRPM.cmake 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  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. # Author: Eric Noulard with the help of Alexander Neundorf.
  73. IF(CMAKE_BINARY_DIR)
  74. MESSAGE(FATAL_ERROR "CPackRPM.cmake may only be used by CPack internally.")
  75. ENDIF(CMAKE_BINARY_DIR)
  76. IF(NOT UNIX)
  77. MESSAGE(FATAL_ERROR "CPackRPM.cmake may only be used under UNIX.")
  78. ENDIF(NOT UNIX)
  79. # rpmbuild is the basic command for building RPM package
  80. # it may be a simple (symbolic) link to rpmb command.
  81. FIND_PROGRAM(RPMBUILD_EXECUTABLE rpmbuild)
  82. # Check version of the rpmbuild tool this would be easier to
  83. # track bugs with users and CPackRPM debug mode.
  84. # We may use RPM version in order to check for available version dependent features
  85. IF(RPMBUILD_EXECUTABLE)
  86. execute_process(COMMAND ${RPMBUILD_EXECUTABLE} --version
  87. OUTPUT_VARIABLE _TMP_VERSION
  88. ERROR_QUIET
  89. OUTPUT_STRIP_TRAILING_WHITESPACE)
  90. string(REGEX REPLACE "^.*\ " ""
  91. RPMBUILD_EXECUTABLE_VERSION
  92. ${_TMP_VERSION})
  93. IF(CPACK_RPM_PACKAGE_DEBUG)
  94. MESSAGE("CPackRPM:Debug: rpmbuild version is <${RPMBUILD_EXECUTABLE_VERSION}>")
  95. ENDIF(CPACK_RPM_PACKAGE_DEBUG)
  96. ENDIF(RPMBUILD_EXECUTABLE)
  97. IF(NOT RPMBUILD_EXECUTABLE)
  98. MESSAGE(FATAL_ERROR "RPM package requires rpmbuild executable")
  99. ENDIF(NOT RPMBUILD_EXECUTABLE)
  100. # We may use RPM version in the future in order
  101. # to shut down warning about space in buildtree
  102. # some recent RPM version should support space in different places.
  103. # not checked [yet].
  104. IF(CPACK_TOPLEVEL_DIRECTORY MATCHES ".* .*")
  105. MESSAGE(FATAL_ERROR "${RPMBUILD_EXECUTABLE} can't handle paths with spaces, use a build directory without spaces for building RPMs.")
  106. ENDIF(CPACK_TOPLEVEL_DIRECTORY MATCHES ".* .*")
  107. # If rpmbuild is found
  108. # we try to discover alien since we may be on non RPM distro like Debian.
  109. # In this case we may try to to use more advanced features
  110. # like generating RPM directly from DEB using alien.
  111. # FIXME feature not finished (yet)
  112. FIND_PROGRAM(ALIEN_EXECUTABLE alien)
  113. IF(ALIEN_EXECUTABLE)
  114. MESSAGE(STATUS "alien found, we may be on a Debian based distro.")
  115. ENDIF(ALIEN_EXECUTABLE)
  116. #
  117. # Use user-defined RPM specific variables value
  118. # or generate reasonable default value from
  119. # CPACK_xxx generic values.
  120. # The variables comes from the needed (mandatory or not)
  121. # values found in the RPM specification file aka ".spec" file.
  122. # The variables which may/should be defined are:
  123. #
  124. # CPACK_RPM_PACKAGE_SUMMARY (mandatory)
  125. IF(NOT CPACK_RPM_PACKAGE_SUMMARY)
  126. # if neither var is defined lets use the name as summary
  127. IF(NOT CPACK_PACKAGE_DESCRIPTION_SUMMARY)
  128. STRING(TOLOWER "${CPACK_PACKAGE_NAME}" CPACK_RPM_PACKAGE_SUMMARY)
  129. ELSE(NOT CPACK_PACKAGE_DESCRIPTION_SUMMARY)
  130. SET(CPACK_RPM_PACKAGE_SUMMARY ${CPACK_PACKAGE_DESCRIPTION_SUMMARY})
  131. ENDIF(NOT CPACK_PACKAGE_DESCRIPTION_SUMMARY)
  132. ENDIF(NOT CPACK_RPM_PACKAGE_SUMMARY)
  133. # CPACK_RPM_PACKAGE_NAME (mandatory)
  134. IF(NOT CPACK_RPM_PACKAGE_NAME)
  135. STRING(TOLOWER "${CPACK_PACKAGE_NAME}" CPACK_RPM_PACKAGE_NAME)
  136. ENDIF(NOT CPACK_RPM_PACKAGE_NAME)
  137. # CPACK_RPM_PACKAGE_VERSION (mandatory)
  138. IF(NOT CPACK_RPM_PACKAGE_VERSION)
  139. IF(NOT CPACK_PACKAGE_VERSION)
  140. MESSAGE(FATAL_ERROR "RPM package requires a package version")
  141. ENDIF(NOT CPACK_PACKAGE_VERSION)
  142. SET(CPACK_RPM_PACKAGE_VERSION ${CPACK_PACKAGE_VERSION})
  143. ENDIF(NOT CPACK_RPM_PACKAGE_VERSION)
  144. # CPACK_RPM_PACKAGE_ARCHITECTURE (optional)
  145. IF(CPACK_RPM_PACKAGE_ARCHITECTURE)
  146. SET(TMP_RPM_BUILDARCH "Buildarch: ${CPACK_RPM_PACKAGE_ARCHITECTURE}")
  147. IF(CPACK_RPM_PACKAGE_DEBUG)
  148. MESSAGE("CPackRPM:Debug: using user-specified build arch = ${CPACK_RPM_PACKAGE_ARCHITECTURE}")
  149. ENDIF(CPACK_RPM_PACKAGE_DEBUG)
  150. ELSE(CPACK_RPM_PACKAGE_ARCHITECTURE)
  151. SET(TMP_RPM_BUILDARCH "")
  152. ENDIF(CPACK_RPM_PACKAGE_ARCHITECTURE)
  153. # CPACK_RPM_PACKAGE_RELEASE
  154. # The RPM release is the numbering of the RPM package ITSELF
  155. # this is the version of the PACKAGING and NOT the version
  156. # of the CONTENT of the package.
  157. # You may well need to generate a new RPM package release
  158. # without changing the version of the packaged software.
  159. # This is the case when the packaging is buggy (not) the software :=)
  160. # If not set, 1 is a good candidate
  161. IF(NOT CPACK_RPM_PACKAGE_RELEASE)
  162. SET(CPACK_RPM_PACKAGE_RELEASE 1)
  163. ENDIF(NOT CPACK_RPM_PACKAGE_RELEASE)
  164. # CPACK_RPM_PACKAGE_LICENSE
  165. IF(NOT CPACK_RPM_PACKAGE_LICENSE)
  166. SET(CPACK_RPM_PACKAGE_LICENSE "unknown")
  167. ENDIF(NOT CPACK_RPM_PACKAGE_LICENSE)
  168. # CPACK_RPM_PACKAGE_GROUP
  169. IF(NOT CPACK_RPM_PACKAGE_GROUP)
  170. SET(CPACK_RPM_PACKAGE_GROUP "unknown")
  171. ENDIF(NOT CPACK_RPM_PACKAGE_GROUP)
  172. # CPACK_RPM_PACKAGE_VENDOR
  173. IF(NOT CPACK_RPM_PACKAGE_VENDOR)
  174. IF(CPACK_PACKAGE_VENDOR)
  175. SET(CPACK_RPM_PACKAGE_VENDOR "${CPACK_PACKAGE_VENDOR}")
  176. ELSE(CPACK_PACKAGE_VENDOR)
  177. SET(CPACK_RPM_PACKAGE_VENDOR "unknown")
  178. ENDIF(CPACK_PACKAGE_VENDOR)
  179. ENDIF(NOT CPACK_RPM_PACKAGE_VENDOR)
  180. # CPACK_RPM_PACKAGE_SOURCE
  181. # The name of the source tarball in case we generate a source RPM
  182. # CPACK_RPM_PACKAGE_DESCRIPTION
  183. # The variable content may be either
  184. # - explicitely given by tthe user or
  185. # - filled with the content of CPACK_PACKAGE_DESCRIPTION_FILE
  186. # if it is defined
  187. # - set to a default value
  188. #
  189. IF (NOT CPACK_RPM_PACKAGE_DESCRIPTION)
  190. IF (CPACK_PACKAGE_DESCRIPTION_FILE)
  191. FILE(READ ${CPACK_PACKAGE_DESCRIPTION_FILE} CPACK_RPM_PACKAGE_DESCRIPTION)
  192. ELSE (CPACK_PACKAGE_DESCRIPTION_FILE)
  193. SET(CPACK_RPM_PACKAGE_DESCRIPTION "no package description available")
  194. ENDIF (CPACK_PACKAGE_DESCRIPTION_FILE)
  195. ENDIF (NOT CPACK_RPM_PACKAGE_DESCRIPTION)
  196. # CPACK_RPM_PACKAGE_REQUIRES
  197. # Placeholder used to specify binary RPM dependencies (if any)
  198. # see http://www.rpm.org/max-rpm/s1-rpm-depend-manual-dependencies.html
  199. IF(CPACK_RPM_PACKAGE_REQUIRES)
  200. IF(CPACK_RPM_PACKAGE_DEBUG)
  201. MESSAGE("CPackRPM:Debug: User defined Requires:\n ${CPACK_RPM_PACKAGE_REQUIRES}")
  202. ENDIF(CPACK_RPM_PACKAGE_DEBUG)
  203. SET(TMP_RPM_REQUIRES "Requires: ${CPACK_RPM_PACKAGE_REQUIRES}")
  204. ENDIF(CPACK_RPM_PACKAGE_REQUIRES)
  205. # CPACK_RPM_SPEC_INSTALL_POST
  206. # May be used to define a RPM post intallation script
  207. # for example setting it to "/bin/true" may prevent
  208. # rpmbuild from stripping binaries.
  209. IF(CPACK_RPM_SPEC_INSTALL_POST)
  210. IF(CPACK_RPM_PACKAGE_DEBUG)
  211. MESSAGE("CPackRPM:Debug: User defined CPACK_RPM_SPEC_INSTALL_POST = ${CPACK_RPM_SPEC_INSTALL_POST}")
  212. ENDIF(CPACK_RPM_PACKAGE_DEBUG)
  213. SET(TMP_RPM_SPEC_INSTALL_POST "%define __spec_install_post ${CPACK_RPM_SPEC_INSTALL_POST}")
  214. ENDIF(CPACK_RPM_SPEC_INSTALL_POST)
  215. # CPACK_RPM_SPEC_MORE_DEFINE
  216. # This is a generated spec rpm file spaceholder
  217. IF(CPACK_RPM_SPEC_MORE_DEFINE)
  218. IF(CPACK_RPM_PACKAGE_DEBUG)
  219. MESSAGE("CPackRPM:Debug: User defined more define spec line specified:\n ${CPACK_RPM_SPEC_MORE_DEFINE}")
  220. ENDIF(CPACK_RPM_PACKAGE_DEBUG)
  221. ENDIF(CPACK_RPM_SPEC_MORE_DEFINE)
  222. # CPACK_RPM_USER_BINARY_SPECFILE
  223. # FIXME when this is set then CPack should us the
  224. # user provided file.
  225. # Now we may create the RPM build tree structure
  226. SET(CPACK_RPM_ROOTDIR "${CPACK_TOPLEVEL_DIRECTORY}")
  227. MESSAGE(STATUS "CPackRPM:Debug: Using CPACK_RPM_ROOTDIR=${CPACK_RPM_ROOTDIR}")
  228. # Prepare RPM build tree
  229. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR})
  230. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR}/tmp)
  231. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR}/BUILD)
  232. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR}/RPMS)
  233. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR}/SOURCES)
  234. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR}/SPECS)
  235. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR}/SRPMS)
  236. #SET(CPACK_RPM_FILE_NAME "${CPACK_RPM_PACKAGE_NAME}-${CPACK_RPM_PACKAGE_VERSION}-${CPACK_RPM_PACKAGE_RELEASE}-${CPACK_RPM_PACKAGE_ARCHITECTURE}.rpm")
  237. SET(CPACK_RPM_FILE_NAME "${CPACK_OUTPUT_FILE_NAME}")
  238. # it seems rpmbuild can't handle spaces in the path
  239. # neither escaping (as below) nor putting quotes around the path seem to help
  240. #STRING(REGEX REPLACE " " "\\\\ " CPACK_RPM_DIRECTORY "${CPACK_TOPLEVEL_DIRECTORY}")
  241. SET(CPACK_RPM_DIRECTORY "${CPACK_TOPLEVEL_DIRECTORY}")
  242. SET(CPACK_RPM_BINARY_SPECFILE "${CPACK_RPM_ROOTDIR}/SPECS/${CPACK_RPM_PACKAGE_NAME}.spec")
  243. IF(CPACK_RPM_USER_BINARY_SPECFILE)
  244. # User may have specified SPECFILE just use it
  245. MESSAGE("CPackRPM: Will use user specified spec file: ${CPACK_RPM_USER_BINARY_SPECFILE}")
  246. # Note that user provided file is processed for @var replacement
  247. CONFIGURE_FILE(${CPACK_RPM_USER_BINARY_SPECFILE} ${CPACK_RPM_BINARY_SPECFILE} @ONLY)
  248. ELSE(CPACK_RPM_USER_BINARY_SPECFILE)
  249. # No User specified spec file generate a valid one using var values
  250. IF(CPACK_RPM_PACKAGE_DEBUG)
  251. MESSAGE("CPackRPM:Debug: CPACK_TOPLEVEL_DIRECTORY = ${CPACK_TOPLEVEL_DIRECTORY}")
  252. MESSAGE("CPackRPM:Debug: CPACK_TOPLEVEL_TAG = ${CPACK_TOPLEVEL_TAG}")
  253. MESSAGE("CPackRPM:Debug: CPACK_TEMPORARY_DIRECTORY = ${CPACK_TEMPORARY_DIRECTORY}")
  254. MESSAGE("CPackRPM:Debug: CPACK_OUTPUT_FILE_NAME = ${CPACK_OUTPUT_FILE_NAME}")
  255. MESSAGE("CPackRPM:Debug: CPACK_OUTPUT_FILE_PATH = ${CPACK_OUTPUT_FILE_PATH}")
  256. MESSAGE("CPackRPM:Debug: CPACK_PACKAGE_FILE_NAME = ${CPACK_PACKAGE_FILE_NAME}")
  257. MESSAGE("CPackRPM:Debug: CPACK_RPM_BINARY_SPECFILE = ${CPACK_RPM_BINARY_SPECFILE}")
  258. MESSAGE("CPackRPM:Debug: CPACK_PACKAGE_INSTALL_DIRECTORY = ${CPACK_PACKAGE_INSTALL_DIRECTORY}")
  259. MESSAGE("CPackRPM:Debug: CPACK_TEMPORARY_PACKAGE_FILE_NAME = ${CPACK_TEMPORARY_PACKAGE_FILE_NAME}")
  260. ENDIF(CPACK_RPM_PACKAGE_DEBUG)
  261. FILE(WRITE ${CPACK_RPM_BINARY_SPECFILE}
  262. "# -*- rpm-spec -*-
  263. Buildroot: ${CPACK_RPM_DIRECTORY}/${CPACK_PACKAGE_FILE_NAME}
  264. Summary: ${CPACK_RPM_PACKAGE_SUMMARY}
  265. Name: ${CPACK_RPM_PACKAGE_NAME}
  266. Version: ${CPACK_RPM_PACKAGE_VERSION}
  267. Release: ${CPACK_RPM_PACKAGE_RELEASE}
  268. License: ${CPACK_RPM_PACKAGE_LICENSE}
  269. Group: ${CPACK_RPM_PACKAGE_GROUP}
  270. Vendor: ${CPACK_RPM_PACKAGE_VENDOR}
  271. ${TMP_RPM_REQUIRES}
  272. ${TMP_RPM_BUILDARCH}
  273. #p define prefix ${CMAKE_INSTALL_PREFIX}
  274. %define _rpmdir ${CPACK_RPM_DIRECTORY}
  275. %define _rpmfilename ${CPACK_RPM_FILE_NAME}
  276. %define _unpackaged_files_terminate_build 0
  277. %define _topdir ${CPACK_RPM_DIRECTORY}
  278. ${TMP_RPM_SPEC_INSTALL_POST}
  279. ${CPACK_RPM_SPEC_MORE_DEFINE}
  280. %description
  281. ${CPACK_RPM_PACKAGE_DESCRIPTION}
  282. # This is a shortcutted spec file
  283. # generated by CMake RPM generator
  284. # we skip the _prepn _build and _install
  285. # steps because CPack does that for us
  286. #p prep
  287. #p build
  288. #p install
  289. %clean
  290. %files
  291. %defattr(-,root,root,-)
  292. #p dir %{prefix}
  293. #p {prefix}/*
  294. /*
  295. %changelog
  296. * Mon Oct 03 2008 Erk <[email protected]>
  297. Update generator to handle optional dependencies using Requires
  298. Update DEBUG output typos.
  299. * Mon Aug 25 2008 Erk <[email protected]>
  300. Update generator to handle optional post-install
  301. * Tue Aug 16 2007 Erk <[email protected]>
  302. Generated by CPack RPM Generator and associated macros
  303. ")
  304. ENDIF(CPACK_RPM_USER_BINARY_SPECFILE)
  305. IF(RPMBUILD_EXECUTABLE)
  306. # Now call rpmbuild using the SPECFILE
  307. EXECUTE_PROCESS(
  308. COMMAND "${RPMBUILD_EXECUTABLE}" -bb
  309. --buildroot "${CPACK_RPM_DIRECTORY}/${CPACK_PACKAGE_FILE_NAME}"
  310. "${CPACK_RPM_BINARY_SPECFILE}"
  311. WORKING_DIRECTORY "${CPACK_TOPLEVEL_DIRECTORY}/${CPACK_PACKAGE_FILE_NAME}"
  312. ERROR_FILE "${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild.err"
  313. OUTPUT_FILE "${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild.out")
  314. IF(CPACK_RPM_PACKAGE_DEBUG)
  315. MESSAGE("CPackRPM:Debug: You may consult rpmbuild logs in: ")
  316. MESSAGE("CPackRPM:Debug: - ${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild.err")
  317. MESSAGE("CPackRPM:Debug: - ${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild.out")
  318. ENDIF(CPACK_RPM_PACKAGE_DEBUG)
  319. ELSE(RPMBUILD_EXECUTABLE)
  320. IF(ALIEN_EXECUTABLE)
  321. MESSAGE(FATAL_ERROR "RPM packaging through alien not done (yet)")
  322. ENDIF(ALIEN_EXECUTABLE)
  323. ENDIF(RPMBUILD_EXECUTABLE)