170 lines
3.7 KiB
Bash
170 lines
3.7 KiB
Bash
|
#!/bin/bash
|
||
|
# SPDX-License-Identifier: GPL-2.0
|
||
|
|
||
|
# Test runner for nolibc tests
|
||
|
|
||
|
set -e
|
||
|
|
||
|
trap 'echo Aborting...' 'ERR'
|
||
|
|
||
|
crosstool_version=13.2.0
|
||
|
hostarch=x86_64
|
||
|
nproc=$(( $(nproc) + 2))
|
||
|
cache_dir="${XDG_CACHE_HOME:-"$HOME"/.cache}"
|
||
|
download_location="${cache_dir}/crosstools/"
|
||
|
build_location="$(realpath "${cache_dir}"/nolibc-tests/)"
|
||
|
perform_download=0
|
||
|
test_mode=system
|
||
|
archs="i386 x86_64 arm64 arm mips32le mips32be ppc ppc64 ppc64le riscv s390 loongarch"
|
||
|
|
||
|
TEMP=$(getopt -o 'j:d:c:b:a:m:ph' -n "$0" -- "$@")
|
||
|
|
||
|
eval set -- "$TEMP"
|
||
|
unset TEMP
|
||
|
|
||
|
print_usage() {
|
||
|
cat <<EOF
|
||
|
Run nolibc testsuite for multiple architectures with crosstools
|
||
|
|
||
|
Usage:
|
||
|
$0 [options] <architectures>
|
||
|
|
||
|
Known architectures:
|
||
|
${archs}
|
||
|
|
||
|
Options:
|
||
|
-j [N] Allow N jobs at once (default: ${nproc})
|
||
|
-p Allow download of toolchains
|
||
|
-d [DIR] Download location for toolchains (default: ${download_location})
|
||
|
-c [VERSION] Version of toolchains to use (default: ${crosstool_version})
|
||
|
-a [ARCH] Host architecture of toolchains to use (default: ${hostarch})
|
||
|
-b [DIR] Build location (default: ${build_location})
|
||
|
-m [MODE] Test mode user/system (default: ${test_mode})
|
||
|
EOF
|
||
|
}
|
||
|
|
||
|
while true; do
|
||
|
case "$1" in
|
||
|
'-j')
|
||
|
nproc="$2"
|
||
|
shift 2; continue ;;
|
||
|
'-p')
|
||
|
perform_download=1
|
||
|
shift; continue ;;
|
||
|
'-d')
|
||
|
download_location="$2"
|
||
|
shift 2; continue ;;
|
||
|
'-c')
|
||
|
crosstool_version="$2"
|
||
|
shift 2; continue ;;
|
||
|
'-a')
|
||
|
hostarch="$2"
|
||
|
shift 2; continue ;;
|
||
|
'-b')
|
||
|
build_location="$(realpath "$2")"
|
||
|
shift 2; continue ;;
|
||
|
'-m')
|
||
|
test_mode="$2"
|
||
|
shift 2; continue ;;
|
||
|
'-h')
|
||
|
print_usage
|
||
|
exit 0
|
||
|
;;
|
||
|
'--')
|
||
|
shift; break ;;
|
||
|
*)
|
||
|
echo 'Internal error!' >&2; exit 1 ;;
|
||
|
esac
|
||
|
done
|
||
|
|
||
|
if [[ -n "$*" ]]; then
|
||
|
archs="$*"
|
||
|
fi
|
||
|
|
||
|
crosstool_arch() {
|
||
|
case "$1" in
|
||
|
arm64) echo aarch64;;
|
||
|
ppc) echo powerpc;;
|
||
|
ppc64) echo powerpc64;;
|
||
|
ppc64le) echo powerpc64;;
|
||
|
riscv) echo riscv64;;
|
||
|
loongarch) echo loongarch64;;
|
||
|
mips*) echo mips;;
|
||
|
*) echo "$1";;
|
||
|
esac
|
||
|
}
|
||
|
|
||
|
crosstool_abi() {
|
||
|
case "$1" in
|
||
|
arm) echo linux-gnueabi;;
|
||
|
*) echo linux;;
|
||
|
esac
|
||
|
}
|
||
|
|
||
|
download_crosstool() {
|
||
|
arch="$(crosstool_arch "$1")"
|
||
|
abi="$(crosstool_abi "$1")"
|
||
|
|
||
|
archive_name="${hostarch}-gcc-${crosstool_version}-nolibc-${arch}-${abi}.tar.gz"
|
||
|
url="https://mirrors.edge.kernel.org/pub/tools/crosstool/files/bin/${hostarch}/${crosstool_version}/${archive_name}"
|
||
|
archive="${download_location}${archive_name}"
|
||
|
stamp="${archive}.stamp"
|
||
|
|
||
|
[ -f "${stamp}" ] && return
|
||
|
|
||
|
echo "Downloading crosstools ${arch} ${crosstool_version}"
|
||
|
mkdir -p "${download_location}"
|
||
|
curl -o "${archive}" --fail --continue-at - "${url}"
|
||
|
tar -C "${download_location}" -xf "${archive}"
|
||
|
touch "${stamp}"
|
||
|
}
|
||
|
|
||
|
# capture command output, print it on failure
|
||
|
# mimics chronic(1) from moreutils
|
||
|
function swallow_output() {
|
||
|
if ! OUTPUT="$("$@" 2>&1)"; then
|
||
|
echo "$OUTPUT"
|
||
|
return 1
|
||
|
fi
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
test_arch() {
|
||
|
arch=$1
|
||
|
ct_arch=$(crosstool_arch "$arch")
|
||
|
ct_abi=$(crosstool_abi "$1")
|
||
|
cross_compile=$(realpath "${download_location}gcc-${crosstool_version}-nolibc/${ct_arch}-${ct_abi}/bin/${ct_arch}-${ct_abi}-")
|
||
|
build_dir="${build_location}/${arch}"
|
||
|
MAKE=(make -j"${nproc}" XARCH="${arch}" CROSS_COMPILE="${cross_compile}" O="${build_dir}")
|
||
|
|
||
|
mkdir -p "$build_dir"
|
||
|
if [ "$test_mode" = "system" ] && [ ! -f "${build_dir}/.config" ]; then
|
||
|
swallow_output "${MAKE[@]}" defconfig
|
||
|
fi
|
||
|
case "$test_mode" in
|
||
|
'system')
|
||
|
test_target=run
|
||
|
;;
|
||
|
'user')
|
||
|
test_target=run-user
|
||
|
;;
|
||
|
*)
|
||
|
echo "Unknown mode $test_mode"
|
||
|
exit 1
|
||
|
esac
|
||
|
printf '%-15s' "$arch:"
|
||
|
swallow_output "${MAKE[@]}" "$test_target" V=1
|
||
|
cp run.out run.out."${arch}"
|
||
|
"${MAKE[@]}" report | grep passed
|
||
|
}
|
||
|
|
||
|
if [ "$perform_download" -ne 0 ]; then
|
||
|
for arch in $archs; do
|
||
|
download_crosstool "$arch"
|
||
|
done
|
||
|
fi
|
||
|
|
||
|
for arch in $archs; do
|
||
|
test_arch "$arch"
|
||
|
done
|