summaryrefslogblamecommitdiff
path: root/sources/bin/.scala_wrapper.tmpl
blob: a0d974bdc6e6264d4714b60f4c7c2a4589753908 (plain) (tree)
1
2
3
4
5
6
7
8

                                                                              





                                                                              


































                                                                              

                                                                      


                                                                
                                                                    

                                                                
                                    










                                                                      

















                                                                              
                                  



























































                                                                              
 

                                                








                                                                      
 

                                                
                                             
                               
            

                                                                       


           
                             
                                             

                                                                 
                                                                 
                                 





                                                                              


                                                                     

                                         
 
                          
 

                                         
        
                          



                                                                              









































                                                             
                                                            

                                                            






                                                                              











                                                                      


                               




















                                                                     
                                             


                                            
                                               

                                







                                                                          













                                                                    





                                                                     
                                               
                                             





                 
                                                                  




                                                                     
                                               












                                                                          















                                                                     


                                                                              












































                                                                       
                                           

                                           


                                           
                                                              













                                                                   

                                                         
                                                                         

                                                                 

                                                                





                                                                               
              









                                                                          


                                                                              



























                                                                              


































                                                                              
                             
                                  
                                                
                                                              

                                                                           
                                                                 
                                                           
                                                                 
                
                                                                                            

                                       
                                                                                            

                                       
                                                                                            
                                                    



                                                                              
#!/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. This library is 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 Scala tools. These tools are included
    # in the Scala distribution.
    # This variable must refer a directory or a zip or jar file.
    TOOLS_CLASSES={#TOOLS_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#};

    # 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";

    if set | grep "^SCALA_$1=" > /dev/null; then
        eval $1=\$SCALA_$1;
    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";

    if set | grep "^SCALA_$1=" > /dev/null; then
        path=`eval echo \\\$SCALA_\$1`;
        if [ -f "$path" -o -d "$path" ]; then
            eval $1=\$SCALA_$1;
        else
            warning "File refered by SCALA_$1 ($path) does not exist.";
            unset SCALA_$1;
        fi;
    fi;

    path=`eval echo \\\$\$1`;
    if [ ! -f "$path" -a ! -d "$path" ]; then
        abort "File referred by $1 ($path) does not exist." \
            "Please, fix the definition of $1 in file $SOURCE." \
            "Alternatively you may also define the environment" \
            "variable SCALA_$1.";
    fi
}

##############################################################################
# Path list construction functions

# Appends a named path to a named path list. First, computes variable
# $2 and then updates the path list in variable $1 by appending the
# path from variable $2.
append_path() {
    [ $# = 2 ] || abort "internal error";

    compute_variable "$2";

    if [ -z "`eval echo \\\$\$1`" ]; then
        eval $1=\$$2;
    else
        eval $1=\$$1:\$$2;
    fi;
}

##############################################################################
# Variable computation functions

# Sets SCALA_CLASSPATH to its default value.
compute_default_scala_classpath() {
    SCALA_CLASSPATH=".";
}

# Computes SCALA_CLASSPATH.
compute_scala_classpath() {
    if [ -z "$SCALA_CLASSPATH" ]; then
        if [ -n "$CLASSPATH" ]; then
            SCALA_CLASSPATH=`get_unix_pathlist "$CLASSPATH"`;
        else
            compute_default_scala_classpath;
        fi;
    fi;
}

# Sets SCALA_BOOTCLASSPATH to its default value.
compute_default_scala_bootclasspath() {
    eval SCALA_BOOTCLASSPATH="";
    append_path SCALA_BOOTCLASSPATH RUNTIME_CLASSES;
    append_path SCALA_BOOTCLASSPATH RUNTIME_SOURCES;
}


# Computes SCALA_BOOTCLASSPATH.
compute_scala_bootclasspath() {
    if [ -z "$SCALA_BOOTCLASSPATH" ]; then
        compute_default_scala_bootclasspath;
    fi;
}

# Computes variable $1.
compute_variable() {
    [ $# = 1 ] || abort "internal error";

    case "$1" in
        SCALA_CLASSPATH     ) compute_scala_classpath;;
        SCALA_BOOTCLASSPATH ) compute_scala_bootclasspath;;
        RUNTIME_SOURCES     ) configure_path_variable "$1";;
        RUNTIME_CLASSES     ) configure_path_variable "$1";;
        TOOLS_CLASSES       ) configure_path_variable "$1";;
        FJBG_CLASSES        ) configure_path_variable "$1";;
        MSIL_CLASSES        ) configure_path_variable "$1";;
        JAVA_EXEC           ) configure_variable "$1";;
        JAVA_ARGS           ) configure_variable "$1";;
        EXEC                ) configure_variable "$1";;
    esac;
}

##############################################################################
# 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
    compute_variable EXEC;
    compute_variable JAVA_EXEC;
    compute_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 TOOLS_CLASSES;
    append_path JAVA_CLASSPATH FJBG_CLASSES;
    append_path JAVA_CLASSPATH MSIL_CLASSES;

    # compute Scala classpath and bootclasspath
    compute_scala_classpath;
    compute_scala_bootclasspath;

    # invoke Java
    exec_java \
        -Dscala.class.path=`get_os_pathlist "$SCALA_CLASSPATH"` \
        -Dscala.boot.class.path=`get_os_pathlist "$SCALA_BOOTCLASSPATH"` \
        "$@";
}

# Starts a Java program using the Scala interprter. The given
# arguments are passed to exec_compile. They must, at least, contain
# the name of the main class.
exec_interpret() {
    [ $# -gt 0 ] || abort "internal error";

    # compute Java classpath
    # !!! this should not be needed
    append_path JAVA_CLASSPATH RUNTIME_CLASSES;

    # invoke Java
    exec_compile "$@";
}

# 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 RUNTIME_CLASSES;
    append_path JAVA_CLASSPATH TOOLS_CLASSES;

    # invoke Java
    exec_java \
        "$@";
}

# Starts a program using scalap. The given arguments are passed to
# exec_java. They must, at least, contain the name of the main class.
exec_scalap() {
    [ $# -gt 0 ] || abort "internal error";

    # compute Java classpath
    append_path JAVA_CLASSPATH RUNTIME_CLASSES;
    append_path JAVA_CLASSPATH TOOLS_CLASSES;

    # compute Scala classpath and bootclasspath
    compute_scala_classpath;
    compute_scala_bootclasspath;

    # 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 scalatest. The given arguments are passed to
# exec_java. They must, at least, contain the name of the main class.
exec_scalatest() {
    [ $# -gt 0 ] || abort "internal error";

    # compute Java classpath
    append_path JAVA_CLASSPATH TOOLS_CLASSES;

    # invoke Java
    exec_java \
        -Dscala.runtime=`get_os_pathlist "$RUNTIME_CLASSES"` \
        -Dscala.binpath=`get_os_pathlist "$PREFIX/bin"` \
        -Dscala.testpath=`get_os_pathlist "$PREFIX/test"` \
        "$@";
}

##############################################################################
# Implementation of scala-info

# Prints given error message, prints usage and exits with error code 1.
scala_info_abort() {
    error "$@";
    scala_info_print_usage 1>&2;
    exit 1;
}

# Prints value of $1.
scala_info_print_variable() {
    [ $# = 1 ] || abort "internal error";
    eval echo \"\$$1\";
}

# Prints default value of $1.
scala_info_print_variable_default() {
    [ $# = 1 ] || abort "internal error";
    case "$1" in
        SCALA_CLASSPATH     ) compute_default_scala_classpath;;
        SCALA_BOOTCLASSPATH ) compute_default_scala_bootclasspath;;
    esac;
    scala_info_print_variable "$1";
}

# Prints current value of $1.
scala_info_print_variable_current() {
    [ $# = 1 ] || abort "internal error";
    compute_variable "$1";
    scala_info_print_variable "$1";
}

# Implements "scala-info --home".
scala_info_option_home() {
    [ $# -gt 0 ] && abort "too many arguments";
    echo "$PREFIX";
}

# Implements "scala-info --$1 <variable>"
scala_info_option_x_variable() {
    [ $# -lt 2 ] && abort "missing variable name";
    [ $# -gt 2 ] && abort "too many arguments";
    case "$2" in
        CLASSPATH           ) variable=SCALA_$2;;
        BOOTCLASSPATH       ) variable=SCALA_$2;;
        RUNTIME_SOURCES     ) variable=$2;;
        RUNTIME_CLASSES     ) variable=$2;;
        TOOLS_CLASSES       ) variable=$2;;
        FJBG_CLASSES        ) variable=$2;;
        MSIL_CLASSES        ) variable=$2;;
        JAVA_EXEC           ) variable=$2;;
        JAVA_ARGS           ) variable=$2;;
        EXEC                ) variable=$2;;
        *                   ) abort "Unknown variable \`$2'";;
    esac;
    scala_info_print_variable_$1 $variable;
}

# Implements "scala-info --help".
scala_info_option_help() {
    echo "usage: $0 <option>";
    echo "where possible options include:";
    echo "  --home                Print Scala home directory";
    echo "  --default <variable>  Print default value of variable";
    echo "  --current <variable>  Print current value of variable";
    echo "  -? --help             Print this help message";
    echo "";
    echo "valid variables include:";
    echo "  CLASSPATH             Default classpath";
    echo "  BOOTCLASSPATH         Default bootclasspath";
    echo "  RUNTIME_SOURCES       Location of the Scala library sources";
    echo "  RUNTIME_CLASSES       Location of the Scala library";
    echo "  TOOLS_CLASSES         Location of the Scala tools";
    echo "  FJBG_CLASSES          Location of the fjbg library";
    echo "  MSIL_CLASSES          Location of the msil library";
    echo "  JAVA_EXEC             Command to start the Java VM";
    echo "  JAVA_ARGS             Additional arguments to pass to the Java VM";
    echo "  EXEC                  Command to start subprocesses";
}

# Entry point of scala-info.
scala_info() {
    [ $# = 0 ] && abort "missing option";

    case "$1" in
        --home      ) shift 1; scala_info_option_home "$@";;
        --default   ) shift 1; scala_info_option_x_variable default "$@";;
        --current   ) shift 1; scala_info_option_x_variable current "$@";;
        -? | --help ) shift 1; scala_info_option_help "$@";;
        -*          ) abort "unrecognised option \`$1'";;
        *           ) abort "illegal argument \`$1'";;
    esac;
}

##############################################################################
# Implementation of scala

# Returns true if the given arguments contain a Xbootclasspath: flag.
scala_has_bootclasspath() {
    while [ $# != 0 ]; do
        case "$1" in
            -Xbootclasspath:* ) return 0;;
            -cp | -classpath  ) shift 2;;
            -jar              ) return 1;;
            -*                ) shift 1;;
            *                 ) return 1;;
        esac;
    done;
    return 1;
}

# Entry point of scala-info.
scala() {
    compute_variable EXEC;
    if scala_has_bootclasspath "$@"; then
        $EXEC java "$@";
    else
        compute_variable RUNTIME_CLASSES;
        $EXEC java "-Xbootclasspath/a:$RUNTIME_CLASSES" "$@";
    fi;
}

##############################################################################
# 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      ) scala "$@";;
    scala-info ) scala_info "$@";;
    scalac*    ) exec_compile scalac.Main "$@";;
    scaladoc*  ) exec_compile scala.tools.scaladoc.Main "$@";;
    scalarun*  ) exec_interpret scala.tools.scalai.Main "$@";;
    scalaint*  ) exec_interpret scala.tools.scalai.Main -interactive "$@";;
    dtd2scala* ) exec_dtd2scala scala.tools.dtd2scala.Main "$@";;
    scalap*    ) exec_scalap scala.tools.scalap.Main "$@";;
    scalatest* ) exec_scalatest scala.tools.scalatest.Main "$@";;
    socos*     )
        warning "Deprecated command, use scalarun`expr "$SCRIPT" : 'socos\(.*\)'` instead.";
        exec_compile scalac.Main "$@";;
    surus*     )
        warning "Deprecated command, use scalarun`expr "$SCRIPT" : 'surus\(.*\)'` instead.";
        exec_compile scalai.Main "$@";;
    siris*     )
        warning "Deprecated command, use scalarun`expr "$SCRIPT" : 'siris\(.*\)'` instead.";
        exec_compile scalai.Main -interactive "$@";;
    *          ) abort "Don't know what to do for $SCRIPT.";;
esac;

##############################################################################