blob: 4569dd49982b6aee8f9b75185506605e60180ee1 [file] [log] [blame]
#!/usr/bin/env bash
# Copyright 2024 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
function usage() {
cat <<EOF
$0 [options] -- <rustc> [rustc-arguments...]
Options:
--help | -h : print help and exit
--timeout DURATION: how long to wait before killing rustc. the duration is
passed through to timeout(1), see that man page for details. zero means
no timeout.
--check-ice: search the output for internal compiler error messages
EOF
}
duration=0
check_ice=0
# Extract options before --
prev_opt=
for opt do
# handle --option arg
if test -n "$prev_opt"; then
eval "$prev_opt"=\$opt
prev_opt=
shift
continue
fi
# Extract optarg from --opt=optarg
case "$opt" in
-*=*) optarg="${opt#*=}" ;; # remove-prefix, shortest-match
esac
case "$opt" in
--help|-h) usage ; exit ;;
--timeout) prev_opt=duration ;;
--timeout=*) duration="$optarg" ;;
--check-ice) check_ice=1 ;;
--) shift; break ;; # Everything else is part of the rustc command
esac
shift
done
test -z "$prev_opt" || { echo "Option is missing argument to set $prev_opt." ; exit 1;}
ice_err="internal compiler error"
ice_msg="\n\n\e[1;3;41mIt looks like you've encountered an INTERNAL COMPILER\n"
ice_msg+="ERROR (ICE for short). rustc's incremental compilation feature is a\n"
ice_msg+="common cause of ICEs. If you have 'rust_incremental = \"foo\"' in your\n"
ice_msg+="args.gn, try running 'rm out/default/foo' and re-running the build.\n"
ice_msg+="If after clearing your incremental dir you still get an ICE, file\n"
ice_msg+="a bug against Language Platforms > Rust.\e[m\n"
command=(env "$@")
if [[ $duration != 0 ]]; then
command=(timeout "${duration}s" "${command[@]}")
fi
if [[ $check_ice == 1 ]]; then
"${command[@]}" 2> >(tee >&2 \
>(grep "$ice_err" > /dev/null && echo -e "$ice_msg" >&2))
else
"${command[@]}"
fi
result="$?"
timeout_msg="\n\nERROR: The rust compiler timed out after $duration seconds\n"
[[ $result == 124 ]] && echo -e "$timeout_msg"
exit $result