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