#!/usr/bin/env bash # ############################################################################## # Copyright 2002-2013 LAMP/EPFL # # This is free software; see the distribution for copying conditions. # There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. ############################################################################## findScalaHome () { # see SI-2092 and SI-5792 local source="${BASH_SOURCE[0]}" while [ -h "$source" ] ; do local linked="$(readlink "$source")" local dir="$( cd -P $(dirname "$source") && cd -P $(dirname "$linked") && pwd )" source="$dir/$(basename "$linked")" done ( cd -P "$(dirname "$source")/.." && pwd ) } execCommand () { [[ -n $SCALA_RUNNER_DEBUG ]] && echo "" && for arg in "$@@"; do echo "$arg"; done && echo ""; "$@@" } # Not sure what the right default is here: trying nonzero. scala_exit_status=127 saved_stty="" # restore stty settings (echo in particular) function restoreSttySettings() { if [[ -n $SCALA_RUNNER_DEBUG ]]; then echo "restoring stty:" echo "$saved_stty" fi stty $saved_stty saved_stty="" } function onExit() { [[ "$saved_stty" != "" ]] && restoreSttySettings exit $scala_exit_status } # 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 if [[ ! $? ]]; then saved_stty="" fi if [[ -n $SCALA_RUNNER_DEBUG ]]; then echo "saved stty:" echo "$saved_stty" fi unset cygwin if uname | grep -q ^CYGWIN; then cygwin="$(uname)" fi unset mingw if uname | grep -q ^MINGW; then mingw="$(uname)" fi unset msys if uname | grep -q ^MSYS; then msys="$(uname)" fi # Finding the root folder for this Scala distribution SCALA_HOME="$(findScalaHome)" SEP=":" # Possible additional command line options WINDOWS_OPT="" EMACS_OPT="-Denv.emacs=$EMACS" # Remove spaces from SCALA_HOME on windows if [[ -n "$cygwin" ]]; then SCALA_HOME="$(shome="$(cygpath --windows --short-name "$SCALA_HOME")" ; cygpath --unix "$shome")" # elif uname |grep -q ^MINGW; then # SEP=";" fi # Constructing the extension classpath TOOL_CLASSPATH="@classpath@" if [[ -z "$TOOL_CLASSPATH" ]]; then for ext in "$SCALA_HOME"/lib/* ; do file_extension="${ext##*.}" # SI-8967 Only consider directories and files named '*.jar' if [[ -d "$ext" || $file_extension == "jar" ]]; then if [[ -z "$TOOL_CLASSPATH" ]]; then TOOL_CLASSPATH="$ext" else TOOL_CLASSPATH="${TOOL_CLASSPATH}${SEP}${ext}" fi fi done fi if [[ -n "$cygwin" ]]; then if [[ "$OS" = "Windows_NT" ]] && cygpath -m .>/dev/null 2>/dev/null ; then format=mixed else format=windows fi SCALA_HOME="$(cygpath --$format "$SCALA_HOME")" if [[ -n "$JAVA_HOME" ]]; then JAVA_HOME="$(cygpath --$format "$JAVA_HOME")" fi TOOL_CLASSPATH="$(cygpath --path --$format "$TOOL_CLASSPATH")" fi if [[ -n "$cygwin$mingw$msys" ]]; then case "$TERM" in rxvt* | xterm* | cygwin*) stty -icanon min 1 -echo WINDOWS_OPT="-Djline.terminal=unix" ;; esac fi [[ -n "$JAVA_OPTS" ]] || JAVA_OPTS="@javaflags@" # break out -D and -J options and add them to JAVA_OPTS as well # so they reach the underlying JVM in time to do some good. The # -D options will be available as system properties. declare -a java_args declare -a scala_args # SI-8358, SI-8368 -- the default should really be false, # but I don't want to flip the default during 2.11's RC cycle OVERRIDE_USEJAVACP="-Dscala.usejavacp=true" while [[ $# -gt 0 ]]; do case "$1" in -D*) # pass to scala as well: otherwise we lose it sometimes when we # need it, e.g. communicating with a server compiler. java_args+=("$1") scala_args+=("$1") # respect user-supplied -Dscala.usejavacp case "$1" in -Dscala.usejavacp*) OVERRIDE_USEJAVACP="";; esac shift ;; -J*) # as with -D, pass to scala even though it will almost # never be used. java_args+=("${1:2}") scala_args+=("$1") shift ;; -toolcp) TOOL_CLASSPATH="${TOOL_CLASSPATH}${SEP}${2}" shift 2 ;; -nobootcp) usebootcp="false" shift ;; -usebootcp) usebootcp="true" shift ;; -debug) SCALA_RUNNER_DEBUG=1 shift ;; *) scala_args+=("$1") shift ;; esac done # reset "$@@" to the remaining args set -- "${scala_args[@@]}" if [[ -z "$JAVACMD" && -n "$JAVA_HOME" && -x "$JAVA_HOME/bin/java" ]]; then JAVACMD="$JAVA_HOME/bin/java" fi declare -a classpath_args # default to the boot classpath for speed, except on cygwin/mingw/msys because # JLine on Windows requires a custom DLL to be loaded. if [[ "$usebootcp" != "false" && -z "$cygwin$mingw$msys" ]]; then usebootcp="true" fi # If using the boot classpath, also pass an empty classpath # to java to suppress "." from materializing. if [[ "$usebootcp" == "true" ]]; then classpath_args=("-Xbootclasspath/a:$TOOL_CLASSPATH" -classpath "\"\"") # Java 9 removed sun.boot.class.path, and the supposed replacement to at least see # the appended boot classpath (jdk.boot.class.path.append) is not visible. # So we have to pass a custom system property that PathResolver will find. # We do this for all JVM versions, rather than getting into the business of JVM version detection. classpath_args+=("-Dscala.boot.class.path=$TOOL_CLASSPATH") else classpath_args=(-classpath "$TOOL_CLASSPATH") fi # 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 \ "${JAVACMD:=java}" \ $JAVA_OPTS \ "${java_args[@@]}" \ "${classpath_args[@@]}" \ -Dscala.home="$SCALA_HOME" \ $OVERRIDE_USEJAVACP \ "$EMACS_OPT" \ $WINDOWS_OPT \ @properties@ @class@ @toolflags@ "$@@" # record the exit status lest it be overwritten: # then reenable echo and propagate the code. scala_exit_status=$? onExit