Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.2.
  1#!/bin/bash
  2# SPDX-License-Identifier: GPL-2.0
  3
  4# Test runner for nolibc tests
  5
  6set -e
  7
  8trap 'echo Aborting...' 'ERR'
  9
 10crosstool_version=13.2.0
 11hostarch=x86_64
 12nproc=$(( $(nproc) + 2))
 13cache_dir="${XDG_CACHE_HOME:-"$HOME"/.cache}"
 14download_location="${cache_dir}/crosstools/"
 15build_location="$(realpath "${cache_dir}"/nolibc-tests/)"
 16perform_download=0
 17test_mode=system
 18archs="i386 x86_64 arm64 arm mips32le mips32be ppc ppc64 ppc64le riscv s390 loongarch"
 19
 20TEMP=$(getopt -o 'j:d:c:b:a:m:ph' -n "$0" -- "$@")
 21
 22eval set -- "$TEMP"
 23unset TEMP
 24
 25print_usage() {
 26	cat <<EOF
 27Run nolibc testsuite for multiple architectures with crosstools
 28
 29Usage:
 30 $0 [options] <architectures>
 31
 32Known architectures:
 33 ${archs}
 34
 35Options:
 36 -j [N]         Allow N jobs at once (default: ${nproc})
 37 -p             Allow download of toolchains
 38 -d [DIR]       Download location for toolchains (default: ${download_location})
 39 -c [VERSION]   Version of toolchains to use (default: ${crosstool_version})
 40 -a [ARCH]      Host architecture of toolchains to use (default: ${hostarch})
 41 -b [DIR]       Build location (default: ${build_location})
 42 -m [MODE]      Test mode user/system (default: ${test_mode})
 43EOF
 44}
 45
 46while true; do
 47	case "$1" in
 48		'-j')
 49			nproc="$2"
 50			shift 2; continue ;;
 51		'-p')
 52			perform_download=1
 53			shift; continue ;;
 54		'-d')
 55			download_location="$2"
 56			shift 2; continue ;;
 57		'-c')
 58			crosstool_version="$2"
 59			shift 2; continue ;;
 60		'-a')
 61			hostarch="$2"
 62			shift 2; continue ;;
 63		'-b')
 64			build_location="$(realpath "$2")"
 65			shift 2; continue ;;
 66		'-m')
 67			test_mode="$2"
 68			shift 2; continue ;;
 69		'-h')
 70			print_usage
 71			exit 0
 72			;;
 73		'--')
 74			shift; break ;;
 75		*)
 76			echo 'Internal error!' >&2; exit 1 ;;
 77	esac
 78done
 79
 80if [[ -n "$*" ]]; then
 81	archs="$*"
 82fi
 83
 84crosstool_arch() {
 85	case "$1" in
 86	arm64) echo aarch64;;
 87	ppc) echo powerpc;;
 88	ppc64) echo powerpc64;;
 89	ppc64le) echo powerpc64;;
 90	riscv) echo riscv64;;
 91	loongarch) echo loongarch64;;
 92	mips*) echo mips;;
 93	*) echo "$1";;
 94	esac
 95}
 96
 97crosstool_abi() {
 98	case "$1" in
 99	arm) echo linux-gnueabi;;
100	*) echo linux;;
101	esac
102}
103
104download_crosstool() {
105	arch="$(crosstool_arch "$1")"
106	abi="$(crosstool_abi "$1")"
107
108	archive_name="${hostarch}-gcc-${crosstool_version}-nolibc-${arch}-${abi}.tar.gz"
109	url="https://mirrors.edge.kernel.org/pub/tools/crosstool/files/bin/${hostarch}/${crosstool_version}/${archive_name}"
110	archive="${download_location}${archive_name}"
111	stamp="${archive}.stamp"
112
113	[ -f "${stamp}" ] && return
114
115	echo "Downloading crosstools ${arch} ${crosstool_version}"
116	mkdir -p "${download_location}"
117	curl -o "${archive}" --fail --continue-at - "${url}"
118	tar -C "${download_location}" -xf "${archive}"
119	touch "${stamp}"
120}
121
122# capture command output, print it on failure
123# mimics chronic(1) from moreutils
124function swallow_output() {
125	if ! OUTPUT="$("$@" 2>&1)"; then
126		echo "$OUTPUT"
127		return 1
128	fi
129	return 0
130}
131
132test_arch() {
133	arch=$1
134	ct_arch=$(crosstool_arch "$arch")
135	ct_abi=$(crosstool_abi "$1")
136	cross_compile=$(realpath "${download_location}gcc-${crosstool_version}-nolibc/${ct_arch}-${ct_abi}/bin/${ct_arch}-${ct_abi}-")
137	build_dir="${build_location}/${arch}"
138	MAKE=(make -j"${nproc}" XARCH="${arch}" CROSS_COMPILE="${cross_compile}" O="${build_dir}")
139
140	mkdir -p "$build_dir"
141	if [ "$test_mode" = "system" ] && [ ! -f "${build_dir}/.config" ]; then
142		swallow_output "${MAKE[@]}" defconfig
143	fi
144	case "$test_mode" in
145		'system')
146			test_target=run
147			;;
148		'user')
149			test_target=run-user
150			;;
151		*)
152			echo "Unknown mode $test_mode"
153			exit 1
154	esac
155	printf '%-15s' "$arch:"
156	swallow_output "${MAKE[@]}" "$test_target" V=1
157	cp run.out run.out."${arch}"
158	"${MAKE[@]}" report | grep passed
159}
160
161if [ "$perform_download" -ne 0 ]; then
162	for arch in $archs; do
163		download_crosstool "$arch"
164	done
165fi
166
167for arch in $archs; do
168	test_arch "$arch"
169done