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