#!echo "This is not a shell script"
#############################################################################
# Copyright 2006-2007 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
# CA 95054 USA or visit www.sun.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/ccs/bin:/usr/ccs/lib:/usr/bin:/bin:/usr/sfw/bin

    # Find GNU make
    make=/usr/sfw/bin/gmake
    if [ ! -f ${make} ] ; then
	make=/opt/sfw/bin/gmake
	if [ ! -f ${make} ] ; then
	    make=${slashjava}/devtools/${solaris_arch}/bin/gnumake
        fi 
    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

