#!echo "This is not a shell script"
#############################################################################
# Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#############################################################################
#
# JPRT shell configuration for testing.
#
# Input environment variables:
#    Windows Only:
#      PATH
#      ROOTDIR
#
# Output variable settings:
#    make    Full path to GNU make
#
# Output environment variables:
#    PATH
#
#############################################################################

#############################################################################
# Error
error() # message
{
  echo "ERROR: $1"
  exit 6
}
# Directory must exist
dirMustExist() # dir name
{
  if [ ! -d "$1" ] ; then
    error "Directory for $2 does not exist: $1"
  fi
}
# File must exist
fileMustExist() # dir name
{
  if [ ! -f "$1" ] ; then
    error "File for $2 does not exist: $1"
  fi
}
#############################################################################

# Should be set by JPRT as the 3 basic inputs
slashjava="${ALT_SLASH_JAVA}"
if [ "${slashjava}" = "" ] ; then
  slashjava=/java
fi

# Check input
dirMustExist "${slashjava}"  ALT_SLASH_JAVA

# Uses 'uname -s', but only expect SunOS or Linux, assume Windows otherwise.
osname=`uname -s`
if [ "${osname}" = SunOS ] ; then
   
    # SOLARIS: Sparc or X86
    osarch=`uname -p`
    if [ "${osarch}" = sparc ] ; then
	solaris_arch=sparc
    else
	solaris_arch=i386
    fi

    # Add basic solaris system paths
    path4sdk=/usr/bin:/usr/gnu/bin

    # Find GNU make
    make=/usr/bin/gmake
    if [ ! -f ${make} ] ; then
	make=${slashjava}/devtools/${solaris_arch}/bin/gnumake
    fi
    fileMustExist "${make}" make

    # File creation mask
    umask 002

elif [ "${osname}" = Linux ] ; then
   
    # Add basic paths
    path4sdk=/usr/bin:/bin:/usr/sbin:/sbin

    # Find GNU make
    make=/usr/bin/make
    fileMustExist "${make}" make

    umask 002

else

    # Windows: Differs on CYGWIN vs. MKS.
   
    # We need to determine if we are running a CYGWIN shell or an MKS shell
    #    (if uname isn't available, then it will be unix_toolset=unknown)
    unix_toolset=unknown
    if [ "`uname -a | fgrep Cygwin`" = "" -a -d "${ROOTDIR}" ] ; then
        # We kind of assume ROOTDIR is where MKS is and it's ok
        unix_toolset=MKS
        mkshome=`dosname -s "${ROOTDIR}"`
        # Most unix utilities are in the mksnt directory of ROOTDIR
        unixcommand_path="${mkshome}/mksnt"
        path4sdk="${unixcommand_path}"
	devtools_path="${slashjava}/devtools/win32/bin"
	path4sdk="${devtools_path};${path4sdk}"
        # Find GNU make
        make="${devtools_path}/gnumake.exe"
        fileMustExist "${make}" make
    elif [ "`uname -a | fgrep Cygwin`" != "" -a -f /bin/cygpath ] ; then
        # For CYGWIN, uname will have "Cygwin" in it, and /bin/cygpath should exist
        unix_toolset=CYGWIN
        # Most unix utilities are in the /usr/bin
        unixcommand_path="/usr/bin"
        path4sdk="${unixcommand_path}"
        # Find GNU make
        make="${unixcommand_path}/make.exe"
        fileMustExist "${make}" make
    else
      echo "WARNING: Cannot figure out if this is MKS or CYGWIN"
    fi

    
    # For windows, it's hard to know where the system is, so we just add this
    #    to PATH.
    slash_path="`echo ${path4sdk} | sed -e 's@\\\\@/@g' -e 's@//@/@g' -e 's@/$@@' -e 's@/;@;@g'`"
    path4sdk="${slash_path};${PATH}"
    
    # Convert path4sdk to cygwin style
    if [ "${unix_toolset}" = CYGWIN ] ; then
	path4sdk="`/usr/bin/cygpath -p ${path4sdk}`"
    fi

fi

# Export PATH setting
PATH="${path4sdk}"
export PATH

