brintos

brintos / linux-shallow public Read only

0
0
Text · 4.0 KiB · e7ecda4 Raw
183 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03 4# Test runner for nolibc tests5 6set -e7 8trap 'echo Aborting...' 'ERR'9 10crosstool_version=13.2.011hostarch=x86_6412nproc=$(( $(nproc) + 2))13cache_dir="${XDG_CACHE_HOME:-"$HOME"/.cache}"14download_location="${cache_dir}/crosstools/"15build_location="$(realpath "${cache_dir}"/nolibc-tests/)"16perform_download=017test_mode=system18werror=119llvm=20archs="i386 x86_64 arm64 arm mips32le mips32be ppc ppc64 ppc64le riscv s390 loongarch"21 22TEMP=$(getopt -o 'j:d:c:b:a:m:pelh' -n "$0" -- "$@")23 24eval set -- "$TEMP"25unset TEMP26 27print_usage() {28	cat <<EOF29Run nolibc testsuite for multiple architectures with crosstools30 31Usage:32 $0 [options] <architectures>33 34Known architectures:35 ${archs}36 37Options:38 -j [N]         Allow N jobs at once (default: ${nproc})39 -p             Allow download of toolchains40 -d [DIR]       Download location for toolchains (default: ${download_location})41 -c [VERSION]   Version of toolchains to use (default: ${crosstool_version})42 -a [ARCH]      Host architecture of toolchains to use (default: ${hostarch})43 -b [DIR]       Build location (default: ${build_location})44 -m [MODE]      Test mode user/system (default: ${test_mode})45 -e             Disable -Werror46 -l             Build with LLVM/clang47EOF48}49 50while true; do51	case "$1" in52		'-j')53			nproc="$2"54			shift 2; continue ;;55		'-p')56			perform_download=157			shift; continue ;;58		'-d')59			download_location="$2"60			shift 2; continue ;;61		'-c')62			crosstool_version="$2"63			shift 2; continue ;;64		'-a')65			hostarch="$2"66			shift 2; continue ;;67		'-b')68			build_location="$(realpath "$2")"69			shift 2; continue ;;70		'-m')71			test_mode="$2"72			shift 2; continue ;;73		'-e')74			werror=075			shift; continue ;;76		'-l')77			llvm=178			shift; continue ;;79		'-h')80			print_usage81			exit 082			;;83		'--')84			shift; break ;;85		*)86			echo 'Internal error!' >&2; exit 1 ;;87	esac88done89 90if [[ -n "$*" ]]; then91	archs="$*"92fi93 94crosstool_arch() {95	case "$1" in96	arm64) echo aarch64;;97	ppc) echo powerpc;;98	ppc64) echo powerpc64;;99	ppc64le) echo powerpc64;;100	riscv) echo riscv64;;101	loongarch) echo loongarch64;;102	mips*) echo mips;;103	*) echo "$1";;104	esac105}106 107crosstool_abi() {108	case "$1" in109	arm) echo linux-gnueabi;;110	*) echo linux;;111	esac112}113 114download_crosstool() {115	arch="$(crosstool_arch "$1")"116	abi="$(crosstool_abi "$1")"117 118	archive_name="${hostarch}-gcc-${crosstool_version}-nolibc-${arch}-${abi}.tar.gz"119	url="https://mirrors.edge.kernel.org/pub/tools/crosstool/files/bin/${hostarch}/${crosstool_version}/${archive_name}"120	archive="${download_location}${archive_name}"121	stamp="${archive}.stamp"122 123	[ -f "${stamp}" ] && return124 125	echo "Downloading crosstools ${arch} ${crosstool_version}"126	mkdir -p "${download_location}"127	curl -o "${archive}" --fail --continue-at - "${url}"128	tar -C "${download_location}" -xf "${archive}"129	touch "${stamp}"130}131 132# capture command output, print it on failure133# mimics chronic(1) from moreutils134function swallow_output() {135	if ! OUTPUT="$("$@" 2>&1)"; then136		echo "$OUTPUT"137		return 1138	fi139	return 0140}141 142test_arch() {143	arch=$1144	ct_arch=$(crosstool_arch "$arch")145	ct_abi=$(crosstool_abi "$1")146	cross_compile=$(realpath "${download_location}gcc-${crosstool_version}-nolibc/${ct_arch}-${ct_abi}/bin/${ct_arch}-${ct_abi}-")147	build_dir="${build_location}/${arch}"148	if [ "$werror" -ne 0 ]; then149		CFLAGS_EXTRA="$CFLAGS_EXTRA -Werror"150	fi151	MAKE=(make -j"${nproc}" XARCH="${arch}" CROSS_COMPILE="${cross_compile}" LLVM="${llvm}" O="${build_dir}")152 153	mkdir -p "$build_dir"154	if [ "$test_mode" = "system" ] && [ ! -f "${build_dir}/.config" ]; then155		swallow_output "${MAKE[@]}" defconfig156	fi157	case "$test_mode" in158		'system')159			test_target=run160			;;161		'user')162			test_target=run-user163			;;164		*)165			echo "Unknown mode $test_mode"166			exit 1167	esac168	printf '%-15s' "$arch:"169	swallow_output "${MAKE[@]}" CFLAGS_EXTRA="$CFLAGS_EXTRA" "$test_target" V=1170	cp run.out run.out."${arch}"171	"${MAKE[@]}" report | grep passed172}173 174if [ "$perform_download" -ne 0 ]; then175	for arch in $archs; do176		download_crosstool "$arch"177	done178fi179 180for arch in $archs; do181	test_arch "$arch"182done183