#!/bin/sh

################################################################################
##
##  Licensed to the Apache Software Foundation (ASF) under one or more
##  contributor license agreements.  See the NOTICE file distributed with
##  this work for additional information regarding copyright ownership.
##  The ASF licenses this file to You under the Apache License, Version 2.0
##  (the "License"); you may not use this file except in compliance with
##  the License.  You may obtain a copy of the License at
##
##      http://www.apache.org/licenses/LICENSE-2.0
##
##  Unless required by applicable law or agreed to in writing, software
##  distributed under the License is distributed on an "AS IS" BASIS,
##  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
##  See the License for the specific language governing permissions and
##  limitations under the License.
##
################################################################################


#
# mxmlc shell script to launch compiler-mxmlc.jar on OSX, Unix, or Cygwin.
# In Windows Command Prompt, use mxmlc.bat instead.
#

if [ "x${ROYALE_COMPILER_HOME}" = "x" ]
then
    SCRIPT_HOME=`dirname "$0"`
    ROYALE_COMPILER_HOME=${SCRIPT_HOME}/../../compiler
fi

echo Using Royale codebase: $ROYALE_COMPILER_HOME

if [ "x${ROYALE_HOME}" = "x" ]
then
    ROYALE_HOME=${ROYALE_COMPILER_HOME}/generated/dist/sdk
fi
echo Using Royale SDK: $ROYALE_HOME

case `uname` in
		CYGWIN*)
			OS="Windows"
		;;
		*)
			OS=Unix
esac

D32=''

if [ $OS = "Windows" ]; then

	ROYALE_COMPILER_HOME=`cygpath -m $ROYALE_COMPILER_HOME`
	ROYALE_HOME=`cygpath -m $ROYALE_HOME`

elif [ $OS = "Unix" ]; then

    check64="`java -version 2>&1 | grep -i 64-Bit`"
    isOSX="`uname | grep -i Darwin`"
    javaVersion="`java -version 2>&1 | awk -F '[ ".]+' 'NR==1 {print $3 "." $4}'`"
    
    if [ "$isOSX" != "" -a "$HOSTTYPE" = "x86_64" -a "$check64" != "" -a "$javaVersion" = "1.6" ]; then
        D32='-d32'
    fi	
fi

VMARGS="-Xmx384m -Dsun.io.useCanonCaches=false "

java $VMARGS $D32 $SETUP_SH_VMARGS -Droyalecompiler="$ROYALE_COMPILER_HOME" -Droyalelib="$ROYALE_HOME/frameworks" -jar "$SCRIPT_HOME/../lib/mxmlc.jar" +royalelib="$ROYALE_HOME/frameworks" "$@"
