CMakeLists.txt 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. # SPDX-License-Identifier: GPL-3.0-or-later
  2. cmake_minimum_required(VERSION 3.13.0...3.28)
  3. list(APPEND RHEL_DISTROS centos centos-stream rocky almalinux cloudlinux)
  4. list(APPEND SUSE_DISTROS opensuse-leap opensuse-tumbleweed)
  5. list(APPEND RPM_DISTROS rhel opensuse ol amzn fedora)
  6. list(APPEND DEB_DISTROS debian ubuntu)
  7. set(DEB_GPG_KEY_SOURCE "https://repo.netdata.cloud/netdatabot.gpg.key")
  8. set(PACKAGE_VERSION 3)
  9. set(PACKAGE_RELEASE 1)
  10. set(CPACK_THREADS 0)
  11. set(CPACK_STRIP_FILES NO)
  12. set(CPACK_PACKAGE_INSTALL_DIRECTORY "netdata")
  13. set(CPACK_PACKAGE_DIRECTORY "${CMAKE_BINARY_DIR}/packages")
  14. set(CPACK_PACKAGING_INSTALL_PREFIX "/")
  15. set(CPACK_PACKAGE_VENDOR "Netdata Inc.")
  16. set(CPACK_COMPONENT_NETDATA-REPO_PACKAGE_DESCRIPTION "Configuration for the official Netdata Stable package repository.")
  17. set(CPACK_COMPONENT_NETDATA-REPO-EDGE_PACKAGE_DESCRIPTION "Configuration for the official Netdata Edge package repository.")
  18. project(netdata-repoconfig VERSION "${PACKAGE_VERSION}.${PACKAGE_RELEASE}"
  19. DESCRIPTION "Repository configuration for Netdata’s official native packages."
  20. HOMEPAGE_URL "https://www.netdata.cloud/"
  21. LANGUAGES NONE)
  22. function(extract_release_item _variable _item)
  23. if(DEFINED "${_variable}")
  24. return()
  25. endif()
  26. if(DEFINED OS_RELEASE_FILE)
  27. else()
  28. message(CHECK_START "Searching for os-release file")
  29. find_file(OS_RELEASE_FILE os-release PATHS /etc /lib /usr/lib NO_DEFAULT_PATH)
  30. if(${OS_RELEASE_FILE} STREQUAL "OS_RELEASE_FILE-NOTFOUND")
  31. message(CHECK_FAIL "failed")
  32. message(FATAL_ERROR "Could not find os-release file")
  33. endif()
  34. message(CHECK_PASS "${OS_RELEASE_FILE}")
  35. endif()
  36. message(CHECK_START "Extracting ${_item} from ${OS_RELEASE_FILE}")
  37. execute_process(COMMAND sh -c ". ${OS_RELEASE_FILE} && printf %s $${_item}"
  38. RESULT_VARIABLE _result
  39. OUTPUT_VARIABLE _output)
  40. if(NOT ${_result} EQUAL 0)
  41. message(CHECK_FAIL "failed to parse ${OS_RELEASE_FILE}")
  42. return()
  43. elseif(${_output} STREQUAL "")
  44. message(CHECK_FAIL "variable ${_item} not defined in ${OS_RELEASE_FILE}")
  45. return()
  46. endif()
  47. message(CHECK_PASS ${_output})
  48. set(${_variable} ${_output} PARENT_SCOPE)
  49. endfunction()
  50. function(require_command _variable _cmd)
  51. if(DEFINED ${_variable})
  52. return()
  53. endif()
  54. message(CHECK_START "Looking for ${_cmd}")
  55. find_program(_result_${_cmd} ${_cmd})
  56. if(${_result_${_cmd}} STREQUAL "_result_${_cmd}-NOTFOUND")
  57. message(CHECK_FAIL "failed")
  58. message(FATAL_ERROR "Unable to find required command: ${_cmd}")
  59. endif()
  60. message(CHECK_PASS "${_result_${_cmd}}")
  61. set(${_variable} ${_result_${_cmd}} PARENT_SCOPE)
  62. endfunction()
  63. if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
  64. extract_release_item("DISTRO" ID)
  65. if(NOT DEFINED DISTRO)
  66. message(FATAL_ERROR "Failed to auto-detect distro ID")
  67. endif()
  68. extract_release_item(DISTRO_VERSION VERSION_ID)
  69. if(NOT DEFINED DISTRO_VERSION)
  70. message(FATAL_ERROR "Failed to auto-detect distro version ID.")
  71. endif()
  72. else()
  73. message(FATAL_ERROR "Repository configuration packages can only be built on Linux")
  74. endif()
  75. if(${DISTRO} IN_LIST RHEL_DISTROS)
  76. set(DISTRO "rhel")
  77. elseif(${DISTRO} STREQUAL "opensuse-leap")
  78. set(DISTRO "opensuse")
  79. elseif(${DISTRO} STREQUAL "opensuse-tumbleweed")
  80. set(DISTRO "opensuse")
  81. set(DISTRO_VERSION "tumbleweed")
  82. endif()
  83. if(${DISTRO} IN_LIST DEB_DISTROS)
  84. extract_release_item(SUITE VERSION_CODENAME)
  85. if(NOT DEFINED SUITE)
  86. message(FATAL_ERROR "Failed to determine version codename")
  87. endif()
  88. require_command(DPKG dpkg)
  89. require_command(CURL curl)
  90. require_command(GPG gpg)
  91. set(DIST_NAME ${DISTRO})
  92. message(STATUS "Generating stable repository configuration for ${DISTRO} ${SUITE}")
  93. set(VARIANT stable)
  94. configure_file(netdata.list.in netdata.list @ONLY)
  95. message(STATUS "Generating edge repository configuration for ${DISTRO} ${SUITE}")
  96. set(VARIANT edge)
  97. configure_file(netdata.list.in netdata-edge.list @ONLY)
  98. message(STATUS "Preparing changelogs")
  99. set(PKG_NAME netdata-repo)
  100. file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/netdata-repo)
  101. configure_file(deb.changelog netdata-repo/changelog @ONLY)
  102. set(PKG_NAME netdata-repo-edge)
  103. file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/netdata-repo-edge)
  104. configure_file(deb.changelog netdata-repo-edge/changelog @ONLY)
  105. install(FILES ${CMAKE_BINARY_DIR}/netdata.list
  106. DESTINATION etc/apt/sources.list.d
  107. COMPONENT netdata-repo)
  108. install(FILES ${CMAKE_BINARY_DIR}/netdata-edge.list
  109. DESTINATION etc/apt/sources.list.d
  110. COMPONENT netdata-repo-edge)
  111. add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/netdatabot.gpg.key
  112. COMMENT "Fetch GPG key from ${DEB_GPG_KEY_SOURCE}"
  113. COMMAND ${CURL} -f -L -o ${CMAKE_BINARY_DIR}/netdatabot.gpg.key ${DEB_GPG_KEY_SOURCE})
  114. add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/netdata.gpg
  115. COMMENT "Dearmor ${CMAKE_BINARY_DIR}/netdatabot.gpg.key"
  116. DEPENDS ${CMAKE_BINARY_DIR}/netdatabot.gpg.key
  117. COMMAND ${GPG} --dearmor --output ${CMAKE_BINARY_DIR}/netdata.gpg ${CMAKE_BINARY_DIR}/netdatabot.gpg.key)
  118. add_custom_target(dearmor_gpg_key
  119. ALL
  120. COMMENT "Dearmor ${CMAKE_BINARY_DIR}/netdatabot.gpg.key"
  121. DEPENDS ${CMAKE_BINARY_DIR}/netdata.gpg)
  122. install(FILES ${CMAKE_BINARY_DIR}/netdata.gpg
  123. DESTINATION etc/apt/trusted.gpg.d
  124. RENAME netdata-archive-keyring.gpg
  125. PERMISSIONS OWNER_READ GROUP_READ WORLD_READ
  126. COMPONENT netdata-repo)
  127. install(FILES ${CMAKE_BINARY_DIR}/netdata.gpg
  128. DESTINATION etc/apt/trusted.gpg.d
  129. RENAME netdata-repoconfig-archive-keyring.gpg
  130. PERMISSIONS OWNER_READ GROUP_READ WORLD_READ
  131. COMPONENT netdata-repo)
  132. install(FILES ${CMAKE_BINARY_DIR}/netdata.gpg
  133. DESTINATION etc/apt/trusted.gpg.d
  134. RENAME netdata-edge-archive-keyring.gpg
  135. PERMISSIONS OWNER_READ GROUP_READ WORLD_READ
  136. COMPONENT netdata-repo-edge)
  137. install(FILES ${CMAKE_BINARY_DIR}/netdata.gpg
  138. DESTINATION etc/apt/trusted.gpg.d
  139. RENAME netdata-repoconfig-archive-keyring.gpg
  140. PERMISSIONS OWNER_READ GROUP_READ WORLD_READ
  141. COMPONENT netdata-repo-edge)
  142. set(CPACK_DEB_COMPONENT_INSTALL YES)
  143. set(CPACK_DEBIAN_DEBUGINFO_PACKAGE NO)
  144. set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS NO)
  145. set(CPACK_DEBIAN_ENABLE_COMPONENT_DEPENDS YES)
  146. set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
  147. set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Netdata Builder <bot@netdata.cloud>")
  148. set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "all")
  149. set(CPACK_DEBIAN_PACKAGE_DEPENDS "debian-keyring, gnupg")
  150. set(CPACK_DEBIAN_PACKAGE_SECTION "net")
  151. set(CPACK_DEBIAN_PACKAGE_VERSION "${PACKAGE_VERSION}")
  152. set(CPACK_DEBIAN_PACKAGE_RELEASE "${PACKAGE_RELEASE}")
  153. set(CPACK_DEBIAN_NETDATA-REPO_PACKAGE_NAME "netdata-repo")
  154. set(CPACK_DEBIAN_NETDATA-REPO-EDGE_PACKAGE_NAME "netdata-repo-edge")
  155. set(CPACK_DEBIAN_NETDATA-REPO_PACKAGE_CONFLICTS "netdata-repo-edge")
  156. set(CPACK_DEBIAN_NETDATA-REPO-EDGE_PACKAGE_CONFLICTS "netdata-repo")
  157. set(CPACK_DEBIAN_NETDATA-REPO_PACKAGE_CONTROL_EXTRA "${CMAKE_BINARY_DIR}/netdata-repo/changelog")
  158. set(CPACK_DEBIAN_NETDATA-REPO-EDGE_PACKAGE_CONTROL_EXTRA "${CMAKE_BINARY_DIR}/netdata-repo-edge/changelog")
  159. elseif(${DISTRO} IN_LIST RPM_DISTROS)
  160. require_command(RPM rpm)
  161. if(${RPM} STREQUAL "RPM-NOTFOUND")
  162. message(FATAL_ERROR "Unable to find rpm, which is required for RPM package builds.")
  163. endif()
  164. set(REPO_CFG_PATH "yum.repos.d")
  165. set(REPO_ID "dnf")
  166. set(DIST_NAME "${DISTRO}")
  167. set(DIST_VERSION "$releasever")
  168. if(${DISTRO} STREQUAL "amzn")
  169. set(DIST_NAME "amazonlinux")
  170. if(${DISTRO_VERSION} VERSION_EQUAL 2)
  171. # Nothing to do in this case, defaults work here.
  172. elseif(${DISTRO_VERSION} VERSION_EQUAL 2023)
  173. set(DIST_VERSION "2023")
  174. else()
  175. message(FATAL_ERROR "Unsupported version of Amazon Linux: ${DISTRO_VERSION}")
  176. endif()
  177. elseif(${DISTRO} STREQUAL "opensuse")
  178. set(REPO_CFG_PATH "zypp/repos.d")
  179. set(REPO_ID "zypp")
  180. set(DIST_NAME "opensuse")
  181. elseif(${DISTRO} STREQUAL "rhel")
  182. set(DIST_NAME "el")
  183. if(${DISTRO_VERSION} VERSION_LESS_EQUAL 8)
  184. set(CPACK_RPM_PACKAGE_REQUIRES "yum-plugin-priorities, epel-release")
  185. else()
  186. set(CPACK_RPM_PACKAGE_REQUIRES "epel-release")
  187. endif()
  188. endif()
  189. message(STATUS "Generating stable repository configuration for ${DISTRO} ${DISTRO_VERSION}")
  190. set(VARIANT stable)
  191. configure_file(netdata.repo.${REPO_ID} netdata.repo @ONLY)
  192. message(STATUS "Generating edge repository configuration for ${DISTRO} ${DISTRO_VERSION}")
  193. set(VARIANT edge)
  194. configure_file(netdata.repo.${REPO_ID} netdata-edge.repo @ONLY)
  195. install(FILES ${CMAKE_BINARY_DIR}/netdata.repo
  196. COMPONENT netdata-repo
  197. DESTINATION etc/${REPO_CFG_PATH})
  198. install(FILES ${CMAKE_BINARY_DIR}/netdata-edge.repo
  199. COMPONENT netdata-repo-edge
  200. DESTINATION etc/${REPO_CFG_PATH})
  201. set(CPACK_RPM_COMPONENT_INSTALL ON)
  202. set(CPACK_RPM_PACAKGE_AUTOREQPROV OFF)
  203. set(CPACK_RPM_DEBUGINFO_PACKAGE OFF)
  204. set(CPACK_RPM_PACKAGE_LICENSE "GPLv2")
  205. set(CPACK_RPM_PACKAGE_GROUP "System Environment/Base")
  206. set(CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST "")
  207. set(CPACK_RPM_PACKAGE_ARCHITECTURE "noarch")
  208. set(CPACK_RPM_PACKAGE_VERSION "${PACKAGE_VERSION}")
  209. set(CPACK_RPM_PACKAGE_RELEASE "${PACKAGE_RELEASE}")
  210. set(CPACK_RPM_PACKAGE_CHANGELOG "${CMAKE_SOURCE_DIR}/rpm.changelog")
  211. set(CPACK_RPM_NETDATA-REPO_FILE_NAME "netdata-repo-${PACKAGE_VERSION}-${PACKAGE_RELEASE}.rpm")
  212. set(CPACK_RPM_NETDATA-REPO_PACKAGE_NAME "netdata-repo")
  213. set(CPACK_RPM_NETDATA-REPO_PACAKGE_CONFLICTS "netdata-repo-edge")
  214. set(CPACK_RPM_NETDATA-REPO-EDGE_FILE_NAME "netdata-repo-edge-${PACKAGE_VERSION}-${PACKAGE_RELEASE}.rpm")
  215. set(CPACK_RPM_NETDATA-REPO-EDGE_PACKAGE_NAME "netdata-repo-edge")
  216. set(CPACK_RPM_NETDATA-REPO-EDGE_PACKAGE_CONFLICTS "netdata-repo")
  217. else()
  218. message(FATAL_ERROR "Unsupported distribution ${DISTRO} ${DISTRO_VERSION}")
  219. endif()
  220. include(CPack)