diff options
author | vkalintiris <vasilis@netdata.cloud> | 2023-12-13 16:41:20 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-13 16:41:20 +0200 |
commit | 92842d8422a570aed4005b5069531f7f5189fe4d (patch) | |
tree | 6923d0e00551ab448f7211e865577cd7a8991aef /netdata-installer.sh | |
parent | 548489555bbdadc7274a2165f365b968992b98da (diff) |
CMake build system. (#15996)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Austin S. Hemmelgarn <austin@netdata.cloud>
Co-authored-by: Tasos Katsoulas <12612986+tkatsoulas@users.noreply.github.com>
Co-authored-by: Emmanuel Vasilakis <mrzammler@mm.st>
Co-authored-by: Stelios Fragkakis <52996999+stelfrag@users.noreply.github.com>
Co-authored-by: netdatabot <bot@netdata.cloud>
Co-authored-by: Ilya Mashchenko <ilya@netdata.cloud>
Diffstat (limited to 'netdata-installer.sh')
-rwxr-xr-x | netdata-installer.sh | 459 |
1 files changed, 284 insertions, 175 deletions
diff --git a/netdata-installer.sh b/netdata-installer.sh index fb061c09b8..8503c37d1b 100755 --- a/netdata-installer.sh +++ b/netdata-installer.sh @@ -218,6 +218,8 @@ USAGE: ${PROGRAM} [options] --disable-plugin-nfacct Explicitly disable the nfacct plugin. --enable-plugin-xenstat Enable the xenstat plugin. Default: enable it when libxenstat and libyajl are available. --disable-plugin-xenstat Explicitly disable the xenstat plugin. + --enable-plugin-systemd-journal Enable the the systemd journal plugin. Default: enable it when libsystemd is available. + --disable-plugin-systemd-journal Explicitly disable the systemd journal plugin. --enable-exporting-kinesis Enable AWS Kinesis exporting connector. Default: enable it when libaws_cpp_sdk_kinesis and its dependencies are available. --disable-exporting-kinesis Explicitly disable AWS Kinesis exporting connector. @@ -281,18 +283,20 @@ DONOTWAIT=0 NETDATA_PREFIX= LIBS_ARE_HERE=0 NETDATA_ENABLE_ML="" -NETDATA_ENABLE_GTESTS=0 -NETDATA_CONFIGURE_OPTIONS="${NETDATA_CONFIGURE_OPTIONS-}" +ENABLE_DBENGINE=1 +ENABLE_EBPF=1 +ENABLE_H2O=1 +ENABLE_CLOUD=1 +ENABLE_LOGS_MANAGEMENT=1 +ENABLE_LOGS_MANAGEMENT_TESTS=0 +NETDATA_CMAKE_OPTIONS="${NETDATA_CMAKE_OPTIONS-}" RELEASE_CHANNEL="nightly" # valid values are 'nightly' and 'stable' IS_NETDATA_STATIC_BINARY="${IS_NETDATA_STATIC_BINARY:-"no"}" while [ -n "${1}" ]; do case "${1}" in "--zlib-is-really-here") LIBS_ARE_HERE=1 ;; "--libs-are-really-here") LIBS_ARE_HERE=1 ;; - "--use-system-protobuf") - USE_SYSTEM_PROTOBUF=1 - NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--without-bundled-protobuf}" | sed 's/$/ --without-bundled-protobuf/g')" - ;; + "--use-system-protobuf") USE_SYSTEM_PROTOBUF=1 ;; "--dont-scrub-cflags-even-though-it-may-break-things") DONT_SCRUB_CFLAGS_EVEN_THOUGH_IT_MAY_BREAK_THINGS=1 ;; "--dont-start-it") DONOTSTART=1 ;; "--dont-wait") DONOTWAIT=1 ;; @@ -300,81 +304,78 @@ while [ -n "${1}" ]; do "--auto-update-type") ;; "--stable-channel") RELEASE_CHANNEL="stable" ;; "--nightly-channel") RELEASE_CHANNEL="nightly" ;; - "--enable-plugin-freeipmi") NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--enable-plugin-freeipmi)}" | sed 's/$/ --enable-plugin-freeipmi/g')" ;; - "--disable-plugin-freeipmi") NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--disable-plugin-freeipmi)}" | sed 's/$/ --disable-plugin-freeipmi/g')" ;; + "--enable-plugin-freeipmi") ENABLE_FREEIPMI=1 ;; + "--disable-plugin-freeipmi") ENABLE_FREEIPMI=0 ;; "--disable-https") - NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--disable-openssl)}" | sed 's/$/ --disable-openssl/g')" - NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--disable-dbengine)}" | sed 's/$/ --disable-dbengine/g')" - NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--disable-exporting-kinesis)}" | sed 's/$/ --disable-exporting-kinesis/g')" - NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--disable-h2o)}" | sed 's/$/ --disable-h2o/g')" - NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--disable-cloud)}" | sed 's/$/ --disable-cloud/g')" ;; - "--disable-dbengine") - NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--disable-dbengine)}" | sed 's/$/ --disable-dbengine/g')" + ENABLE_DBENGINE=0 + ENABLE_H2O=0 + ENABLE_CLOUD=0 ;; - "--enable-plugin-nfacct") NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--enable-plugin-nfacct)}" | sed 's/$/ --enable-plugin-nfacct/g')" ;; - "--disable-plugin-nfacct") NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--disable-plugin-nfacct)}" | sed 's/$/ --disable-plugin-nfacct/g')" ;; - "--enable-plugin-xenstat") NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--enable-plugin-xenstat)}" | sed 's/$/ --enable-plugin-xenstat/g')" ;; - "--disable-plugin-xenstat") NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--disable-plugin-xenstat)}" | sed 's/$/ --disable-plugin-xenstat/g')" ;; + "--disable-dbengine") ENABLE_DBENGINE=0 ;; + "--enable-plugin-nfacct") ENABLE_NFACCT=1 ;; + "--disable-plugin-nfacct") ENABLE_NFACCT=0 ;; + "--enable-plugin-xenstat") ENABLE_XENSTAT=1 ;; + "--disable-plugin-xenstat") ENABLE_XENSTAT=0 ;; + "--enable-plugin-systemd-journal") ENABLE_SYSTEMD_JOURNAL=1 ;; + "--disable-plugin-systemd-journal") ENABLE_SYSTEMD_JOURNAL=0 ;; "--enable-exporting-kinesis" | "--enable-backend-kinesis") - NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--enable-exporting-kinesis)}" | sed 's/$/ --enable-exporting-kinesis/g')" ;; + # TODO: Needs CMake Support + ;; "--disable-exporting-kinesis" | "--disable-backend-kinesis") - NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--disable-exporting-kinesis)}" | sed 's/$/ --disable-exporting-kinesis/g')" ;; - "--enable-exporting-prometheus-remote-write" | "--enable-backend-prometheus-remote-write") - NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--enable-exporting-prometheus-remote-write)}" | sed 's/$/ --enable-exporting-prometheus-remote-write/g')" ;; - "--disable-exporting-prometheus-remote-write" | "--disable-backend-prometheus-remote-write") - NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--disable-exporting-prometheus-remote-write)}" | sed 's/$/ --disable-exporting-prometheus-remote-write/g')" - NETDATA_DISABLE_PROMETHEUS=1 + # TODO: Needs CMake Support ;; - "--enable-exporting-mongodb" | "--enable-backend-mongodb") - NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--enable-exporting-mongodb)}" | sed 's/$/ --enable-exporting-mongodb/g')" ;; - "--disable-exporting-mongodb" | "--disable-backend-mongodb") - NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--disable-exporting-mongodb)}" | sed 's/$/ --disable-exporting-mongodb/g')" ;; - "--enable-exporting-pubsub") NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--enable-exporting-pubsub)}" | sed 's/$/ --enable-exporting-pubsub/g')" ;; - "--disable-exporting-pubsub") NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--disable-exporting-pubsub)}" | sed 's/$/ --disable-exporting-pubsub/g')" ;; - "--enable-lto") NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--enable-lto)}" | sed 's/$/ --enable-lto/g')" ;; - "--enable-ml") - NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--enable-ml)}" | sed 's/$/ --enable-ml/g')" - NETDATA_ENABLE_ML=1 + "--enable-exporting-prometheus-remote-write" | "--enable-backend-prometheus-remote-write") EXPORTER_PROMETHEUS=1 ;; + "--disable-exporting-prometheus-remote-write" | "--disable-backend-prometheus-remote-write") EXPORTER_PROMETHEUS=1 ;; + "--enable-exporting-mongodb" | "--enable-backend-mongodb") EXPORTER_MONGODB=1 ;; + "--disable-exporting-mongodb" | "--disable-backend-mongodb") EXPORTER_MONGODB=0 ;; + "--enable-exporting-pubsub") + # TODO: Needs CMake support ;; - "--disable-ml") - NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--disable-ml)}" | sed 's/$/ --disable-ml/g')" - NETDATA_ENABLE_ML=0 + "--disable-exporting-pubsub") + # TODO: Needs CMake support ;; - "--disable-logsmanagement") - NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--disable-logsmanagement)}" | sed 's/$/ --disable-logsmanagement/g')" - NETDATA_DISABLE_LOGS_MANAGEMENT=1 + "--enable-ml") NETDATA_ENABLE_ML=1 ;; + "--disable-ml") NETDATA_ENABLE_ML=0 ;; + "--enable-lto") + # TODO: Needs CMake support ;; - "--enable-logsmanagement-tests") NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--enable-logsmanagement-tests)}" | sed 's/$/ --enable-logsmanagement-tests/g')" ;; - "--enable-gtests") - NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--enable-gtests)}" | sed 's/$/ --enable-gtests/g')" - NETDATA_ENABLE_GTESTS=1 + "--enable-logs-management") ENABLE_LOGS_MANAGEMENT=1 ;; + "--disable-logsmanagement") ENABLE_LOGS_MANAGEMENT=0 ;; + "--enable-logsmanagement-tests") ENABLE_LOGS_MANAGEMENT_TESTS=1 ;; + "--disable-lto") + # TODO: Needs CMake support ;; - "--disable-gtests") - NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--disable-gtests)}" | sed 's/$/ --disable-gtests/g')" - NETDATA_ENABLE_GTESTS=0 + "--disable-x86-sse") + # XXX: No longer supported. ;; - "--disable-lto") NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--disable-lto)}" | sed 's/$/ --disable-lto/g')" ;; - "--disable-x86-sse") NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--disable-x86-sse)}" | sed 's/$/ --disable-x86-sse/g')" ;; "--disable-telemetry") NETDATA_DISABLE_TELEMETRY=1 ;; "--disable-go") NETDATA_DISABLE_GO=1 ;; - "--enable-ebpf") NETDATA_DISABLE_EBPF=0 ;; - "--disable-ebpf") NETDATA_DISABLE_EBPF=1 NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--disable-ebpf)}" | sed 's/$/ --disable-ebpf/g')" ;; + "--enable-ebpf") + ENABLE_EBPF=1 + NETDATA_DISABLE_EBPF=0 + ;; + "--disable-ebpf") + ENABLE_EBPF=0 + NETDATA_DISABLE_EBPF=1 + ;; "--skip-available-ram-check") SKIP_RAM_CHECK=1 ;; - "--one-time-build") NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--disable-dependency-tracking)}" | sed 's/$/ --disable-dependency-tracking/g')" ;; + "--one-time-build") + # XXX: No longer supported + ;; "--disable-cloud") if [ -n "${NETDATA_REQUIRE_CLOUD}" ]; then warning "Cloud explicitly enabled, ignoring --disable-cloud." else + ENABLE_CLOUD=0 NETDATA_DISABLE_CLOUD=1 - NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--disable-cloud)}" | sed 's/$/ --disable-cloud/g')" fi ;; "--require-cloud") if [ -n "${NETDATA_DISABLE_CLOUD}" ]; then warning "Cloud explicitly disabled, ignoring --require-cloud." else + ENABLE_CLOUD=1 NETDATA_REQUIRE_CLOUD=1 - NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--enable-cloud)}" | sed 's/$/ --enable-cloud/g')" fi ;; "--build-json-c") @@ -388,6 +389,11 @@ while [ -n "${1}" ]; do NETDATA_PREFIX="${2}" shift 1 ;; + "--prepare-only") + NETDATA_DISABLE_TELEMETRY=1 + NETDATA_PREPARE_ONLY=1 + DONOTWAIT=1 + ;; "--help" | "-h") usage exit 1 @@ -409,11 +415,10 @@ if [ ! "${DISABLE_TELEMETRY:-0}" -eq 0 ] || NETDATA_DISABLE_TELEMETRY=1 fi -make="make" -# See: https://github.com/netdata/netdata/issues/9163 -if [ "$(uname -s)" = "FreeBSD" ]; then - make="gmake" - NETDATA_CONFIGURE_OPTIONS="$NETDATA_CONFIGURE_OPTIONS --disable-dependency-tracking" +if [ -n "${MAKEOPTS}" ]; then + JOBS="$(echo "${MAKEOPTS}" | grep -oE '\-j *[[:digit:]]+' | tr -d '\-j ')" +else + JOBS="$(find_processors)" fi if [ "$(uname -s)" = "Linux" ] && [ -f /proc/meminfo ]; then @@ -421,32 +426,24 @@ if [ "$(uname -s)" = "Linux" ] && [ -f /proc/meminfo ]; then base=1024 scale=256 - # shellcheck disable=SC2086 - if [ -n "${MAKEOPTS}" ]; then - proc_count="$(echo ${MAKEOPTS} | grep -oE '\-j *[[:digit:]]+' | tr -d '\-j ')" - else - proc_count="$(find_processors)" - fi - target_ram="$((base * mega + (scale * mega * (proc_count - 1))))" total_ram="$(grep MemTotal /proc/meminfo | cut -d ':' -f 2 | tr -d ' kB')" total_ram="$((total_ram * 1024))" if [ "${total_ram}" -le "$((base * mega))" ] && [ -z "${NETDATA_ENABLE_ML}" ]; then - NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--disable-ml)}" | sed 's/$/ --disable-ml/g')" NETDATA_ENABLE_ML=0 fi if [ -z "${MAKEOPTS}" ]; then - MAKEOPTS="-j${proc_count}" + MAKEOPTS="-j${JOBS}" - while [ "${target_ram}" -gt "${total_ram}" ] && [ "${proc_count}" -gt 1 ]; do - proc_count="$((proc_count - 1))" - target_ram="$((base * mega + (scale * mega * (proc_count - 1))))" - MAKEOPTS="-j${proc_count}" + while [ "${target_ram}" -gt "${total_ram}" ] && [ "${JOBS}" -gt 1 ]; do + JOBS="$((JOBS - 1))" + target_ram="$((base * mega + (scale * mega * (JOBS - 1))))" + MAKEOPTS="-j${JOBS}" done else - if [ "${target_ram}" -gt "${total_ram}" ] && [ "${proc_count}" -gt 1 ] && [ -z "${SKIP_RAM_CHECK}" ]; then + if [ "${target_ram}" -gt "${total_ram}" ] && [ "${JOBS}" -gt 1 ] && [ -z "${SKIP_RAM_CHECK}" ]; then target_ram="$(echo "${target_ram}" | awk '{$1/=1024*1024*1024;printf "%.2fGiB\n",$1}')" total_ram="$(echo "${total_ram}" | awk '{$1/=1024*1024*1024;printf "%.2fGiB\n",$1}')" run_failed "Netdata needs ${target_ram} of RAM to safely install, but this system only has ${total_ram}. Try reducing the number of processes used for the install using the \$MAKEOPTS variable." @@ -463,7 +460,7 @@ elif echo "${MAKEOPTS}" | grep -vqF -e "-j"; then MAKEOPTS="${MAKEOPTS} -j$(find_processors)" fi -if [ "$(id -u)" -ne 0 ]; then +if [ "$(id -u)" -ne 0 ] && [ -z "${NETDATA_PREPARE_ONLY}" ]; then if [ -z "${NETDATA_PREFIX}" ]; then netdata_banner banner_nonroot_install "${@}" @@ -519,41 +516,31 @@ if [ -z "$NETDATA_DISABLE_TELEMETRY" ]; then BANNER4 fi -have_autotools= -if [ "$(type autoreconf 2> /dev/null)" ]; then - autoconf_maj_min() { - OLDIFS=$IFS - IFS=.- - maj=$1 - min=$2 - - # shellcheck disable=SC2046 - set -- $(autoreconf -V | sed -ne '1s/.* \([^ ]*\)$/\1/p') - # shellcheck disable=SC2086 - eval $maj=\$1 $min=\$2 - IFS=$OLDIFS - } - autoconf_maj_min AMAJ AMIN +if ! command -v cmake >/dev/null 2>&1; then + fatal "Could not find CMake, which is required to build Netdata." I0012 +else + cmake="$(command -v cmake)" + progress "Found CMake at ${cmake}. CMake version: $(${cmake} --version | head -n 1)" +fi - if [ "$AMAJ" -gt 2 ]; then - have_autotools=Y - elif [ "$AMAJ" -eq 2 ] && [ "$AMIN" -ge 60 ]; then - have_autotools=Y - else - echo "Found autotools $AMAJ.$AMIN" - fi +if ! command -v "ninja" >/dev/null 2>&1; then + progress "Could not find Ninja, will use Make instead." else - echo "No autotools found" + ninja="$(command -v ninja)" + progress "Found Ninja at ${ninja}. Ninja version: $(${ninja} --version)" + progress "Will use Ninja for this build instead of Make when possible." fi -if [ ! "$have_autotools" ]; then - if [ -f configure ]; then - echo "Will skip autoreconf step" - else - fatal "Could not find a usable version of GNU autotools, which is required for building Netdata. Version 2.60 or later of GNU autotools is required." I0001 - fi +make="$(command -v make 2>/dev/null)" + +if [ -z "${make}" ] && [ -z "${ninja}" ]; then + fatal "Could not find a usable underlying build system (we support make and ninja)." I0014 fi +CMAKE_OPTS="${ninja:+-G Ninja}" +BUILD_OPTS="VERBOSE=1" +[ -n "${ninja}" ] && BUILD_OPTS="-v" + if [ ${DONOTWAIT} -eq 0 ]; then if [ -n "${NETDATA_PREFIX}" ]; then printf '%s' "${TPUT_BOLD}${TPUT_GREEN}Press ENTER to build and install netdata to '${TPUT_CYAN}${NETDATA_PREFIX}${TPUT_YELLOW}'${TPUT_RESET} > " @@ -568,6 +555,17 @@ if [ ${DONOTWAIT} -eq 0 ]; then fi +cmake_install() { + # run cmake --install ${1} + # The above command should be used to replace the logic below once we no longer support + # versions of CMake less than 3.15. + if [ -n "${ninja}" ]; then + run ${ninja} -C "${1}" install + else + run ${make} -C "${1}" install + fi +} + build_error() { netdata_banner trap - EXIT @@ -615,7 +613,7 @@ copy_protobuf() { } bundle_protobuf() { - if [ -n "${NETDATA_DISABLE_CLOUD}" ] && [ -n "${NETDATA_DISABLE_PROMETHEUS}" ]; then + if [ -n "${NETDATA_DISABLE_CLOUD}" ] && [ -n "${EXPORTER_PROMETHEUS}" ] && [ "${EXPORTER_PROMETHEUS}" -eq 0 ]; then echo "Skipping protobuf" return 0 fi @@ -626,6 +624,12 @@ bundle_protobuf() { return 0 fi + if [ -z "${make}" ]; then + warning "No usable copy of Make found, which is required for bundling protobuf. Attempting to use a system copy of protobuf instead." + USE_SYSTEM_PROTOBUF=1 + return 0 + fi + [ -n "${GITHUB_ACTIONS}" ] && echo "::group::Bundling protobuf." PROTOBUF_PACKAGE_VERSION="$(cat packaging/protobuf.version)" @@ -633,7 +637,7 @@ bundle_protobuf() { if [ -f "${PWD}/externaldeps/protobuf/.version" ] && [ "${PROTOBUF_PACKAGE_VERSION}" = "$(cat "${PWD}/externaldeps/protobuf/.version")" ] then echo >&2 "Found compiled protobuf, same version, not compiling it again. Remove file '${PWD}/externaldeps/protobuf/.version' to recompile." - NETDATA_CONFIGURE_OPTIONS="${NETDATA_CONFIGURE_OPTIONS} --with-bundled-protobuf" + USE_SYSTEM_PROTOBUF=0 return 0 fi @@ -651,7 +655,7 @@ bundle_protobuf() { echo "${PROTOBUF_PACKAGE_VERSION}" >"${PWD}/externaldeps/protobuf/.version" && rm -rf "${tmp}"; then run_ok "protobuf built and prepared." - NETDATA_CONFIGURE_OPTIONS="${NETDATA_CONFIGURE_OPTIONS} --with-bundled-protobuf" + USE_SYSTEM_PROTOBUF=0 else run_failed "Failed to build protobuf. Netdata Cloud support will not be available in this build." fi @@ -673,8 +677,8 @@ build_jsonc() { fi cd "${1}" > /dev/null || exit 1 - run eval "${env_cmd} cmake -DBUILD_SHARED_LIBS=OFF ." - run eval "${env_cmd} ${make} ${MAKEOPTS}" + run eval "${env_cmd} ${cmake} ${CMAKE_OPTS} -DBUILD_SHARED_LIBS=OFF -DDISABLE_WERROR=On ." + run eval "${env_cmd} ${cmake} --build . --parallel ${JOBS} -- ${BUILD_OPTS}" cd - > /dev/null || return 1 } @@ -691,11 +695,7 @@ copy_jsonc() { bundle_jsonc() { # If --build-json-c flag or not json-c on system, then bundle our own json-c if [ -z "${NETDATA_BUILD_JSON_C}" ] && pkg-config json-c; then - return 0 - fi - - if [ -z "$(command -v cmake)" ]; then - run_failed "Could not find cmake, which is required to build JSON-C. The install process will continue, but Netdata Cloud support will be disabled." + NETDATA_BUILD_JSON_C=0 return 0 fi @@ -718,11 +718,16 @@ bundle_jsonc() { copy_jsonc "${tmp}/json-c-json-c-${JSONC_PACKAGE_VERSION}" && rm -rf "${tmp}"; then run_ok "JSON-C built and prepared." + NETDATA_BUILD_JSON_C=1 else run_failed "Failed to build JSON-C, Netdata Cloud support will be disabled in this build." + NETDATA_BUILD_JSON_C=0 + ENABLE_CLOUD=0 fi else run_failed "Unable to fetch sources for JSON-C, Netdata Cloud support will be disabled in this build." + NETDATA_BUILD_JSON_C=0 + ENABLE_CLOUD=0 fi [ -n "${GITHUB_ACTIONS}" ] && echo "::endgroup::" @@ -755,12 +760,12 @@ copy_yaml() { bundle_yaml() { if pkg-config yaml-0.1; then + BUNDLE_YAML=0 return 0 fi - if [ -z "$(command -v cmake)" ]; then - run_failed "Could not find cmake, which is required to build YAML. Critical error." - return 0 + if [ -z "${make}" ]; then + fatal "Need to bundle libyaml but cannot find a copy of Make to build it with. Either install development files for libyaml, or install a usable copy fo Make." I0016 fi [ -n "${GITHUB_ACTIONS}" ] && echo "::group::Bundling YAML." @@ -782,11 +787,14 @@ bundle_yaml() { copy_yaml "${tmp}/yaml-${YAML_PACKAGE_VERSION}" && rm -rf "${tmp}"; then run_ok "YAML built and prepared." + BUNDLE_YAML=1 else run_failed "Failed to build YAML, critical error." + BUNDLE_YAML=0 fi else run_failed "Unable to fetch sources for YAML, critical error." + BUNDLE_YAML=0 fi [ -n "${GITHUB_ACTIONS}" ] && echo "::endgroup::" @@ -863,15 +871,24 @@ copy_libbpf() { bundle_libbpf() { if { [ -n "${NETDATA_DISABLE_EBPF}" ] && [ "${NETDATA_DISABLE_EBPF}" = 1 ]; } || [ "$(uname -s)" != Linux ]; then + ENABLE_EBPF=0 + NETDATA_DISABLE_EBPF=1 + return 0 + fi + + if [ -z "${make}" ]; then + warning "No usable copy of Make found, which is required to bundle libbpf. Disabling eBPF support." + ENABLE_EBPF=0 + NETDATA_DISABLE_EBPF=1 return 0 fi # When libc is not detected, we do not have necessity to compile libbpf and we should not do download of eBPF programs libc="${EBPF_LIBC:-"$(detect_libc)"}" if [ -z "$libc" ]; then - NETDATA_DISABLE_EBPF=1 - NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--disable-ebpf)}" | sed 's/$/ --disable-ebpf/g')" - return 0 + NETDATA_DISABLE_EBPF=1 + ENABLE_EBPF=0 + return 0 fi [ -n "${GITHUB_ACTIONS}" ] && echo "::group::Bundling libbpf." @@ -899,11 +916,14 @@ bundle_libbpf() { copy_libbpf "${tmp}/libbpf-${LIBBPF_PACKAGE_VERSION}" && rm -rf "${tmp}"; then run_ok "libbpf built and prepared." + ENABLE_EBPF=1 else if [ -n "${NETDATA_DISABLE_EBPF}" ] && [ "${NETDATA_DISABLE_EBPF}" = 0 ]; then fatal "failed to build libbpf." I0005 else run_failed "Failed to build libbpf. eBPF support will be disabled" + ENABLE_EBPF=0 + NETDATA_DISABLE_EBPF=1 fi fi else @@ -911,6 +931,8 @@ bundle_libbpf() { fatal "Failed to fetch sources for libbpf." I0006 else run_failed "Unable to fetch sources for libbpf. eBPF support will be disabled" + ENABLE_EBPF=0 + NETDATA_DISABLE_EBPF=1 fi fi @@ -946,13 +968,15 @@ bundle_ebpf_co_re() { copy_co_re "${tmp}" && rm -rf "${tmp}"; then run_ok "libbpf built and prepared." + ENABLE_EBPF=1 else if [ -n "${NETDATA_DISABLE_EBPF}" ] && [ "${NETDATA_DISABLE_EBPF}" = 0 ]; then fatal "Failed to get eBPF CO-RE files." I0007 else run_failed "Failed to get eBPF CO-RE files. eBPF support will be disabled" NETDATA_DISABLE_EBPF=1 - NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--disable-ebpf)}" | sed 's/$/ --disable-ebpf/g')" + ENABLE_EBPF=0 + NETDATA_CMAKE_OPTIONS="$(echo "${NETDATA_CMAKE_OPTIONS%-DENABLE_PLUGIN_EBPF=Off)}" | sed 's/$/ -DENABLE_PLUGIN_EBPF=Off/g')" fi fi else @@ -961,7 +985,8 @@ bundle_ebpf_co_re() { else run_failed "Failed to fetch eBPF CO-RE files. eBPF support will be disabled" NETDATA_DISABLE_EBPF=1 - NETDATA_CONFIGURE_OPTIONS="$(echo "${NETDATA_CONFIGURE_OPTIONS%--disable-ebpf)}" | sed 's/$/ --disable-ebpf/g')" + ENABLE_EBPF=0 + NETDATA_CMAKE_OPTIONS="$(echo "${NETDATA_CMAKE_OPTIONS%-DENABLE_PLUGIN_EBPF=Off)}" | sed 's/$/ -DENABLE_PLUGIN_EBPF=Off/g')" fi fi @@ -977,10 +1002,10 @@ build_fluentbit() { if [ -z "${DONT_SCRUB_CFLAGS_EVEN_THOUGH_IT_MAY_BREAK_THINGS}" ]; then env_cmd="env CFLAGS='-fPIC -pipe -w' CXXFLAGS='-fPIC -pipe -w' LDFLAGS=" fi - + mkdir -p fluent-bit/build || return 1 cd fluent-bit/build > /dev/null || return 1 - + rm CMakeCache.txt > /dev/null 2>&1 if ! run eval "${env_cmd} $1 -C ../../logsmanagement/fluent_bit_build/config.cmake -B./ -S../"; then @@ -994,29 +1019,21 @@ build_fluentbit() { rm -rf fluent-bit/build > /dev/null 2>&1 return 1 fi - + cd - > /dev/null || return 1 } bundle_fluentbit() { progress "Prepare Fluent-Bit" - if [ -n "${NETDATA_DISABLE_LOGS_MANAGEMENT}" ]; then + if [ "${ENABLE_LOGS_MANAGEMENT}" = 0 ]; then warning "You have explicitly requested to disable Netdata Logs Management support, Fluent-Bit build is skipped." return 0 fi if [ ! -d "fluent-bit" ]; then - run_failed "Missing submodule Fluent-Bit. The install process will continue, but Netdata Logs Management support will be disabled." - return 0 - fi - - if [ "$(command -v cmake)" ] && [ "$(cmake --version | head -1 | cut -d ' ' -f 3 | cut -c-1)" -ge 3 ]; then - cmake="cmake" - elif [ "$(command -v cmake3)" ]; then - cmake="cmake3" - else - run_failed "Could not find a compatible CMake version (>= 3.0), which is required to build Fluent-Bit. The install process will continue, but Netdata Logs Management support will be disabled." + warning "Missing submodule Fluent-Bit. The install process will continue, but Netdata Logs Management support will be disabled." + ENABLE_LOGS_MANAGEMENT=0 return 0 fi @@ -1030,18 +1047,19 @@ bundle_fluentbit() { patch -N -p1 fluent-bit/cmake/luajit.cmake -i logsmanagement/fluent_bit_build/exclude-luajit.patch patch -N -p1 fluent-bit/src/flb_network.c -i logsmanagement/fluent_bit_build/xsi-strerror.patch fi - + [ -n "${GITHUB_ACTIONS}" ] && echo "::group::Bundling Fluent-Bit." if build_fluentbit "$cmake"; then # If Fluent-Bit built with inotify support, use it. - if [ "$(grep -o '^FLB_HAVE_INOTIFY:INTERNAL=.*' fluent-bit/build/CMakeCache.txt | cut -d '=' -f 2)" ]; then + if [ "$(grep -o '^FLB_HAVE_INOTIFY:INTERNAL=.*' fluent-bit/build/CMakeCache.txt | cut -d '=' -f 2)" ]; then CFLAGS="${CFLAGS} -DFLB_HAVE_INOTIFY" fi FLUENT_BIT_BUILD_SUCCESS=1 run_ok "Fluent-Bit built successfully." else - run_failed "Failed to build Fluent-Bit, Netdata Logs Management support will be disabled in this build." + warning "Failed to build Fluent-Bit, Netdata Logs Management support will be disabled in this build." + ENABLE_LOGS_MANAGEMENT=0 fi [ -n "${GITHUB_ACTIONS}" ] && echo "::endgroup::" @@ -1069,16 +1087,49 @@ if [ -d ./.git ] ; then fi # ----------------------------------------------------------------------------- + echo >&2 [ -n "${GITHUB_ACTIONS}" ] && echo "::group::Configuring Netdata." -progress "Run autotools to configure the build environment" +NETDATA_BUILD_DIR="${NETDATA_BUILD_DIR:-./cmake-build-release/}" +rm -rf "${NETDATA_BUILD_DIR}" -if [ "$have_autotools" ]; then - if ! run autoreconf -ivf; then - fatal "Failed to prepare Netdata sources." I0009 +check_for_module() { + if [ -z "${pkgconf}" ]; then + pkgconf="$(command -v pkgconf 2>/dev/null)" + [ -z "${pkgconf}" ] && pkgconf="$(command -v pkg-config 2>/dev/null)" + [ -z "${pkgconf}" ] && fatal "Unable to find a usable pkgconf/pkg-config command, cannot build Netdata." I0013 fi -fi + + "${pkgconf}" "${1}" + return "${?}" +} + +enable_feature() { + if [ "${2}" -eq 1 ]; then + NETDATA_CMAKE_OPTIONS="${NETDATA_CMAKE_OPTIONS} -DENABLE_${1}=On" + else + NETDATA_CMAKE_OPTIONS="${NETDATA_CMAKE_OPTIONS} -DENABLE_${1}=Off" + fi +} + +check_for_feature() { + feature_name="${1}" + feature_state="${2}" + shift 2 + feature_modules="${*}" + + if [ -z "${feature_state}" ]; then + # shellcheck disable=SC2086 + if check_for_module ${feature_modules}; then + enable_feature "${feature_name}" 1 + else + enable_feature "${feature_name}" 0 + fi + else + enable_feature "${feature_name}" "${feature_state}" + fi +} # function to extract values from the config file config_option() { @@ -1108,21 +1159,92 @@ NETDATA_GROUP="$(id -g -n "${NETDATA_USER}" 2> /dev/null)" [ -z "${NETDATA_GROUP}" ] && NETDATA_GROUP="${NETDATA_USER}" echo >&2 "Netdata user and group set to: ${NETDATA_USER}/${NETDATA_GROUP}" +NETDATA_CMAKE_OPTIONS="-S ./ -B ${NETDATA_BUILD_DIR} ${CMAKE_OPTS} -DCMAKE_INSTALL_PREFIX=${NETDATA_PREFIX} ${NETDATA_USER:+-DNETDATA_USER=${NETDATA_USER}} " + +# Feature autodetection code starts here + +if [ "${USE_SYSTEM_PROTOBUF}" -eq 1 ]; then + NETDATA_CMAKE_OPTIONS="${NETDATA_CMAKE_OPTIONS} -DENABLE_BUNDLED_PROTOBUF=Off" +else + NETDATA_CMAKE_OPTIONS="${NETDATA_CMAKE_OPTIONS} -DENABLE_BUNDLED_PROTOBUF=On" +fi + +if [ -z "${ENABLE_SYSTEMD_PLUGIN}" ]; then + if check_for_module libsystemd; then + if check_for_module libelogind; then + ENABLE_SYSTEMD_JOURNAL=0 + else + ENABLE_SYSTEMD_JOURNAL=1 + fi + else + ENABLE_SYSTEMD_JOURNAL=0 + fi +fi + +enable_feature PLUGIN_SYSTEMD_JOURNAL "${ENABLE_SYSTEMD_JOURNAL}" + +[ -z "${NETDATA_ENABLE_ML}" ] && NETDATA_ENABLE_ML=1 +enable_feature ML "${NETDATA_ENABLE_ML}" + +if command -v cups-config >/dev/null 2>&1 || check_for_module libcups || check_for_module cups; then + ENABLE_CUPS=1 +else + ENABLE_CUPS=0 +fi + +enable_feature PLUGIN_CUPS "${ENABLE_CUPS}" + +IS_LINUX=0 +[ "$(uname -s)" = "Linux" ] && IS_LINUX=1 +enable_feature PLUGIN_DEBUGFS "${IS_LINUX}" +enable_feature PLUGIN_PERF "${IS_LINUX}" +enable_feature PLUGIN_SLABINFO "${IS_LINUX}" +enable_feature PLUGIN_CGROUP_NETWORK "${IS_LINUX}" +enable_feature PLUGIN_LOCAL_LISTENERS "${IS_LINUX}" +enable_feature PLUGIN_LOGS_MANAGEMENT "${ENABLE_LOGS_MANAGEMENT}" +enable_feature LOGS_MANAGEMENT_TESTS "${ENABLE_LOGS_MANAGEMENT_TESTS}" + +enable_feature ACLK "${ENABLE_CLOUD}" +enable_feature CLOUD "${ENABLE_CLOUD}" +enable_feature BUNDLED_JSONC "${NETDATA_BUILD_JSON_C}" +enable_feature BUNDLED_YAML "${BUNDLE_YAML}" +enable_feature DBENGINE "${ENABLE_DBENGINE}" +enable_feature H2O "${ENABLE_H2O}" +enable_feature PLUGIN_EBPF "${ENABLE_EBPF}" + +ENABLE_APPS=0 + +if [ "${IS_LINUX}" = 1 ] || [ "$(uname -s)" = "FreeBSD" ]; then + ENABLE_APPS=1 +fi + +enable_feature PLUGIN_APPS "${ENABLE_APPS}" + +check_for_feature EXPORTER_PROMETHEUS_REMOTE_WRITE "${EXPORTER_PROMETHEUS}" snappy +check_for_feature EXPORTER_MONGODB "${EXPORTER_MONGODB}" libmongoc-1.0 +check_for_feature PLUGIN_FREEIPMI "${ENABLE_FREEIPMI}" libipmimonitoring +check_for_feature PLUGIN_NFACCT "${ENABLE_NFACCT}" libnetfilter_acct libnml +check_for_feature PLUGIN_XENSTAT "${ENABLE_XENSTAT}" xenstat xenlight + +# End of feature autodetection code + +if [ -n "${NETDATA_PREPARE_ONLY}" ]; then + progress "Exiting before building Netdata as requested." + printf "Would have used the following CMake command line for configuration: %s\n" "${cmake} ${NETDATA_CMAKE_OPTIONS}" + trap - EXIT + exit 0 +fi + +# Let cmake know we don't want to link shared libs +if [ "${IS_NETDATA_STATIC_BINARY}" = "yes" ]; then + NETDATA_CMAKE_OPTIONS="${NETDATA_CMAKE_OPTIONS} -DBUILD_SHARED_LIBS=Off" +fi + # shellcheck disable=SC2086 -if ! run ./configure \ - --prefix="${NETDATA_PREFIX}/usr" \ - --sysconfdir="${NETDATA_PREFIX}/etc" \ - --localstatedir="${NETDATA_PREFIX}/var" \ - --libexecdir="${NETDATA_PREFIX}/usr/libexec" \ - --libdir="${NETDATA_PREFIX}/usr/lib" \ - --with-math \ - --with-user="${NETDATA_USER}" \ - ${NETDATA_CONFIGURE_OPTIONS} \ - CFLAGS="${CFLAGS}" LDFLAGS="${LDFLAGS}"; then +if ! run ${cmake} ${NETDATA_CMAKE_OPTIONS}; then fatal "Failed to configure Netdata sources." I000A fi - [ -n "${GITHUB_ACTIONS}" ] && echo "::endgroup::" # remove the build_error hook @@ -1131,15 +1253,11 @@ trap - EXIT # ----------------------------------------------------------------------------- [ -n "${GITHUB_ACTIONS}" ] && echo "::group::Building Netdata." -progress "Cleanup compilation directory" - -run $make clean - # ----------------------------------------------------------------------------- progress "Compile netdata" # shellcheck disable=SC2086 -if ! run $make ${MAKEOPTS}; then +if ! run ${cmake} --build "${NETDATA_BUILD_DIR}" --parallel ${JOBS} -- ${BUILD_OPTS}; then fatal "Failed to build Netdata." I000B fi @@ -1151,16 +1269,11 @@ fi # ----------------------------------------------------------------------------- progress "Install netdata" -if ! run $make install; then +if ! cmake_install "${NETDATA_BUILD_DIR}"; then fatal "Failed to install Netdata." I000C fi # ----------------------------------------------------------------------------- -progress "Fix generated files permissions" - -run chmod 755 ./system/*/init.d/netdata ./system/*/rc.d/netdata ./system/runit/run ./system/install-service.sh - -# ----------------------------------------------------------------------------- progress "Creating standard user and groups for netdata" NETDATA_WANTED_GROUPS="docker nginx varnish haproxy adm nsd proxy squid ceph nobody" @@ -1359,7 +1472,7 @@ if [ "$(id -u)" -eq 0 ]; then if ! iscontainer && command -v setcap 1> /dev/null 2>&1; then run chmod 0750 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/logs-management.plugin" if run setcap cap_dac_read_search,cap_syslog+ep "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/logs-management.plugin"; then - capabilities=1 + capabilities=1 fi fi @@ -1739,7 +1852,7 @@ progress "eBPF Kernel Collector" install_ebpf should_install_fluentbit() { - if [ -n "${NETDATA_DISABLE_LOGS_MANAGEMENT}" ]; then + if [ "${ENABLE_LOGS_MANAGEMENT}" = 0 ]; then warning "netdata-installer.sh run with --disable-logsmanagement, Fluent-Bit installation is skipped." return 1 elif [ "${FLUENT_BIT_BUILD_SUCCESS:=0}" -eq 0 ]; then @@ -1749,7 +1862,7 @@ should_install_fluentbit() { run_failed "libfluent-bit.so is missing, Netdata Logs Management support will be disabled in this build." return 1 fi - + return 0 } @@ -1765,10 +1878,6 @@ install_fluentbit() { run cp -a -v fluent-bit/build/lib/libfluent-bit.so "${NETDATA_PREFIX}"/usr/lib/netdata - # Fix paths in logsmanagement.d.conf - run sed -i -e "s|# db dir =.*|db dir = ${NETDATA_CACHE_DIR}\/logs_management_db|g" "${NETDATA_STOCK_CONFIG_DIR}"/logsmanagement.d.conf - run sed -i -e "s|# log file =.*|log file = ${NETDATA_LOG_DIR}\/fluentbit.log|g" "${NETDATA_STOCK_CONFIG_DIR}"/logsmanagement.d.conf - [ -n "${GITHUB_ACTIONS}" ] && echo "::endgroup::" } @@ -1978,7 +2087,7 @@ LDFLAGS="${LDFLAGS}" MAKEOPTS="${MAKEOPTS}" NETDATA_TMPDIR="${TMPDIR}" NETDATA_PREFIX="${NETDATA_PREFIX}" -NETDATA_CONFIGURE_OPTIONS="${NETDATA_CONFIGURE_OPTIONS}" +NETDATA_CMAKE_OPTIONS="${NETDATA_CMAKE_OPTIONS}" NETDATA_ADDED_TO_GROUPS="${NETDATA_ADDED_TO_GROUPS}" INSTALL_UID="$(id -u)" NETDATA_GROUP="${NETDATA_GROUP}" |