CPackRPM.cmake 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. # CPack script for creating RPM package
  2. # Author: Eric Noulard with the help of Alexander Neundorf.
  3. # All variables used by CPackRPM begins with CPACK_RPM_ prefix
  4. #
  5. # Here comes the list of used variables:
  6. #
  7. IF(CMAKE_BINARY_DIR)
  8. MESSAGE(FATAL_ERROR "CPackRPM.cmake may only be used by CPack internally.")
  9. ENDIF(CMAKE_BINARY_DIR)
  10. IF(NOT UNIX)
  11. MESSAGE(FATAL_ERROR "CPackRPM.cmake may only be used under UNIX.")
  12. ENDIF(NOT UNIX)
  13. # rpmbuild is the basic command for building RPM package
  14. # it may be a simple (symbolic) link to rpmb command.
  15. FIND_PROGRAM(RPMBUILD_EXECUTABLE rpmbuild)
  16. IF(NOT RPMBUILD_EXECUTABLE)
  17. MESSAGE(FATAL_ERROR "RPM package requires rpmbuild executable")
  18. ENDIF(NOT RPMBUILD_EXECUTABLE)
  19. IF(CPACK_TOPLEVEL_DIRECTORY MATCHES ".* .*")
  20. MESSAGE(FATAL_ERROR "${RPMBUILD_EXECUTABLE} can't handle paths with spaces, use a build directory without spaces for building RPMs.")
  21. ENDIF(CPACK_TOPLEVEL_DIRECTORY MATCHES ".* .*")
  22. # If rpmbuild is found
  23. # we try to discover alien since we may be on non RPM distro like Debian.
  24. # In this case we may try to to use more advanced features
  25. # like generating RPM directly from DEB using alien.
  26. # FIXME feature not finished (yet)
  27. FIND_PROGRAM(ALIEN_EXECUTABLE alien)
  28. IF(ALIEN_EXECUTABLE)
  29. MESSAGE(STATUS "alien found, we may be on a Debian based distro.")
  30. ENDIF(ALIEN_EXECUTABLE)
  31. #
  32. # Use user-defined RPM specific variables value
  33. # or generate reasonable default value from
  34. # CPACK_xxx generic values.
  35. # The variables comes from the needed (mandatory or not)
  36. # values found in the RPM specification file aka ".spec" file.
  37. # The variables which may/should be defined are:
  38. #
  39. # CPACK_RPM_PACKAGE_SUMMARY (mandatory)
  40. IF(NOT CPACK_RPM_PACKAGE_SUMMARY)
  41. # if neither var is defined lets use the name as summary
  42. IF(NOT CPACK_PACKAGE_DESCRIPTION_SUMMARY)
  43. STRING(TOLOWER "${CPACK_PACKAGE_NAME}" CPACK_RPM_PACKAGE_SUMMARY)
  44. ELSE(NOT CPACK_PACKAGE_DESCRIPTION_SUMMARY)
  45. SET(CPACK_RPM_PACKAGE_SUMMARY ${CPACK_PACKAGE_DESCRIPTION_SUMMARY})
  46. ENDIF(NOT CPACK_PACKAGE_DESCRIPTION_SUMMARY)
  47. ENDIF(NOT CPACK_RPM_PACKAGE_SUMMARY)
  48. # CPACK_RPM_PACKAGE_NAME (mandatory)
  49. IF(NOT CPACK_RPM_PACKAGE_NAME)
  50. STRING(TOLOWER "${CPACK_PACKAGE_NAME}" CPACK_RPM_PACKAGE_NAME)
  51. ENDIF(NOT CPACK_RPM_PACKAGE_NAME)
  52. # CPACK_RPM_PACKAGE_VERSION (mandatory)
  53. IF(NOT CPACK_RPM_PACKAGE_VERSION)
  54. IF(NOT CPACK_PACKAGE_VERSION)
  55. MESSAGE(FATAL_ERROR "RPM package requires a package version")
  56. ENDIF(NOT CPACK_PACKAGE_VERSION)
  57. SET(CPACK_RPM_PACKAGE_VERSION ${CPACK_PACKAGE_VERSION})
  58. ENDIF(NOT CPACK_RPM_PACKAGE_VERSION)
  59. # CPACK_RPM_PACKAGE_ARCHITECTURE (optional)
  60. IF(CPACK_RPM_PACKAGE_ARCHITECTURE)
  61. SET(TMP_RPM_BUILDARCH "Buildarch: ${CPACK_RPM_PACKAGE_ARCHITECTURE}")
  62. IF(CPACK_RPM_PACKAGE_DEBUG)
  63. MESSAGE("CPackRPM:Debug: using user-specified build arch = ${CPACK_RPM_PACKAGE_ARCHITECTURE}")
  64. ENDIF(CPACK_RPM_PACKAGE_DEBUG)
  65. ELSE(CPACK_RPM_PACKAGE_ARCHITECTURE)
  66. SET(TMP_RPM_BUILDARCH "")
  67. ENDIF(CPACK_RPM_PACKAGE_ARCHITECTURE)
  68. # CPACK_RPM_PACKAGE_RELEASE
  69. # The RPM release is the numbering of the RPM package ITSELF
  70. # this is the version of the PACKAGING and NOT the version
  71. # of the CONTENT of the package.
  72. # You may well need to generate a new RPM package release
  73. # without changing the version of the packaged software.
  74. # This is the case when the packaging is buggy (not) the software :=)
  75. # If not set, 1 is a good candidate
  76. IF(NOT CPACK_RPM_PACKAGE_RELEASE)
  77. SET(CPACK_RPM_PACKAGE_RELEASE 1)
  78. ENDIF(NOT CPACK_RPM_PACKAGE_RELEASE)
  79. # CPACK_RPM_PACKAGE_LICENSE
  80. IF(NOT CPACK_RPM_PACKAGE_LICENSE)
  81. SET(CPACK_RPM_PACKAGE_LICENSE "unknown")
  82. ENDIF(NOT CPACK_RPM_PACKAGE_LICENSE)
  83. # CPACK_RPM_PACKAGE_GROUP
  84. IF(NOT CPACK_RPM_PACKAGE_GROUP)
  85. SET(CPACK_RPM_PACKAGE_GROUP "unknown")
  86. ENDIF(NOT CPACK_RPM_PACKAGE_GROUP)
  87. # CPACK_RPM_PACKAGE_VENDOR
  88. IF(NOT CPACK_RPM_PACKAGE_VENDOR)
  89. IF(CPACK_PACKAGE_VENDOR)
  90. SET(CPACK_RPM_PACKAGE_VENDOR "${CPACK_PACKAGE_VENDOR}")
  91. ELSE(CPACK_PACKAGE_VENDOR)
  92. SET(CPACK_RPM_PACKAGE_VENDOR "unknown")
  93. ENDIF(CPACK_PACKAGE_VENDOR)
  94. ENDIF(NOT CPACK_RPM_PACKAGE_VENDOR)
  95. # CPACK_RPM_PACKAGE_SOURCE
  96. # The name of the source tarball in case we generate a source RPM
  97. # CPACK_RPM_PACKAGE_DESCRIPTION
  98. # The variable content may be either
  99. # - explicitely given by tthe user or
  100. # - filled with the content of CPACK_PACKAGE_DESCRIPTION_FILE
  101. # if it is defined
  102. # - set to a default value
  103. #
  104. IF (NOT CPACK_RPM_PACKAGE_DESCRIPTION)
  105. IF (CPACK_PACKAGE_DESCRIPTION_FILE)
  106. FILE(READ ${CPACK_PACKAGE_DESCRIPTION_FILE} CPACK_RPM_PACKAGE_DESCRIPTION)
  107. ELSE (CPACK_PACKAGE_DESCRIPTION_FILE)
  108. SET(CPACK_RPM_PACKAGE_DESCRIPTION "no package description available")
  109. ENDIF (CPACK_PACKAGE_DESCRIPTION_FILE)
  110. ENDIF (NOT CPACK_RPM_PACKAGE_DESCRIPTION)
  111. # CPACK_RPM_SPEC_INSTALL_POST
  112. # May be used to define a RPM post intallation script
  113. # for example setting it to "/bin/true" may prevent
  114. # rpmbuild from stripping binaries.
  115. IF(CPACK_RPM_SPEC_INSTALL_POST)
  116. SET(TMP_RPM_SPEC_INSTALL_POST "%define __spec_install_post ${CPACK_RPM_SPEC_INSTALL_POST}")
  117. ENDIF(CPACK_RPM_SPEC_INSTALL_POST)
  118. # CPACK_RPM_SPEC_MORE_DEFINE
  119. # This is a generated spec rpm file spaceholder
  120. IF(CPACK_RPM_SPEC_MORE_DEFINE)
  121. IF(CPACK_RPM_PACKAGE_DEBUG)
  122. MESSAGE("CPackRPM:Debug: User defined more define spec line specified:\n ${CPACK_RPM_SPEC_MORE_DEFINE}")
  123. ENDIF(CPACK_RPM_PACKAGE_DEBUG)
  124. ENDIF(CPACK_RPM_SPEC_MORE_DEFINE)
  125. # CPACK_RPM_USER_BINARY_SPECFILE
  126. # FIXME when this is set then CPack should us the
  127. # user provided file.
  128. # Now we may create the RPM build tree structure
  129. SET(CPACK_RPM_ROOTDIR "${CPACK_TOPLEVEL_DIRECTORY}")
  130. MESSAGE(STATUS "CPackRPM:Debug: Using CPACK_RPM_ROOTDIR=${CPACK_RPM_ROOTDIR}")
  131. # Prepare RPM build tree
  132. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR})
  133. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR}/tmp)
  134. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR}/BUILD)
  135. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR}/RPMS)
  136. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR}/SOURCES)
  137. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR}/SPECS)
  138. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR}/SRPMS)
  139. #SET(CPACK_RPM_FILE_NAME "${CPACK_RPM_PACKAGE_NAME}-${CPACK_RPM_PACKAGE_VERSION}-${CPACK_RPM_PACKAGE_RELEASE}-${CPACK_RPM_PACKAGE_ARCHITECTURE}.rpm")
  140. SET(CPACK_RPM_FILE_NAME "${CPACK_OUTPUT_FILE_NAME}")
  141. # it seems rpmbuild can't handle spaces in the path
  142. # neither escaping (as below) nor putting quotes around the path seem to help
  143. #STRING(REGEX REPLACE " " "\\\\ " CPACK_RPM_DIRECTORY "${CPACK_TOPLEVEL_DIRECTORY}")
  144. SET(CPACK_RPM_DIRECTORY "${CPACK_TOPLEVEL_DIRECTORY}")
  145. SET(CPACK_RPM_BINARY_SPECFILE "${CPACK_RPM_ROOTDIR}/SPECS/${CPACK_RPM_PACKAGE_NAME}.spec")
  146. IF(CPACK_RPM_USER_BINARY_SPECFILE)
  147. # User may have specified SPECFILE just use it
  148. MESSAGE("CPackRPM: Will use user specified spec file: ${CPACK_RPM_USER_BINARY_SPECFILE}")
  149. # Note that user provided file is processed for @var replacement
  150. CONFIGURE_FILE(${CPACK_RPM_USER_BINARY_SPECFILE} ${CPACK_RPM_BINARY_SPECFILE} @ONLY)
  151. ELSE(CPACK_RPM_USER_BINARY_SPECFILE)
  152. # No User specified spec file generate a valid one using var values
  153. IF(CPACK_RPM_PACKAGE_DEBUG)
  154. MESSAGE("CPackRPM:Debug: CPACK_TOPLEVEL_DIRECTORY = ${CPACK_TOPLEVEL_DIRECTORY}")
  155. MESSAGE("CPackRPM:Debug: CPACK_TOPLEVEL_TAG = ${CPACK_TOPLEVEL_TAG}")
  156. MESSAGE("CPackRPM:Debug: CPACK_TEMPORARY_DIRECTORY = ${PACK_TEMPORARY_DIRECTORY}")
  157. MESSAGE("CPackRPM:Debug: CPACK_OUTPUT_FILE_NAME = ${CPACK_OUTPUT_FILE_NAME}")
  158. MESSAGE("CPackRPM:Debug: CPACK_OUTPUT_FILE_PATH = ${CPACK_OUTPUT_FILE_PATH}")
  159. MESSAGE("CPackRPM:Debug: CPACK_PACKAGE_FILE_NAME = ${CPACK_PACKAGE_FILE_NAME}")
  160. MESSAGE("CPackRPM:Debug: CPACK_RPM_BINARY_SPECFILE = ${CPACK_RPM_BINARY_SPECFILE}")
  161. MESSAGE("CPackRPM:Debug: CPACK_PACKAGE_INSTALL_DIRECTORY = ${PACK_PACKAGE_INSTALL_DIRECTORY}")
  162. MESSAGE("CPackRPM:Debug: CPACK_TEMPORARY_PACKAGE_FILE_NAME = ${CPACK_TEMPORARY_PACKAGE_FILE_NAME}")
  163. MESSAGE("CPackRPM:Debug: CPACK_RPM_SPEC_INSTALL_POST = ${CPACK_RPM_SPEC_INSTALL_POST}")
  164. ENDIF(CPACK_RPM_PACKAGE_DEBUG)
  165. FILE(WRITE ${CPACK_RPM_BINARY_SPECFILE}
  166. "# -*- rpm-spec -*-
  167. Buildroot: ${CPACK_RPM_DIRECTORY}/${CPACK_PACKAGE_FILE_NAME}
  168. Summary: ${CPACK_RPM_PACKAGE_SUMMARY}
  169. Name: ${CPACK_RPM_PACKAGE_NAME}
  170. Version: ${CPACK_RPM_PACKAGE_VERSION}
  171. Release: ${CPACK_RPM_PACKAGE_RELEASE}
  172. License: ${CPACK_RPM_PACKAGE_LICENSE}
  173. Group: ${CPACK_RPM_PACKAGE_GROUP}
  174. Vendor: ${CPACK_RPM_PACKAGE_VENDOR}
  175. ${TMP_RPM_BUILDARCH}
  176. #%define prefix ${CMAKE_INSTALL_PREFIX}
  177. %define _rpmdir ${CPACK_RPM_DIRECTORY}
  178. %define _rpmfilename ${CPACK_RPM_FILE_NAME}
  179. %define _unpackaged_files_terminate_build 0
  180. %define _topdir ${CPACK_RPM_DIRECTORY}
  181. ${TMP_RPM_SPEC_INSTALL_POST}
  182. ${CPACK_RPM_SPEC_MORE_DEFINE}
  183. %description
  184. ${CPACK_RPM_PACKAGE_DESCRIPTION}
  185. # This is a shortcutted spec file
  186. # generated by CMake RPM generator
  187. # we skip the _prepn _build and _install
  188. # steps because CPack does that for us
  189. #%prep
  190. #%build
  191. #%install
  192. %clean
  193. %files
  194. %defattr(-,root,root,-)
  195. #%dir %{prefix}
  196. #%{prefix}/*
  197. /*
  198. %changelog
  199. * Mon Aug 25 2008 Erk <[email protected]>
  200. Update generator to handle optional post-install
  201. * Tue Aug 16 2007 Erk <[email protected]>
  202. Generated by CPack RPM Generator and associated macros
  203. ")
  204. ENDIF(CPACK_RPM_USER_BINARY_SPECFILE)
  205. IF(RPMBUILD_EXECUTABLE)
  206. # Now call rpmbuild using the SPECFILE
  207. EXECUTE_PROCESS(
  208. COMMAND "${RPMBUILD_EXECUTABLE}" -bb "${CPACK_RPM_BINARY_SPECFILE}"
  209. WORKING_DIRECTORY "${CPACK_TOPLEVEL_DIRECTORY}/${CPACK_PACKAGE_FILE_NAME}"
  210. ERROR_FILE "${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild.err"
  211. OUTPUT_FILE "${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild.out")
  212. IF(CPACK_RPM_PACKAGE_DEBUG)
  213. MESSAGE("CPackRPM:Debug: You may consult rpmbuild logs in: ")
  214. MESSAGE("CPackRPM:Debug: - ${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild.err")
  215. MESSAGE("CPackRPM:Debug: - ${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild.out")
  216. ENDIF(CPACK_RPM_PACKAGE_DEBUG)
  217. ELSE(RPMBUILD_EXECUTABLE)
  218. IF(ALIEN_EXECUTABLE)
  219. MESSAGE(FATAL_ERROR "RPM packaging through alien not done (yet)")
  220. ENDIF(ALIEN_EXECUTABLE)
  221. ENDIF(RPMBUILD_EXECUTABLE)