Skip to content

Script for running compiler outside sbt #26

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 20, 2014
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
232 changes: 232 additions & 0 deletions bin/dotc
Original file line number Diff line number Diff line change
@@ -0,0 +1,232 @@
#!/bin/bash
# This script is used for running compiler standalone(outside of sbt)
# it's based on miniboxing script and paulp's launcher script


# Configuration
SCALA_VERSION=2.11.0-M7
DOTTY_VERSION=0.1
bootcp=true
default_java_opts="-Xmx768m -Xms768m"
programName=$(basename "$0")
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

how is programName used?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

currently - it's not used.
But as soon as we have REPL it can be run by the same script by uncommenting couple of lines.

# uncomment next line to enable debug output
#debug=true
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why's this commented out?




declare -a java_args scala_args residual_args
unset verbose quiet cygwin toolcp colors saved_stty


CompilerMain=dotty.tools.dotc.Main


# Try to autodetect real location of the script
DOTTY_ROOT="`readlink \"$0\"`" # relative, symbolic links resolved
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@DarkDimius, can you please add a guard against the machine missing readlink? It should be something like:

if [ -z `which readlink` ]; then
  echo "Please install readlink: {brew, apt-get, yum} install readlink"
  exit 1
fi

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In Gentoo, Debian and Fedora readlink is actually provided by coreutils.
Which distributive\OS are you running?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, sorry, I had reallink in mind. My bad, readlink is part of the coreutils.

if [[ "$DOTTY_ROOT" == "" ]]; then
DOTTY_ROOT="$0"
fi
DOTTY_ROOT="`dirname \"$DOTTY_ROOT\"`"
DOTTY_ROOT="`( cd \"$DOTTY_ROOT\" && pwd )`/.." # absolute
# autodetecting the compiler jar. this is location where sbt 'packages' it
MAIN_JAR=$DOTTY_ROOT/target/scala-$SCALA_VERSION/dotty_$SCALA_VERSION-$DOTTY_VERSION-SNAPSHOT.jar

function checkjar {
if [ ! -f "$1" ]
then
echo "The script is going to build the required jar file $1 by running \"sbt $2\""
cd $DOTTY_ROOT
sbt $2
cd -
if [ ! -f "$1" ]
then
echo "The required jar file has not been built by sbt. Please run \"sbt $2\""
exit 1
else
echo "The required jar file was built successfully."
fi
fi
}

checkjar $MAIN_JAR package

# Autodetecting the scala-library location, in case it wasn't provided by an environment variable
if [ "$SCALA_LIBRARY_JAR" == "" ]
then
SCALA_LIBRARY_JAR=$HOME/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-$SCALA_VERSION.jar
# this is location where sbt stores it in ivy cache
fi
# save as for scala-library now for scala-reflect
if [ "$SCALA_REFLECT_JAR" == "" ]
then
SCALA_REFLECT_JAR=$HOME/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-$SCALA_VERSION.jar
fi

if [ ! -f "$SCALA_LIBRARY_JAR" -o ! -f "$SCALA_REFLECT_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)"
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)"
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess, this has limited usefulness. I used it only a couple of times, and by now have already forgot that I implemented it :)

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 == "-d" ]] && 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=( "${java_args[@]}" "$1" )
}
addScala () {
dlog "[addScala] arg = '$1'"
scala_args=( "${scala_args[@]}" "$1" )
}
addResidual () {
dlog "[residual] arg = '$1'"
residual_args=( "${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 [[ -n $bootcp ]]; then
echo "-Xbootclasspath/a:$SCALA_LIBRARY_JAR:$SCALA_REFLECT_JAR:$MAIN_JAR -classpath $MAIN_JAR"
else
echo "-classpath $SCALA_LIBRARY_JAR:$SCALA_REFLECT_JAR:$MAIN_JAR"
fi
}

# 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
}





while [[ $# -gt 0 ]]; do
case "$1" in
--) shift; for arg; do addResidual "$arg"; done; set -- ;;
-h|-help) usage; exit 1 ;;
-v|-verbose) verbose=true && shift ;;
-d|-debug) debug=true && shift ;;
-q|-quiet) quiet=true && shift ;;

-repl) main_class=$ReplMain && shift ;;
-compile) main_class=$CompilerMain && shift ;;
-run) main_class=$ReplMain && shift ;;
-fsc) main_class=$FscMain && shift ;;
-bootcp) bootcp=true && shift ;;
-no-bootcp) 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 \
"${CompilerMain}" \
"${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 $@