#!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`
case "${osname}" in
  SunOS )
    # 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

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

    # File creation mask
    umask 002
    ;;

  Linux | Darwin )
    # Add basic paths
    path4sdk=/usr/bin:/bin:/usr/sbin:/sbin

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

    umask 002
    ;;

  FreeBSD | OpenBSD )
    # Add basic paths
    path4sdk=/usr/bin:/bin:/usr/sbin:/sbin

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

    umask 002
    ;;

  NetBSD )
    # Add basic paths
    path4sdk=/usr/bin:/bin:/usr/sbin:/sbin

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

    umask 002
    ;;

  * )
    # 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
    ;;
esac

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

