Skip to content

Instantly share code, notes, and snippets.

@itang
Created July 30, 2011 14:43
Show Gist options
  • Save itang/1115592 to your computer and use it in GitHub Desktop.
Save itang/1115592 to your computer and use it in GitHub Desktop.
Clojure launcher for linux
#!/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