Created
July 30, 2011 14:43
-
-
Save itang/1115592 to your computer and use it in GitHub Desktop.
Clojure launcher for linux
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash --posix | |
## modified from Scala shell | |
# | |
############################################################################## | |
# Copyright 2002-2011, 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. | |
############################################################################## | |
# Not sure what the right default is here: trying nonzero. | |
clojure_exit_status=127 | |
saved_stty="" | |
# restore stty settings (echo in particular) | |
function restoreSttySettings() { | |
if [[ -n $clojure_RUNNER_DEBUG ]]; then | |
echo "restoring stty: $saved_stty" | |
fi | |
stty $saved_stty | |
saved_stty="" | |
} | |
function onExit() { | |
if [[ "$saved_stty" != "" ]]; then | |
restoreSttySettings | |
exit $clojure_exit_status | |
fi | |
} | |
# 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 $clojure_RUNNER_DEBUG ]]; then | |
echo "saved stty: $saved_stty" | |
fi | |
cygwin=false; | |
case "`uname`" in | |
CYGWIN*) cygwin=true ;; | |
esac | |
# Finding the root folder for this Clojuire distribution | |
SOURCE=$0; | |
SCRIPT=`basename "$SOURCE"`; | |
while [ -h "$SOURCE" ]; do | |
SCRIPT=`basename "$SOURCE"`; | |
LOOKUP=`ls -ld "$SOURCE"`; | |
TARGET=`expr "$LOOKUP" : '.*-> \(.*\)$'`; | |
if expr "${TARGET:-.}/" : '/.*/$' > /dev/null; then | |
SOURCE=${TARGET:-.}; | |
else | |
SOURCE=`dirname "$SOURCE"`/${TARGET:-.}; | |
fi; | |
done; | |
# see #2092 | |
CLOJURE_HOME=`dirname "$SOURCE"` | |
CLOJURE_HOME=`cd "$CLOJURE_HOME"; pwd -P` | |
CLOJURE_HOME=`cd "$CLOJURE_HOME"/..; pwd` | |
# Remove spaces from CLOJURE_HOME on windows | |
if $cygwin; then | |
CLOJURE_HOME=`cygpath --windows --short-name "$CLOJURE_HOME"` | |
CLOJURE_HOME=`cygpath --unix "$CLOJURE_HOME"` | |
fi | |
# Constructing the extension classpath | |
TOOL_CLASSPATH="" | |
if [ -z "$TOOL_CLASSPATH" ] ; then | |
for ext in "$CLOJURE_HOME"/lib/* ; do | |
if [ -z "$TOOL_CLASSPATH" ] ; then | |
TOOL_CLASSPATH="$ext" | |
else | |
TOOL_CLASSPATH="$TOOL_CLASSPATH:$ext" | |
fi | |
done | |
fi | |
#if $cygwin; then | |
# if [ "$OS" = "Windows_NT" ] && cygpath -m .>/dev/null 2>/dev/null ; then | |
# format=mixed | |
# else | |
# format=windows | |
# fi | |
# CLOJURE_HOME=`cygpath --$format "$CLOJURE_HOME"` | |
# TOOL_CLASSPATH=`cygpath --path --$format "$TOOL_CLASSPATH"` | |
# case "$TERM" in | |
# rxvt* | xterm*) | |
# stty -icanon min 1 -echo | |
# CYGWIN_JLINE_TERMINAL="-Djline.terminal=clojure.tools.jline.UnixTerminal" | |
# ;; | |
# esac | |
#fi | |
[ -n "$JAVA_OPTS" ] || JAVA_OPTS="-Xmx256M -Xms32M" | |
# 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 clojure_args | |
# default to the boot classpath for speed. | |
CPSELECT="-classpath " | |
CYGWIN_JLINE_TERMINAL="" | |
if [ -z $1 ] ; then | |
TOOL_CLASSPATH="$TOOL_CLASSPATH:$CLOJURE_HOME/bin/jline-1.0.jar" | |
CYGWIN_JLINE_TERMINAL=" jline.ConsoleRunner " | |
fi | |
while [ $# -gt 0 ]; do | |
case "$1" in | |
-D*) | |
# pass to clojure as well: otherwise we lose it sometimes when we | |
# need it, e.g. communicating with a server compiler. | |
java_args=("${java_args[@]}" "$1") | |
clojure_args=("${clojure_args[@]}" "$1") | |
shift | |
;; | |
-J*) | |
# as with -D, pass to clojure even though it will almost | |
# never be used. | |
java_args=("${java_args[@]}" "${1:2}") | |
clojure_args=("${clojure_args[@]}" "$1") | |
shift | |
;; | |
-toolcp) | |
TOOL_CLASSPATH="$TOOL_CLASSPATH:$2" | |
shift 2 | |
;; | |
-bootcp) | |
CPSELECT="-Xbootclasspath/a:" | |
shift | |
;; | |
*) | |
clojure_args=("${clojure_args[@]}" "$1") | |
shift | |
;; | |
esac | |
done | |
# reset "$@" to the remaining args | |
set -- "${clojure_args[@]}" | |
if [ -z "$JAVACMD" -a -n "$JAVA_HOME" -a -x "$JAVA_HOME/bin/java" ]; then | |
JAVACMD="$JAVA_HOME/bin/java" | |
fi | |
echo "java $JAVA_OPTS ${CPSELECT}${TOOL_CLASSPATH} ${java_args[@]} $CYGWIN_JLINE_TERMINAL clojure.main " | |
"${JAVACMD:=java}" \ | |
$JAVA_OPTS \ | |
"${java_args[@]}" \ | |
${CPSELECT}${TOOL_CLASSPATH} \ | |
-Dclojure.usejavacp=true \ | |
-Dclojure.home="$CLOJURE_HOME" \ | |
-Denv.emacs="$EMACS" \ | |
$CYGWIN_JLINE_TERMINAL \ | |
clojure.main "$@" | |
# record the exit status lest it be overwritten: | |
# then reenable echo and propagate the code. | |
clojure_exit_status=$? | |
onExit |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment