#!/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 falcon-mxmlc.jar on OSX, Unix, or Cygwin.
# In Windows Command Prompt, use mxmlc.bat instead.
#

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

echo Using Falcon codebase: $FALCON_HOME

if [ "x${FLEX_HOME}" = "x" ]
then
    FLEX_HOME=${FALCON_HOME}/generated/dist/sdk
fi
echo Using Flex SDK: $FLEX_HOME

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

D32=''

if [ $OS = "Windows" ]; then

	FALCON_HOME=`cygpath -m $FALCON_HOME`
	FLEX_HOME=`cygpath -m $FLEX_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 -Dflexcompiler="$FALCON_HOME" -Dflexlib="$FLEX_HOME/frameworks" -jar "$SCRIPT_HOME/../lib/mxmlc.jar" +flexlib="$FLEX_HOME/frameworks" "$@"
