@cryptotaxi247 / netdata-1 / commits / 50c35cb37

Fix static builds to ensure usability on intended baseline hardware. (#19224)

* Enforce usage of specific CPU models for static build runtime checks. * Add explicit architecture overrides for ARMv6l static builds. * Fix handling of source paths. * Enable tracing for static build code. * Fix cflags and version handling. * Restructure cflags handling and add Go architecture flags.

Austin S. Hemmelgarn committed Dec 19, 2024 at 08:28 UTC 50c35cb375a18cf866c1350704ca1d9bd36ef180
11 files changed +93 -36
.github/scripts/build-static.sh
+9 -18
@@ -13,30 +13,21 @@ VERSION="${VERSION:-"$(git describe)"}"
13 BASENAME="$NAME-$BUILDARCH-$VERSION"
14
15 prepare_build() {
16 - progress "Preparing build"
17 - (
18 - test -d artifacts || mkdir -p artifacts
19 - ) >&2
16 + test -d artifacts || mkdir -p artifacts
17 }
18
19 build_static() {
23 - progress "Building static ${BUILDARCH}"
24 - (
25 - EXTRA_INSTALL_FLAGS="${EXTRA_INSTALL_FLAGS}" USER="" ./packaging/makeself/build-static.sh "${BUILDARCH}"
26 - ) >&2
20 + EXTRA_INSTALL_FLAGS="${EXTRA_INSTALL_FLAGS}" USER="" ./packaging/makeself/build-static.sh "${BUILDARCH}"
21 }
22
23 prepare_assets() {
30 - progress "Preparing assets"
31 - (
32 - cp packaging/version artifacts/latest-version.txt
33 -
34 - cd artifacts || exit 1
35 - ln -s "${BASENAME}.gz.run" "netdata-${BUILDARCH}-latest.gz.run"
36 - if [ "${BUILDARCH}" = "x86_64" ]; then
37 - ln -s "${BASENAME}.gz.run" netdata-latest.gz.run
38 - fi
39 - ) >&2
24 + cp packaging/version artifacts/latest-version.txt
25 +
26 + cd artifacts || exit 1
27 + ln -s "${BASENAME}.gz.run" "netdata-${BUILDARCH}-latest.gz.run"
28 + if [ "${BUILDARCH}" = "x86_64" ]; then
29 + ln -s "${BASENAME}.gz.run" netdata-latest.gz.run
30 + fi
31 }
32
33 steps="prepare_build build_static"
packaging/makeself/build-static.sh
+36
@@ -35,6 +35,34 @@ if [ "${BUILDARCH}" != "$(uname -m)" ] && [ -z "${SKIP_EMULATION}" ]; then
35 fi
36 fi
37
38 +case "${BUILDARCH}" in
39 + x86_64) # x86-64-v2 equivalent
40 + QEMU_CPU="Nehalem-v2"
41 + TUNING_FLAGS="-march=x86-64"
42 + GOAMD64="v1"
43 + ;;
44 + armv6l) # Raspberry Pi 1 equivalent
45 + QEMU_CPU="arm1176"
46 + TUNING_FLAGS="-march=armv6zk -mtune=arm1176jzf-s"
47 + GOARM="6"
48 + ;;
49 + armv7l) # Baseline ARMv7 CPU
50 + QEMU_CPU="cortex-a7"
51 + TUNING_FLAGS="-march=armv7-a"
52 + GOARM="7"
53 + ;;
54 + aarch64) # Baseline ARMv8 CPU
55 + QEMU_CPU="cortex-a53"
56 + TUNING_FLAGS="-march=armv8-a"
57 + GOARM64="v8.0"
58 + ;;
59 + ppc64le) # Baseline POWER8+ CPU
60 + QEMU_CPU="power8nvl"
61 + TUNING_FLAGS="-mcpu=power8 -mtune=power9"
62 + GOPPC64="power8"
63 + ;;
64 +esac
65 +
66 if ${docker} inspect "${DOCKER_IMAGE_NAME}" > /dev/null 2>&1; then
67 if ${docker} image inspect "${DOCKER_IMAGE_NAME}" | grep -q 'Variant'; then
68 img_platform="$(${docker} image inspect "${DOCKER_IMAGE_NAME}" --format '{{.Os}}/{{.Architecture}}/{{.Variant}}')"
@@ -55,10 +83,18 @@ fi
83 if [ -t 1 ]; then
84 run ${docker} run --rm -e BUILDARCH="${BUILDARCH}" -a stdin -a stdout -a stderr -i -t -v "$(pwd)":/netdata:rw \
85 --platform "${platform}" ${EXTRA_INSTALL_FLAGS:+-e EXTRA_INSTALL_FLAGS="${EXTRA_INSTALL_FLAGS}"} \
86 + ${QEMU_CPU:+-e QEMU_CPU="${QEMU_CPU}"} \
87 + -e TUNING_FLAGS="${TUNING_FLAGS}" \
88 + ${GOAMD64:+-e GOAMD64="${GOAMD64}"} ${GOARM:+-e GOARM="${GOARM}"} \
89 + ${GOARM64:+-e GOARM64="${GOARM64}"} ${GOPPC64:+-e GOPPC64="${GOPPC64}"} \
90 "${DOCKER_IMAGE_NAME}" /bin/sh /netdata/packaging/makeself/build.sh "${@}"
91 else
92 run ${docker} run --rm -e BUILDARCH="${BUILDARCH}" -v "$(pwd)":/netdata:rw \
93 -e GITHUB_ACTIONS="${GITHUB_ACTIONS}" --platform "${platform}" \
94 ${EXTRA_INSTALL_FLAGS:+-e EXTRA_INSTALL_FLAGS="${EXTRA_INSTALL_FLAGS}"} \
95 + ${QEMU_CPU:+-e QEMU_CPU="${QEMU_CPU}"} \
96 + -e TUNING_FLAGS="${TUNING_FLAGS}" \
97 + ${GOAMD64:+-e GOAMD64="${GOAMD64}"} ${GOARM:+-e GOARM="${GOARM}"} \
98 + ${GOARM64:+-e GOARM64="${GOARM64}"} ${GOPPC64:+-e GOPPC64="${GOPPC64}"} \
99 "${DOCKER_IMAGE_NAME}" /bin/sh /netdata/packaging/makeself/build.sh "${@}"
100 fi
packaging/makeself/functions.sh
+16 -4
@@ -6,10 +6,22 @@
6 # allow running the jobs by hand
7 [ -z "${NETDATA_BUILD_WITH_DEBUG}" ] && export NETDATA_BUILD_WITH_DEBUG=0
8 [ -z "${NETDATA_INSTALL_PATH}" ] && export NETDATA_INSTALL_PATH="${1-/opt/netdata}"
9 -[ -z "${NETDATA_MAKESELF_PATH}" ] && NETDATA_MAKESELF_PATH="$(dirname "${0}")/../.."
10 -[ "${NETDATA_MAKESELF_PATH:0:1}" != "/" ] && NETDATA_MAKESELF_PATH="$(pwd)/${NETDATA_MAKESELF_PATH}"
11 -[ -z "${NETDATA_SOURCE_PATH}" ] && export NETDATA_SOURCE_PATH="${NETDATA_MAKESELF_PATH}/../.."
12 -export NETDATA_MAKESELF_PATH NETDATA_MAKESELF_PATH
9 +[ -z "${NETDATA_MAKESELF_PATH}" ] && NETDATA_MAKESELF_PATH="$(
10 + self=${0}
11 + while [ -L "${self}" ]
12 + do
13 + cd "${self%/*}" || exit 1
14 + self=$(readlink "${self}")
15 + done
16 + cd "${self%/*}" || exit 1
17 + cd ../.. || exit 1
18 + echo "$(pwd -P)/${self##*/}"
19 +)"
20 +[ -z "${NETDATA_SOURCE_PATH}" ] && NETDATA_SOURCE_PATH="$(
21 + cd "${NETDATA_MAKESELF_PATH}/../.." || exit 1
22 + pwd -P
23 +)"
24 +export NETDATA_MAKESELF_PATH NETDATA_SOURCE_PATH
25 export NULL=
26
27 # make sure the path does not end with /
packaging/makeself/jobs/20-openssl.install.sh
+3 -2
@@ -8,8 +8,9 @@
8 # shellcheck disable=SC2015
9 [ "${GITHUB_ACTIONS}" = "true" ] && echo "::group::Building OpenSSL" || true
10
11 -export CFLAGS='-fno-lto -pipe'
12 -export LDFLAGS='-static'
11 +export CFLAGS="${TUNING_FLAGS} -fno-lto -pipe"
12 +export CXXFLAGS="${CFLAGS}"
13 +export LDFLAGS="-static"
14 export PKG_CONFIG="pkg-config --static"
15
16 if [ -d "${NETDATA_MAKESELF_PATH}/tmp/openssl" ]; then
packaging/makeself/jobs/50-bash-5.1.16.install.sh
+2 -1
@@ -12,7 +12,8 @@
12 fetch "bash-${BASH_VERSION}" "${BASH_ARTIFACT_SOURCE}/bash-${BASH_VERSION}.tar.gz" \
13 "${BASH_ARTIFACT_SHA256}" bash
14
15 -export CFLAGS="-pipe"
15 +export CFLAGS="${TUNING_FLAGS} -pipe"
16 +export CXXFLAGS="${CFLAGS}"
17 export PKG_CONFIG_PATH="/openssl-static/lib64/pkgconfig"
18
19 if [ "${CACHE_HIT:-0}" -eq 0 ]; then
packaging/makeself/jobs/50-curl.install.sh
+2 -1
@@ -27,7 +27,8 @@ fi
27
28 cd "${NETDATA_MAKESELF_PATH}/tmp/curl" || exit 1
29
30 -export CFLAGS="-I/openssl-static/include -pipe"
30 +export CFLAGS="${TUNING_FLAGS} -I/openssl-static/include -pipe"
31 +export CXXFLAGS="${CFLAGS}"
32 export LDFLAGS="-static -L/openssl-static/lib64"
33 export PKG_CONFIG="pkg-config --static"
34 export PKG_CONFIG_PATH="/openssl-static/lib64/pkgconfig"
packaging/makeself/jobs/50-ioping-1.3.install.sh
+2 -1
@@ -12,7 +12,8 @@
12 fetch "ioping-${IOPING_VERSION}" "${IOPING_SOURCE}/archive/refs/tags/v${IOPING_VERSION}.tar.gz" \
13 "${IOPING_ARTIFACT_SHA256}" ioping
14
15 -export CFLAGS="-static -pipe"
15 +export CFLAGS="${TUNING_FLAGS} -static -pipe"
16 +export CXXFLAGS="${CFLAGS}"
17
18 if [ "${CACHE_HIT:-0}" -eq 0 ]; then
19 run make clean
packaging/makeself/jobs/50-libnetfilter_acct-1.0.3.install.sh
+2 -1
@@ -12,7 +12,8 @@
12 # shellcheck disable=SC2015
13 [ "${GITHUB_ACTIONS}" = "true" ] && echo "::group::building libnetfilter_acct" || true
14
15 -export CFLAGS="-static -I/usr/include/libmnl -pipe"
15 +export CFLAGS="${TUNING_FLAGS} -static -I/usr/include/libmnl -pipe"
16 +export CXXFLAGS="${CFLAGS}"
17 export LDFLAGS="-static -L/usr/lib -lmnl"
18 export PKG_CONFIG="pkg-config --static"
19 export PKG_CONFIG_PATH="/usr/lib/pkgconfig"
packaging/makeself/jobs/70-netdata-git.install.sh
+2 -2
@@ -7,9 +7,9 @@
7 cd "${NETDATA_SOURCE_PATH}" || exit 1
8
9 if [ "${NETDATA_BUILD_WITH_DEBUG}" -eq 0 ]; then
10 - export CFLAGS="-ffunction-sections -fdata-sections -static -O2 -funroll-loops -I/openssl-static/include -I/libnetfilter-acct-static/include/libnetfilter_acct -I/curl-local/include/curl -I/usr/include/libmnl -pipe"
10 + export CFLAGS="${TUNING_FLAGS} -ffunction-sections -fdata-sections -static -O2 -funroll-loops -I/openssl-static/include -I/libnetfilter-acct-static/include/libnetfilter_acct -I/curl-local/include/curl -I/usr/include/libmnl -pipe"
11 else
12 - export CFLAGS="-static -O1 -pipe -ggdb -Wall -Wextra -Wformat-signedness -DNETDATA_INTERNAL_CHECKS=1 -I/openssl-static/include -I/libnetfilter-acct-static/include/libnetfilter_acct -I/curl-local/include/curl -I/usr/include/libmnl"
12 + export CFLAGS="${TUNING_FLAGS} -static -O1 -pipe -ggdb -Wall -Wextra -Wformat-signedness -DNETDATA_INTERNAL_CHECKS=1 -I/openssl-static/include -I/libnetfilter-acct-static/include/libnetfilter_acct -I/curl-local/include/curl -I/usr/include/libmnl"
13 fi
14
15 export LDFLAGS="-Wl,--gc-sections -static -L/openssl-static/lib64 -L/libnetfilter-acct-static/lib -lnetfilter_acct -L/usr/lib -lmnl -L/usr/lib -lzstd -L/curl-local/lib"
packaging/makeself/jobs/99-makeself.install.sh
+3
@@ -1,6 +1,8 @@
1 #!/usr/bin/env bash
2 # SPDX-License-Identifier: GPL-3.0-or-later
3
4 +set -x
5 +
6 # shellcheck source=packaging/makeself/functions.sh
7 . "$(dirname "${0}")/../functions.sh" "${@}" || exit 1
8
@@ -13,6 +15,7 @@ run cd "${NETDATA_SOURCE_PATH}" || exit 1
15 # find the netdata version
16
17 VERSION="$("${NETDATA_INSTALL_PARENT}/netdata/bin/netdata" -v | cut -f 2 -d ' ')"
18 +[ -z "${VERSION}" ] && VERSION="$(cat "${NETDATA_SOURCE_PATH}/packaging/version")"
19
20 if [ "${VERSION}" == "" ]; then
21 echo >&2 "Cannot find version number. Create makeself executable from source code with git tree structure."
packaging/makeself/run-all-jobs.sh
+16 -6
@@ -1,6 +1,7 @@
1 #!/bin/bash
2 # SPDX-License-Identifier: GPL-3.0-or-later
3
4 +set -x
5 set -e
6
7 LC_ALL=C
@@ -13,15 +14,24 @@ umask 002
14 export NETDATA_INSTALL_PATH="${1-/opt/netdata}"
15
16 # our source directory
16 -NETDATA_MAKESELF_PATH="$(dirname "${0}")"
17 +NETDATA_MAKESELF_PATH="$(
18 + self=${0}
19 + while [ -L "${self}" ]
20 + do
21 + cd "${self%/*}" || exit 1
22 + self=$(readlink "${self}")
23 + done
24 + cd "${self%/*}" || exit 1
25 + pwd -P
26 +)"
27 export NETDATA_MAKESELF_PATH
18 -if [ "${NETDATA_MAKESELF_PATH:0:1}" != "/" ]; then
19 - NETDATA_MAKESELF_PATH="$(pwd)/${NETDATA_MAKESELF_PATH}"
20 - export NETDATA_MAKESELF_PATH
21 -fi
28
29 # netdata source directory
24 -export NETDATA_SOURCE_PATH="${NETDATA_MAKESELF_PATH}/../.."
30 +NETDATA_SOURCE_PATH="$(
31 + cd "${NETDATA_MAKESELF_PATH}/../.." || exit 1
32 + pwd -P
33 +)"
34 +export NETDATA_SOURCE_PATH
35
36 # make sure ${NULL} is empty
37 export NULL=