The prepare scripts uses 'reg' to verify we're not going to overwrite an existing image. The 'reg' command is not available in Fedora 43. Use 'skopeo' instead. Skopeo is part of the podman ecosystem so hopefully will live longer. Fixes #27178. Closes scylladb/scylladb#27179
198 lines
5.8 KiB
Bash
Executable File
198 lines
5.8 KiB
Bash
Executable File
#!/bin/bash -e
|
|
|
|
trap 'echo "error $? in $0 line $LINENO"' ERR
|
|
|
|
if ! command -v buildah > /dev/null; then
|
|
echo install buildah 1.19.3 or later
|
|
exit 1
|
|
fi
|
|
|
|
bv=$(buildah --version)
|
|
# translate to array of version components
|
|
bv="${bv#buildah version }"
|
|
bv="${bv% (*}"
|
|
bv=(${bv//./ })
|
|
|
|
maj=${bv[0]}
|
|
min=${bv[1]}
|
|
patch=${bv[2]}
|
|
|
|
ok=$(( maj > 1 || ( maj == 1 && min > 19 ) || ( maj == 1 && min == 19 && patch >= 3 ) ))
|
|
|
|
if (( ! ok )); then
|
|
echo install buildah 1.19.3 or later
|
|
exit 1
|
|
fi
|
|
|
|
if ! command -v skopeo > /dev/null; then
|
|
echo install the skopeo package for registry inspection
|
|
exit 1
|
|
fi
|
|
|
|
if skopeo inspect "docker://$(<tools/toolchain/image)" > /dev/null 2>&1; then
|
|
echo "Toolchain image $(<tools/toolchain/image) exists; select a new name"
|
|
exit 1
|
|
fi
|
|
|
|
archs=(amd64 arm64)
|
|
|
|
# docker arch has a diffrent spelling than uname arch
|
|
declare -A arch_unames=(
|
|
[amd64]=x86_64
|
|
[arm64]=aarch64
|
|
)
|
|
current_arch_uname="$(uname -m)"
|
|
|
|
declare -A docker_arch=(
|
|
[x86_64]=amd64
|
|
[aarch64]=arm64
|
|
)
|
|
|
|
usage() {
|
|
cat <<EOF
|
|
|
|
Options:
|
|
--clang-build-mode <mode> specify one of following build modes:
|
|
SKIP: skip building optimized clang
|
|
INSTALL: build and install an optimized clang compiler binary, and save it as a tarball.
|
|
INSTALL_FROM: install optimized clang from a tarball.
|
|
--clang-archive-x86_64 <file> specify optimized clang x86_64 tarball path
|
|
--clang-archive-aarch64 <file> specify optimized clang aarch64 tarball path
|
|
--disable-multiarch disable multiarch build
|
|
--help this help snippet
|
|
EOF
|
|
}
|
|
|
|
CLANG_BUILD="SKIP"
|
|
DISABLE_MULTIARCH=false
|
|
declare -A CLANG_ARCHIVES
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
"--clang-build-mode")
|
|
if [[ -z "$2" ]]; then
|
|
usage
|
|
exit 1
|
|
fi
|
|
CLANG_BUILD="$2"
|
|
shift 2
|
|
;;
|
|
"--clang-archive-x86_64")
|
|
if [[ -z "$2" ]]; then
|
|
usage
|
|
exit 1
|
|
fi
|
|
CLANG_ARCHIVES[x86_64]="$(realpath -m --relative-to=. "$2")"
|
|
shift 2
|
|
;;
|
|
"--clang-archive-aarch64")
|
|
if [[ -z "$2" ]]; then
|
|
usage
|
|
exit 1
|
|
fi
|
|
CLANG_ARCHIVES[aarch64]="$(realpath -m --relative-to=. "$2")"
|
|
shift 2
|
|
;;
|
|
"--disable-multiarch")
|
|
DISABLE_MULTIARCH=true
|
|
shift 1
|
|
;;
|
|
"--help")
|
|
usage
|
|
exit 0
|
|
;;
|
|
*)
|
|
usage
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
case "${CLANG_BUILD}" in
|
|
"SKIP" | "INSTALL" | "INSTALL_FROM")
|
|
;;
|
|
*)
|
|
echo "Invalid mode specified on CLANG_BUILD: ${CLANG_BUILD}"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
# Force disabling multiarch on INSTALL mode, since building clang on
|
|
# QEMU emulation takes too much time
|
|
if [[ "${CLANG_BUILD}" = "INSTALL" ]]; then
|
|
DISABLE_MULTIARCH=true
|
|
fi
|
|
|
|
if ! "${DISABLE_MULTIARCH}"; then
|
|
for arch in "${archs[@]}"; do
|
|
# translate from docker arch to uname arch
|
|
arch_uname="${arch_unames[$arch]}"
|
|
if [[ "${current_arch_uname}" == "${arch_uname}" ]]; then
|
|
continue
|
|
fi
|
|
if [[ ! -f /proc/sys/fs/binfmt_misc/qemu-"${arch_uname}" ]]; then
|
|
echo install qemu-user-static
|
|
exit 1
|
|
fi
|
|
done
|
|
fi
|
|
|
|
# set default archive path if not specified
|
|
if [[ "${CLANG_BUILD}" = "INSTALL" ]] && [[ -z "${CLANG_ARCHIVES[$current_arch_uname]}" ]]; then
|
|
CURDIR="$(dirname "$0")"
|
|
LLVM_CLANG_TAG="$(sed -n -e 's/^LLVM_CLANG_TAG=\(.*\)/\1/p' "${CURDIR}"/optimized_clang.sh)"
|
|
IMAGE_ID="$(sed -e 's#docker.io/scylladb/scylla-toolchain:##' "${CURDIR}"/image)"
|
|
CLANG_ARCHIVES[${current_arch_uname}]="clang_build/optimized_clang_${LLVM_CLANG_TAG}_${IMAGE_ID}.${current_arch_uname}.tar.gz"
|
|
fi
|
|
|
|
if [[ "${CLANG_BUILD}" = "INSTALL_FROM" ]]; then
|
|
for arch in "${archs[@]}"; do
|
|
arch_uname="${arch_unames[$arch]}"
|
|
if "${DISABLE_MULTIARCH}"; then
|
|
if [[ "${arch_uname}" != "${current_arch_uname}" ]]; then
|
|
continue
|
|
fi
|
|
fi
|
|
# clang archive file need to be under scylla directory, since we only
|
|
# share scylla directory with the container
|
|
if [[ "${CLANG_ARCHIVES[${arch_uname}]}" = "../"* ]]; then
|
|
echo "clang archive file need to be under scylla directory"
|
|
exit 1
|
|
fi
|
|
if [[ ! -f "${CLANG_ARCHIVES[${arch_uname}]}" ]]; then
|
|
echo "${CLANG_ARCHIVES[${arch_uname}]} does not exist."
|
|
echo "Please specify vaild file with --clang-archive-${arch_uname}"
|
|
exit 1
|
|
fi
|
|
done
|
|
fi
|
|
|
|
if "${DISABLE_MULTIARCH}"; then
|
|
echo "Disabling multiarch build."
|
|
echo "This will build only ${docker_arch[${current_arch_uname}]} image."
|
|
PLATFORM=--platform=linux/${docker_arch[${current_arch_uname}]}
|
|
else
|
|
echo "Enabling multiarch build."
|
|
PLATFORM=${archs[@]/#/--platform=linux/}
|
|
fi
|
|
|
|
# serialize CLANG_ARCHIVES to string
|
|
CLANG_ARCHIVES_STR=
|
|
for key in ${!CLANG_ARCHIVES[@]}; do
|
|
if [[ -n $CLANG_ARCHIVES_STR ]]; then
|
|
CLANG_ARCHIVES_STR+=" "
|
|
fi
|
|
val="${CLANG_ARCHIVES[${key}]}"
|
|
CLANG_ARCHIVES_STR+="${key}:${val}"
|
|
done
|
|
|
|
buildah bud ${PLATFORM} --jobs 0 --squash --no-cache --pull -f tools/toolchain/Dockerfile --manifest "$(<tools/toolchain/image)" -v "$(realpath ./):/mnt:Z" --build-arg CLANG_BUILD="${CLANG_BUILD}" --build-arg CLANG_ARCHIVES="${CLANG_ARCHIVES_STR}"
|
|
|
|
echo "Done building $(<tools/toolchain/image). You can now test it, and push with"
|
|
echo ""
|
|
echo " podman manifest push --all $(<tools/toolchain/image) docker://$(<tools/toolchain/image)"
|
|
if [[ "${CLANG_BUILD}" = "INSTALL" ]]; then
|
|
echo ""
|
|
echo "Optimized clang archive saved at:"
|
|
echo " ${CLANG_ARCHIVES[${current_arch_uname}]}"
|
|
fi
|