#!/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.
#  
###############################################################

# if no environment is set, try to find one, and source it
# user can override auto-detection via SOLAR_SHELL_ENVIRONMENT
# it is not currently possible to handle corner cases like you have an
# AMD64 linux box, create configure environments for both x86 and x86_64,
# and then expect to auto-detect both.
# use SOLAR_SHELL_ENVIRONMENT in such cases.

me=source_soenv.sh

if test -n "${SOLARENV}"; then
    echo "$me: error: only call this if you do not have an environment set!"
    exit 1
fi

if test -n "${SOLAR_SHELL_ENVIRONMENT}"; then
    if test -f "${SOLAR_SHELL_ENVIRONMENT}"; then
        . "${SOLAR_SHELL_ENVIRONMENT}"
    else
        echo "$me: error: \$SOLAR_SHELL_ENVIRONMENT set, but the file does not exist"
        exit 1
    fi
else
    config_guess_result=`./config.guess`
    case "${config_guess_result}" in
        i[3456]86-*-solaris*)
            . ./SolarisX86Env.Set.sh
        ;;
        sparc-*-solaris*)
            . ./SolarisSparcEnv.Set.sh
        ;;
        i[3456]86-*-linux*)
            . ./LinuxX86Env.Set.sh
        ;;
        x86_64-*-linux*)
            . ./LinuxX86-64Env.Set.sh
        ;;
        ia64-*-linux*)
            . ./LinuxIA64Env.Set.sh
        ;;
        sparc-*-linux*)
            . ./LinuxSparcEnv.Set.sh
        ;;
        powerpc-*-linux*)
            . ./LinuxPPCEnv.Set.sh
        ;;
        powerpc64-*-linux*)
            . ./LinuxPPC64Env.Set.sh
        ;;
        s390-*-linux*)
            . ./LinuxS390Env.Set.sh
        ;;
        s390x-*-linux*)
            . ./LinuxS390XEnv.Set.sh
        ;;
        m68k-*-linux*)
            . ./LinuxM68KEnv.Set.sh
        ;;
        hppa-*-linux*)
            . ./LinuxHPPAEnv.Set.sh
        ;;
        alpha-*-linux*)
            . ./LinuxAlphaEnv.Set.sh
        ;;
        arm*-*-linux*)
            . ./LinuxARMEnv.Set.sh
        ;;
        mips-*-linux*)
            . ./LinuxMIPSEnv.Set.sh
        ;;
        i386-*-freebsd*)
            . ./FreeBSDX86Env.Set.sh
        ;;
        amd64-*-freebsd*|x86_64-*-freebsd*)
            . ./FreeBSDAMDEnv.Set.sh
        ;;
        arm*-*-freebsd*)
            . ./FreeBSDARMEnv.Set.sh
        ;;
        powerpc-*-freebsd*)
            . ./FreeBSDPPCEnv.Set.sh
        ;;
        powerpc64-*-freebsd*)
            . ./FreeBSDPPC64Env.Set.sh
        ;;
        # the result here (whether you get x86_64) seems to depend on $CC...
        i[3456]86-*-darwin*|x86_64-*-darwin*)
            . ./MacOSXX64Env.Set.sh
        ;;
        powerpc-*-darwin*)
            . ./MacOSXPPCEnv.Set.sh
        ;;
        *-cygwin*)
            . ./winenv.set.sh || . ./winmingw.set.sh
        ;;
        *)
            echo "$me: error: unknown *Env.Set.sh for: ${config_guess_result}"
            exit 1
        ;;
    esac
fi
if test -z "${SOLARENV}"; then
    echo "$me: error: No environment set!"
    exit 1
fi

