CPackRPM.cmake 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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(NOT CPACK_RPM_PACKAGE_ARCHITECTURE)
  61. # FIXME This should be obtained through 'arch' command
  62. # but is it --really necessary-- ?
  63. SET(CPACK_RPM_PACKAGE_ARCHITECTURE i386)
  64. ENDIF(NOT CPACK_RPM_PACKAGE_ARCHITECTURE)
  65. # CPACK_RPM_PACKAGE_RELEASE
  66. # The RPM release is the numbering of the RPM package ITSELF
  67. # this is the version of the PACKAGING and NOT the version
  68. # of the CONTENT of the package.
  69. # You may well need to generate a new RPM package release
  70. # without changing the version of the packaged software.
  71. # This is the case when the packaging is buggy (not) the software :=)
  72. # If not set, 1 is a good candidate
  73. IF(NOT CPACK_RPM_PACKAGE_RELEASE)
  74. SET(CPACK_RPM_PACKAGE_RELEASE 1)
  75. ENDIF(NOT CPACK_RPM_PACKAGE_RELEASE)
  76. # CPACK_RPM_PACKAGE_LICENSE
  77. IF(NOT CPACK_RPM_PACKAGE_LICENSE)
  78. SET(CPACK_RPM_PACKAGE_LICENSE "unknown")
  79. ENDIF(NOT CPACK_RPM_PACKAGE_LICENSE)
  80. # CPACK_RPM_PACKAGE_GROUP
  81. IF(NOT CPACK_RPM_PACKAGE_GROUP)
  82. SET(CPACK_RPM_PACKAGE_GROUP "unknown")
  83. ENDIF(NOT CPACK_RPM_PACKAGE_GROUP)
  84. # CPACK_RPM_PACKAGE_VENDOR
  85. IF(NOT CPACK_RPM_PACKAGE_VENDOR)
  86. IF(CPACK_PACKAGE_VENDOR)
  87. SET(CPACK_RPM_PACKAGE_VENDOR "${CPACK_PACKAGE_VENDOR}")
  88. ELSE(CPACK_PACKAGE_VENDOR)
  89. SET(CPACK_RPM_PACKAGE_VENDOR "unknown")
  90. ENDIF(CPACK_PACKAGE_VENDOR)
  91. ENDIF(NOT CPACK_RPM_PACKAGE_VENDOR)
  92. # CPACK_RPM_PACKAGE_SOURCE
  93. # The name of the source tarball in case we generate
  94. # a source RPM
  95. # CPACK_RPM_PACKAGE_DESCRIPTION
  96. # The variable content may be either
  97. # - explicitely given by tthe user or
  98. # - filled with the content of CPACK_PACKAGE_DESCRIPTION_FILE
  99. # if it is defined
  100. # - set to a default value
  101. #
  102. IF (NOT CPACK_RPM_PACKAGE_DESCRIPTION)
  103. IF (CPACK_PACKAGE_DESCRIPTION_FILE)
  104. FILE(READ ${CPACK_PACKAGE_DESCRIPTION_FILE} CPACK_RPM_PACKAGE_DESCRIPTION)
  105. ELSE (CPACK_PACKAGE_DESCRIPTION_FILE)
  106. SET(CPACK_RPM_PACKAGE_DESCRIPTION "no package description available")
  107. ENDIF (CPACK_PACKAGE_DESCRIPTION_FILE)
  108. ENDIF (NOT CPACK_RPM_PACKAGE_DESCRIPTION)
  109. # CPACK_RPM_USER_BINARY_SPECFILE
  110. # FIXME when this is set then CPack should us the
  111. # user provided file.
  112. # Now we may create the RPM build tree structure
  113. SET(CPACK_RPM_ROOTDIR "${CPACK_TOPLEVEL_DIRECTORY}")
  114. MESSAGE(STATUS "CPackRPM:: Using CPACK_RPM_ROOTDIR=${CPACK_RPM_ROOTDIR}")
  115. # Prepare RPM build tree
  116. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR})
  117. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR}/tmp)
  118. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR}/BUILD)
  119. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR}/RPMS)
  120. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR}/SOURCES)
  121. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR}/SPECS)
  122. FILE(MAKE_DIRECTORY ${CPACK_RPM_ROOTDIR}/SRPMS)
  123. #SET(CPACK_RPM_FILE_NAME "${CPACK_RPM_PACKAGE_NAME}-${CPACK_RPM_PACKAGE_VERSION}-${CPACK_RPM_PACKAGE_RELEASE}-${CPACK_RPM_PACKAGE_ARCHITECTURE}.rpm")
  124. SET(CPACK_RPM_FILE_NAME "${CPACK_OUTPUT_FILE_NAME}")
  125. # it seems rpmbuild can't handle spaces in the path
  126. # neither escaping (as below) nor putting quotes around the path seem to help
  127. #STRING(REGEX REPLACE " " "\\\\ " CPACK_RPM_DIRECTORY "${CPACK_TOPLEVEL_DIRECTORY}")
  128. SET(CPACK_RPM_DIRECTORY "${CPACK_TOPLEVEL_DIRECTORY}")
  129. SET(CPACK_RPM_BINARY_SPECFILE "${CPACK_RPM_ROOTDIR}/SPECS/${CPACK_RPM_PACKAGE_NAME}.spec")
  130. IF(CPACK_RPM_USER_BINARY_SPECFILE)
  131. # User may have specified SPECFILE just use it
  132. MESSAGE("CPackRPM: Will use user specified spec file: ${CPACK_RPM_USER_BINARY_SPECFILE}")
  133. # Note that user provided file is processed for @var replacement
  134. CONFIGURE_FILE(${CPACK_RPM_USER_BINARY_SPECFILE} ${CPACK_RPM_BINARY_SPECFILE} @ONLY)
  135. ELSE(CPACK_RPM_USER_BINARY_SPECFILE)
  136. # No User specified spec file generate a valid one using var values
  137. IF(CPACK_RPM_PACKAGE_DEBUG)
  138. MESSAGE("CPackRPM:: CPACK_TOPLEVEL_DIRECTORY = ${CPACK_TOPLEVEL_DIRECTORY}")
  139. MESSAGE("CPackRPM:: CPACK_TOPLEVEL_TAG = ${CPACK_TOPLEVEL_TAG}")
  140. MESSAGE("CPackRPM:: CPACK_TEMPORARY_DIRECTORY= ${PACK_TEMPORARY_DIRECTORY}")
  141. MESSAGE("CPackRPM:: CPACK_OUTPUT_FILE_NAME = ${CPACK_OUTPUT_FILE_NAME}")
  142. MESSAGE("CPackRPM:: CPACK_OUTPUT_FILE_PATH = ${CPACK_OUTPUT_FILE_PATH}")
  143. MESSAGE("CPackRPM:: CPACK_PACKAGE_FILE_NAME = ${CPACK_PACKAGE_FILE_NAME}")
  144. MESSAGE("CPackRPM:: CPACK_RPM_BINARY_SPECFILE = ${CPACK_RPM_BINARY_SPECFILE}")
  145. MESSAGE("CPackRPM:: CPACK_PACKAGE_INSTALL_DIRECTORY = ${PACK_PACKAGE_INSTALL_DIRECTORY}")
  146. MESSAGE("CPackRPM ::CPACK_TEMPORARY_PACKAGE_FILE_NAME = ${CPACK_TEMPORARY_PACKAGE_FILE_NAME}")
  147. ENDIF(CPACK_RPM_PACKAGE_DEBUG)
  148. FILE(WRITE ${CPACK_RPM_BINARY_SPECFILE}
  149. "# -*- rpm-spec -*-
  150. Buildroot: ${CPACK_RPM_DIRECTORY}/${CPACK_PACKAGE_FILE_NAME}
  151. Summary: ${CPACK_RPM_PACKAGE_SUMMARY}
  152. Name: ${CPACK_RPM_PACKAGE_NAME}
  153. Version: ${CPACK_RPM_PACKAGE_VERSION}
  154. Release: ${CPACK_RPM_PACKAGE_RELEASE}
  155. License: ${CPACK_RPM_PACKAGE_LICENSE}
  156. Group: ${CPACK_RPM_PACKAGE_GROUP}
  157. Vendor: ${CPACK_RPM_PACKAGE_VENDOR}
  158. #%define prefix ${CMAKE_INSTALL_PREFIX}
  159. %define _rpmdir ${CPACK_RPM_DIRECTORY}
  160. %define _rpmfilename ${CPACK_RPM_FILE_NAME}
  161. %define _unpackaged_files_terminate_build 0
  162. %define _topdir ${CPACK_RPM_DIRECTORY}
  163. %description
  164. ${CPACK_RPM_PACKAGE_DESCRIPTION}
  165. # This is a shortcutted spec file
  166. # generated by CMake RPM generator
  167. # we skip the _prepn _build and _install
  168. # steps because CPack does that for us
  169. #%prep
  170. #%build
  171. #%install
  172. %clean
  173. %files
  174. %defattr(-,root,root,-)
  175. #%dir %{prefix}
  176. #%{prefix}/*
  177. /*
  178. %changelog
  179. * Tue Aug 16 2007 Erk <[email protected]>
  180. Generated by CPack RPM Generator and associated macros
  181. ")
  182. ENDIF(CPACK_RPM_USER_BINARY_SPECFILE)
  183. IF(RPMBUILD_EXECUTABLE)
  184. # Now call rpmbuild using the SPECFILE
  185. EXECUTE_PROCESS(
  186. COMMAND "${RPMBUILD_EXECUTABLE}" -bb "${CPACK_RPM_BINARY_SPECFILE}"
  187. WORKING_DIRECTORY "${CPACK_TOPLEVEL_DIRECTORY}/${CPACK_PACKAGE_FILE_NAME}"
  188. ERROR_FILE "${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild.err"
  189. OUTPUT_FILE "${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild.out")
  190. ELSE(RPMBUILD_EXECUTABLE)
  191. IF(ALIEN_EXECUTABLE)
  192. MESSAGE(FATAL_ERROR "RPM packaging through alien not done (yet)")
  193. ENDIF(ALIEN_EXECUTABLE)
  194. ENDIF(RPMBUILD_EXECUTABLE)