#!/usr/bin/env bash # This script is used for running compiler standalone(outside of sbt) # it's based on miniboxing script and paulp's launcher script # Try to autodetect real location of the script DOTTY_ROOT="$(readlink "$0")" # relative, symbolic links resolved if [[ "$DOTTY_ROOT" == "" ]]; then DOTTY_ROOT="$0" fi DOTTY_ROOT="$(dirname "$DOTTY_ROOT")" DOTTY_ROOT="$( cd "$DOTTY_ROOT" >& /dev/null && pwd )/.." # absolute source "$DOTTY_ROOT/bin/common" # dotc.build test places bootstrapped jar here DOTTY_JAR="$DOTTY_ROOT/dotty.jar" CompilerMain=dotty.tools.dotc.Main FromTasty=dotty.tools.dotc.FromTasty ReplMain=dotty.tools.dotc.repl.Main if [ ! -f "$SCALA_LIBRARY_JAR" -o ! -f "$SCALA_REFLECT_JAR" -o ! -f "$SCALA_ASM_JAR" -o ! -f "$SBT_INTERFACE_JAR" ] then echo To use this script please set echo SCALA_LIBRARY_JAR to point to scala-library-$SCALA_VERSION.jar "(currently $SCALA_LIBRARY_JAR)" echo SCALA_REFLECT_JAR to point to scala-reflect-$SCALA_VERSION.jar "(currently $SCALA_REFLECT_JAR)" echo SCALA_ASM_JAR to point to scala-asm-$SCALA_ASM_VERSION.jar "(currently $SCALA_ASM_JAR)" echo SBT_INTERFACE_JAR to point to interface-$SBT_VERSION.jar "(currently $SBT_INTERFACE_JAR)" fi ifdebug () { [[ -n "$debug" ]] && eval "$@" } echoErr () { echo >&2 "$@" } dlog () { [[ -n "$debug" ]] && echoErr "$@" } die() { echo "Aborting: $@" exit 1 } echoArgs () { echoErr "" for arg; do echoErr "$arg" done echoErr "" } execCommand () { ifdebug echoArgs "$@" ignore="$(cat "$HOME/.scala_ignore_crashes" 2>/dev/null)" if [[ "$ignore" == "true" ]]; then "$@" 2>&1 | scala-crash-filter else $@ fi } # restore stty settings (echo in particular) restoreSttySettings () { dlog "" && dlog "[restore stty] $saved_stty" stty "$saved_stty" && saved_stty="" } onExit () { [[ -n "$saved_stty" ]] && restoreSttySettings exit $scala_exit_status } # Get debug set early for arg in "$@"; do [[ $arg == "-debug" ]] && debug=true done # to reenable echo if we are interrupted before completing. trap onExit INT # save terminal settings saved_stty="$(stty -g 2>/dev/null)" # clear on error so we don't later try to restore them [[ $? ]] || saved_stty="" dlog "[save stty] $saved_stty" if uname | grep -q ^CYGWIN; then cygwin="$(uname)" fi addJava () { dlog "[addJava] arg = '$1'" java_args+=("$1") } addScala () { dlog "[addScala] arg = '$1'" scala_args+=("$1") } addResidual () { dlog "[residual] arg = '$1'" residual_args+=("$1") } onExit() { [[ -n "$saved_stty" ]] && restoreSttySettings exit $scala_exit_status } # to reenable echo if we are interrupted before completing. trap onExit INT # If using the boot classpath, also pass an empty classpath # to java to suppress "." from materializing. classpathArgs () { if [[ "true" == "$bootstrapped" ]]; then check_jar "dotty-bootstrapped" "$DOTTY_JAR" "target" 'build_jar "test:runMain dotc.build" target' &> /dev/null toolchain="$DOTTY_JAR:$DOTTY_LIB_JAR:$SCALA_LIBRARY_JAR:$SCALA_REFLECT_JAR:$SCALA_ASM_JAR:$SBT_INTERFACE_JAR" else toolchain="$SCALA_LIBRARY_JAR:$DOTTY_LIB_JAR:$SCALA_REFLECT_JAR:$SCALA_ASM_JAR:$SBT_INTERFACE_JAR" fi bcpJars="$INTERFACES_JAR:$MAIN_JAR:$DOTTY_LIB_JAR" cpJars="$INTERFACES_JAR:$MAIN_JAR:$DOTTY_LIB_JAR:$TEST_JAR" if [[ -n "$cygwin" ]]; then if [[ "$OS" = "Windows_NT" ]] && cygpath -m .>/dev/null 2>/dev/null ; then format=mixed else format=windows fi if [[ -n "$bootcp" ]]; then boot_classpath="$(cygpath --path --$format "$toolchain:$bcpJars")" classpath="$(cygpath --path --$format "$cpJars")" cpArgs="-Xbootclasspath/a:$boot_classpath -classpath $classpath" else classpath="$(cygpath --path --$format "$toolchain:$cpJars")" cpArgs="-classpath $classpath" fi else if [[ -n "$bootcp" ]]; then cpArgs="-Xbootclasspath/a:$toolchain:$bcpJars -classpath $cpJars" else cpArgs="-classpath $toolchain:$cpJars" fi fi echo ${cpArgs} } # e.g. path -java-home /path/to/java_home require_arg () { local type="$1" local opt="$2" local arg="$3" if [[ -z "$arg" ]] || [[ "${arg:0:1}" == "-" ]]; then die "$opt requires <$type> argument" fi } main_class="$CompilerMain" while [[ $# -gt 0 ]]; do case "$1" in --) shift; for arg; do addResidual "$arg"; done; set -- ;; -h|-help) help=true && shift ;; -bootstrapped) bootstrapped=true && shift ;; -v|-verbose) verbose=true && shift ;; -debug) debug=true && shift ;; -q|-quiet) quiet=true && shift ;; # Optimize for short-running applications, see https://github.com/lampepfl/dotty/issues/222 -Oshort) addJava "-XX:+TieredCompilation -XX:TieredStopAtLevel=1" && shift ;; -repl) main_class="$ReplMain" && shift ;; -tasty) main_class="$FromTasty" && shift ;; -compile) main_class="$CompilerMain" && shift ;; -run) main_class="$ReplMain" && shift ;; -fsc) main_class="$FscMain" && shift ;; -bootcp) bootcp=true && shift ;; -nobootcp) unset bootcp && shift ;; -colors) colors=true && shift ;; -no-colors) unset colors && shift ;; -jrebel) jrebel=true && shift ;; -no-jrebel) unset jrebel && shift ;; -toolcp) require_arg classpath "$1" "$2" && toolcp="$2" && shift 2 ;; -java-home) require_arg path "$1" "$2" && java_cmd="$2/bin/java" && shift 2 ;; # break out -D and -J options and add them to JAVA_OPTS as well # so they reach the JVM in time to do some good. The -D options # will be available as system properties. -D*) addJava "$1" && addScala "$1" && shift ;; -J*) addJava "${1:2}" && addScala "$1" && shift ;; *) addResidual "$1" && shift ;; esac done [[ -z $java_cmd ]] && prefix=${java_home:+$java_home/bin/} && java_cmd="${prefix}java" # note that variables which may intentionally be empty must not # be quoted: otherwise an empty string will appear as a command line # argument, and java will think that is the program to run. execCommand \ "$java_cmd" \ ${JAVA_OPTS:-$default_java_opts} \ "${java_args[@]}" \ "$(classpathArgs)" \ -Dscala.usejavacp=true \ "${main_class}" \ "${scala_args[@]}" \ "${residual_args[@]}" # record the exit status lest it be overwritten: # then reenable echo and propagate the code. scala_exit_status=$? onExit #echo java -cp $MAIN_JAR: -Dscala.usejavacp=true dotty.tools.dotc.Main $@