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=