| 1 | #!/bin/bash |
| 2 | |
| 3 | # SPDX-License-Identifier: GPL-3.0-or-later |
| 4 | |
| 5 | # shellcheck source=./packaging/installer/functions.sh |
| 6 | . "$(dirname "$0")"/../installer/functions.sh || exit 1 |
| 7 | |
| 8 | BUILDARCH="${1}" |
| 9 | |
| 10 | set -e |
| 11 | |
| 12 | platform="$("$(dirname "${0}")/uname2platform.sh" "${BUILDARCH}")" |
| 13 | |
| 14 | if [ -z "${platform}" ]; then |
| 15 | exit 1 |
| 16 | fi |
| 17 | |
| 18 | if command -v docker > /dev/null 2>&1; then |
| 19 | docker="docker" |
| 20 | elif command -v podman > /dev/null 2>&1; then |
| 21 | docker="podman" |
| 22 | else |
| 23 | echo "Could not find a usable OCI runtime, need either Docker or Podman." |
| 24 | exit 1 |
| 25 | fi |
| 26 | |
| 27 | case "${BUILDARCH}" in |
| 28 | x86_64) # x86-64-v2 equivalent |
| 29 | QEMU_ARCH="x86_64" |
| 30 | QEMU_CPU="Nehalem-v2" |
| 31 | TUNING_FLAGS="-march=x86-64" |
| 32 | GOAMD64="v1" |
| 33 | GOARCH="amd64" |
| 34 | ;; |
| 35 | armv6l) # Raspberry Pi 1 equivalent |
| 36 | QEMU_ARCH="arm" |
| 37 | QEMU_CPU="arm1176" |
| 38 | TUNING_FLAGS="-march=armv6zk -mtune=arm1176jzf-s" |
| 39 | GOARM="6" |
| 40 | GOARCH="arm" |
| 41 | ;; |
| 42 | armv7l) # Baseline ARMv7 CPU |
| 43 | QEMU_ARCH="arm" |
| 44 | QEMU_CPU="cortex-a7" |
| 45 | TUNING_FLAGS="-march=armv7-a" |
| 46 | GOARM="7" |
| 47 | GOARCH="arm" |
| 48 | ;; |
| 49 | aarch64) # Baseline ARMv8 CPU |
| 50 | QEMU_ARCH="aarch64" |
| 51 | QEMU_CPU="cortex-a53" |
| 52 | TUNING_FLAGS="-march=armv8-a" |
| 53 | GOARM64="v8.0" |
| 54 | GOARCH="arm64" |
| 55 | ;; |
| 56 | esac |
| 57 | |
| 58 | [ -f "/proc/sys/fs/binfmt_misc/qemu-${QEMU_ARCH}" ] && SKIP_EMULATION=1 |
| 59 | |
| 60 | if [ "${BUILDARCH}" != "$(uname -m)" ] && [ -z "${SKIP_EMULATION}" ]; then |
| 61 | ${docker} run --rm --privileged tonistiigi/binfmt:master --install "${QEMU_ARCH}" || exit 1 |
| 62 | fi |
| 63 | |
| 64 | DOCKER_IMAGE_NAME="netdata/static-builder:v1" |
| 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}}')" |
| 69 | else |
| 70 | img_platform="$(${docker} image inspect "${DOCKER_IMAGE_NAME}" --format '{{.Os}}/{{.Architecture}}')" |
| 71 | fi |
| 72 | |
| 73 | if [ "${img_platform}" != "${platform}" ]; then |
| 74 | ${docker} image rm "${DOCKER_IMAGE_NAME}" || exit 1 |
| 75 | fi |
| 76 | fi |
| 77 | |
| 78 | if ! ${docker} inspect "${DOCKER_IMAGE_NAME}" > /dev/null 2>&1; then |
| 79 | ${docker} pull --platform "${platform}" "${DOCKER_IMAGE_NAME}" |
| 80 | fi |
| 81 | |
| 82 | # Run the build script inside the container |
| 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 | ${DEBUG_BUILD_INFRA:+-e DEBUG_BUILD_INFRA=1} \ |
| 87 | ${QEMU_CPU:+-e QEMU_CPU="${QEMU_CPU}"} \ |
| 88 | -e TUNING_FLAGS="${TUNING_FLAGS}" ${GOARCH:+-e GOARCH="${GOARCH}"} \ |
| 89 | ${GOAMD64:+-e GOAMD64="${GOAMD64}"} ${GOARM:+-e GOARM="${GOARM}"} \ |
| 90 | ${GOARM64:+-e GOARM64="${GOARM64}"} ${GOPPC64:+-e GOPPC64="${GOPPC64}"} \ |
| 91 | "${DOCKER_IMAGE_NAME}" /bin/sh /netdata/packaging/makeself/build.sh "${@}" |
| 92 | else |
| 93 | run ${docker} run --rm -e BUILDARCH="${BUILDARCH}" -v "$(pwd)":/netdata:rw \ |
| 94 | -e GITHUB_ACTIONS="${GITHUB_ACTIONS}" --platform "${platform}" \ |
| 95 | ${EXTRA_INSTALL_FLAGS:+-e EXTRA_INSTALL_FLAGS="${EXTRA_INSTALL_FLAGS}"} \ |
| 96 | ${QEMU_CPU:+-e QEMU_CPU="${QEMU_CPU}"} \ |
| 97 | -e TUNING_FLAGS="${TUNING_FLAGS}" ${GOARCH:+-e GOARCH="${GOARCH}"} \ |
| 98 | ${GOAMD64:+-e GOAMD64="${GOAMD64}"} ${GOARM:+-e GOARM="${GOARM}"} \ |
| 99 | ${GOARM64:+-e GOARM64="${GOARM64}"} ${GOPPC64:+-e GOPPC64="${GOPPC64}"} \ |
| 100 | "${DOCKER_IMAGE_NAME}" /bin/sh /netdata/packaging/makeself/build.sh "${@}" |
| 101 | fi |