#!/bin/sh
##############################################################################
# __ #
# ________ ___ / / ___ Scala Tools Launch Script #
# / __/ __// _ | / / / _ | (c) 2002-2003, LAMP/EPFL #
# __\ \/ /__/ __ |/ /__/ __ | #
# /____/\___/_/ |_/____/_/ | | #
# |/ #
##############################################################################
# $Id$
##############################################################################
# Configuration
# The configure function contains all the configurable variables of
# this script. The content of these variables may be overridden by
# defining an environment variable with the same name prefixed by
# SCALA_. For example, to run socos with a big initial heap size, one
# may run the command "env SCALA_JAVA_ARGS=-Xms1024m socos".
#
# The following environment variables are also read by this script:
# - SCALA_BOOTCLASSPATH: if defined, it is used as the default
# bootclasspath by the Scala compiler.
#
# - SCALA_CLASSPATH: if defined, it is used as the default classpath
# by the scala compiler.
#
# - CLASSPATH: if defined and if SCALA_CLASSPATH is undefined, it is
# used as the default classpath by the Scala compiler.
#
# All paths and path lists must be in Unix form (i.e. use '/' as file
# separator and ':' as path separator). There is only one exception to
# this rule: CLASSPATH must be in Windows form (i.e. use '\' and ';')
# on Windows platforms.
configure() {
# Location of the Scala library sources. These sources are
# included in the Scala distribution.
# This variable must refer a directory.
RUNTIME_SOURCES={#RUNTIME_SOURCES#};
# Location of the compiled Scala library and Scala tools. This
# library and these tools are included in the Scala distribution.
# This variable must refer a directory or a zip or jar file.
RUNTIME_CLASSES={#RUNTIME_CLASSES#};
# Location of the compiled dtd2scala tool. This tool is included
# in the Scala distribution.
# This variable must refer a directory or a zip or jar file.
DTD2SCALA_CLASSES={#DTD2SCALA_CLASSES#};
# Location of the compiled fjbg library. This library is included
# in the Scala distribution.
# This variable must refer a directory or a zip or jar file.
FJBG_CLASSES={#FJBG_CLASSES#};
# Location of the compiled msil library. This library is included
# in the Scala distribution.
# This variable must refer a directory or a zip or jar file.
MSIL_CLASSES={#MSIL_CLASSES#};
# Location of the compiled bcel library. This library may be found
# at http://jakarta.apache.org/bcel/.
# This variable must refer a directory or a zip or jar file.
BCEL_CLASSES={#BCEL_CLASSES#};
# Location of the compiled xerces library. This library may be
# found at http://xml.apache.org/xerces2-j/.
# This variable must refer a directory or a zip or jar file.
XERCES_CLASSES={#XERCES_CLASSES#};
# Command to start the Java VM.
JAVA_EXEC="java";
# Additional arguments to pass to the Java VM.
JAVA_ARGS={#JAVA_ARGS#};
# Command to start subprocesses. This is mainly for debugging
# purposes. One may, for example, display the Java command that is
# started by "socos", by running "env SCALA_EXEC=echo socos".
EXEC="exec";
}
##############################################################################
# Error functions
# Prints a warning message on stderr.
warning() {
echo "$0: warning: " "$@" 1>&2;
}
# Prints an error message on stderr.
error() {
echo "$0:" "$@" 1>&2;
}
# Prints an error message on stderr and exits with a non-zero status.
abort() {
error "$@";
exit 1;
}
##############################################################################
# File name and path list conversion functions
# Prints the OS specific form of the given Unix form file name.
get_os_filename() {
[ $# = 1 ] || abort "internal error";
case "$UNAME" in
CYGWIN* ) cygpath --windows "$1";;
* ) echo "$@";;
esac;
}
# Prints the OS specific form of the given Unix form path list.
get_unix_filename() {
[ $# = 1 ] || abort "internal error";
case "$UNAME" in
CYGWIN* ) cygpath --unix "$1";;
* ) echo "$@";;
esac;
}
# Prints the Unix form of the given OS specific form file name.
get_os_pathlist() {
[ $# = 1 ] || abort "internal error";
case "$UNAME" in
CYGWIN* ) cygpath --window --path "$1";;
* ) echo "$@";;
esac;
}
# Prints the Unix form of the given OS specific form path list.
get_unix_pathlist() {
[ $# = 1 ] || abort "internal error";
case "$UNAME" in
CYGWIN* ) cygpath --unix --path "$1";;
* ) echo "$@";;
esac;
}
##############################################################################
# Variable configuration functions
# Configures the variable with the given name. If a variable named
# SCALA_$1 is defined, assigns its value to the variable named $1,
# otherwise does nothing.
configure_variable() {
[ $# = 1 ] || abort "internal error";
name="$1"; shift 1;
if set | grep "^SCALA_$name=" > /dev/null; then
eval $name=\$SCALA_$name;
fi;
}
# Configures and tests the path variable with the given name. If a
# variable named SCALA_$1 is defined and refers an existing directory
# or file, assigns its value to the variable named $1. If, after that,
# the variable $1 refers a non-existing path, exits with an error.
configure_path_variable() {
[ $# = 1 ] || abort "internal error";
name="$1"; shift 1;
if set | grep "^SCALA_$name=" > /dev/null; then
path=`eval echo \\\$SCALA_\$name`;
if [ -f "$path" -o -d "$path" ]; then
eval $name=\$SCALA_$name;
else
warning "File refered by SCALA_$name ($path) does not exist.";
unset SCALA_$name;
fi;
fi;
path=`eval echo \\\$\$name`;
if [ ! -f "$path" -a ! -d "$path" ]; then
abort "File referred by $name ($path) does not exist." \
"Please, fix the definition of $name in file $SOURCE." \
"Alternatively you may also define the environment" \
"variable SCALA_$name.";
fi
}
##############################################################################
# Path list construction functions
# Appends a named path to a named path list. Configures the path
# variable $2 and updates the path list in variable $1 by appending
# the path from variable $2.
append_path() {
[ $# = 2 ] || abort "internal error";
configure_path_variable "$2";
listname="$1"; shift 1;
pathname="$1"; shift 1;
list=`eval echo \\\$\$listname`;
if [ -z "$list" ]; then
eval $listname=\$$pathname;
else
eval $listname=\$$listname:\$$pathname;
fi;
}
##############################################################################
# Java invocation functions
# Invokes Java with the given arguments (which must, at least, contain
# the name of the main class) and the following additional arguments:
# - arguments specified by variable JAVA_ARGS
# - script-suffix-specific arguments
# - definition of Java properties scala.product and scala.version
# - classpath set to $JAVA_CLASSPATH
exec_java() {
[ $# -gt 0 ] || abort "internal error";
# configure variables
configure_variable EXEC;
configure_variable JAVA_EXEC;
configure_variable JAVA_ARGS;
# append script-suffix-specific arguments
case "$SCRIPT" in
*-debug* ) JAVA_ARGS="$JAVA_ARGS -Djava.compiler=NONE";;
esac;
# invoke Java
$EXEC $JAVA_EXEC $JAVA_ARGS \
-classpath "`get_os_pathlist "$JAVA_CLASSPATH"`" \
-Dscala.product="$SCRIPT" \
-Dscala.version="$VERSION" \
"$@";
}
# Starts a Java program using the Scala compiler. The given arguments
# are passed to exec_java. They must, at least, contain the name of
# the main class.
exec_compile() {
[ $# -gt 0 ] || abort "internal error";
# compute Java classpath
append_path JAVA_CLASSPATH RUNTIME_CLASSES;
append_path JAVA_CLASSPATH BCEL_CLASSES;
append_path JAVA_CLASSPATH FJBG_CLASSES;
append_path JAVA_CLASSPATH MSIL_CLASSES;
# compute Scala classpath
if [ -z "$SCALA_CLASSPATH" ]; then
if [ -n "$CLASSPATH" ]; then
SCALA_CLASSPATH=`get_unix_pathlist "$CLASSPATH"`;
else
SCALA_CLASSPATH=".";
fi;
fi;
# compute Scala boot classpath
if [ -z "$SCALA_BOOTCLASSPATH" ]; then
append_path SCALA_BOOTCLASSPATH RUNTIME_CLASSES;
append_path SCALA_BOOTCLASSPATH RUNTIME_SOURCES;
fi;
# invoke Java
exec_java \
-Dscala.class.path=`get_os_pathlist "$SCALA_CLASSPATH"` \
-Dscala.boot.class.path=`get_os_pathlist "$SCALA_BOOTCLASSPATH"` \
"$@";
}
# Starts a program using dtd2scala. The given arguments are passed to
# exec_java. They must, at least, contain the name of the main class.
exec_dtd2scala() {
[ $# -gt 0 ] || abort "internal error";
# compute Java classpath
append_path JAVA_CLASSPATH DTD2SCALA_CLASSES;
append_path JAVA_CLASSPATH XERCES_PATH;
# invoke Java
exec_java \
"$@";
}
##############################################################################
# Implementation of scala-info
scala_info() {
abort "!!! not yet implemented";
}
##############################################################################
# Definition of UNAME, SOURCE, SCRIPT, PREFIX and VERSION
unset SCRIPT;
UNAME=`uname`;
SOURCE=$0;
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;
PREFIX=`dirname "$SOURCE"`/..;
PREFIX=`cd "$PREFIX"; pwd`;
VERSION={#VERSION#};
VERSION=${VERSION:-"unknown version"};
##############################################################################
# Test of invocation method
if [ -z "$SCRIPT" ]; then
abort "Illegal direct invocation; invoke me through a symbolic link.";
fi;
##############################################################################
# Configuration and invocation of $SCRIPT
unset JAVA_CLASSPATH;
configure;
case "$SCRIPT" in
scala-info ) scala_info "$@";;
socos* ) exec_compile scalac.Main "$@";;
surus* ) exec_compile scalai.Main "$@";;
siris* ) exec_compile scalai.Main -interactive "$@";;
dtd2scala* ) exec_dtd2scala dtd2scala.Main "$@";;
* ) abort "Don't know what to do for $SCRIPT.";;
esac;
##############################################################################