# *************************************************************
#
#  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 test -z "${SOLARENV}"; then
    if test -f ./source_soenv.sh; then . ./source_soenv.sh; fi
fi
if test -z "${SOLARENV}"; then
    echo "bootstrap: No environment set!"
    exit 1
fi

# remove aliases set by *Env.Set.sh
unalias mkout
unalias deliver
unalias build
unalias build_client
unalias zipdep
unalias nmake
unalias gunzip

# executables are *.exe for WNT. This variable is necessary since Cygwin 1.5.x
# Use spawn instead of fork when building dmake on cygwin.
if test "$GUI" = "WNT"; then
    EXEEXT=".exe"
else
    EXEEXT=""
fi
export EXEEXT

mkdir -p "$SOLARENV/$INPATH/bin"

#make sure build.pl is executable

chmod +x "$SRC_ROOT/solenv/bin/build.pl"
chmod +x "$SRC_ROOT/solenv/bin/build_client.pl"
chmod +x "$SRC_ROOT/solenv/bin/zipdep.pl"
chmod +x "$SRC_ROOT/solenv/bin/gccinstlib.pl"

# fetch or update external tarballs
if [ "$DO_FETCH_TARBALLS" = "yes" ]; then
# check perl include locations
    "$PERL" -e 'print "\nInclude locations: @INC\n\n"';
    "$PERL" "$SOLARENV/bin/download_external_dependencies.pl" $SRC_ROOT/external_deps.lst
    if [ "$?" != "0" ]; then
        echo "*** Error downloading external dependencies, please fix the previous problems and try again ***"
        exit 1
    fi
fi

# ------------------------------------------------------------------------------
# Build dmake

if test -n "$DMAKE_URL" -a  ! -x "$SOLARENV/$INPATH/bin/dmake$EXEEXT"; then

    # Assume that the dmake archive has been downloaded
    # Determine the name of the downloaded file.
    dmake_package_name=`echo $DMAKE_URL | sed "s/^\(.*\/\)//"`

    tmp_build_dir="$SOLARENV/$INPATH/misc/build/"
    echo "making and entering $tmp_build_dir"
    # Clean up any residues from a previous and unsuccessful build.
    rm -rf "$tmp_build_dir"
    mkdir -p "$tmp_build_dir"
    cd "$tmp_build_dir" || exit

    dmake_full_package_name=$(find $TARFILE_LOCATION -type f -name "*-$dmake_package_name")
    if [ -z "$dmake_full_package_name" ]; then
        echo "can not find the dmake package"
        exit
    fi
    if test "$GUI" = "WNT"; then
        dmake_full_package_name=`cygpath -u "$dmake_full_package_name"`
    fi
    echo "unpacking $dmake_full_package_name"

    # Unpack it.
    case $dmake_package_name in
        *.tar.gz)
            tar -xzf "$dmake_full_package_name"
            dmake_directory_name=`echo $dmake_package_name | sed "s/\(\.tar.gz\)//"`
            ;;
        *.tgz)
            tar -xzf "$dmake_full_package_name"
            dmake_directory_name=`echo $dmake_package_name | sed "s/\(\.tgz\)//"`
            ;;
        *.tar.bz2)
            tar -xjf "$dmake_full_package_name"
            dmake_directory_name=`echo $dmake_package_name | sed "s/\(\.tar.bz2\)//"`
            ;;
        *.zip)
            unzip "$dmake_full_package_name"
            dmake_directory_name=`echo $dmake_package_name | sed "s/\(\.zip\)//"`
            ;;
        *)
            echo "can not unpack the dmake source"
            dmake_directory_name=
            exit 1
            ;;
    esac

    echo "entering $dmake_directory_name"
    cd "$dmake_directory_name" || exit

    # Special case! The w32/tcsh build needs CC pointing to the MSVC++ compiler
    # but we need a cygwin/gcc build dmake to understand the posix paths
    if test "$GUI" = "WNT"; then
        CC=""
        CXX=""
        export CC
        export CXX
        DMAKE_CONF="--enable-spawn"
    else
        DMAKE_CONF=""
    fi

    # For unixy systems
    if test -f "Makefile" ; then
        $GNUMAKE distclean || exit
    fi

    # config.guess and config.sub for dmake are too old, overwrite with ours:
    cp $SOLARSRC/config.guess .
    cp $SOLARSRC/config.sub .

    ./configure $DMAKE_CONF || exit

    ## invoke the gnu make command set by configure.
    $GNUMAKE || exit


    # Deploy the dmake executable to solenv
    cp -f "$tmp_build_dir/$dmake_directory_name/dmake$EXEEXT" "$SOLARENV/$INPATH/bin/dmake$EXEEXT" || exit
    echo ""
    echo "dmake successfully built and copied to $SOLARENV/$INPATH/bin/dmake$EXEEXT"
    echo ""

    # Clean up. Note that this is skipped when one of the exits is executed above.
    rm -rf "$tmp_build_dir"

elif test "$IS_SYSTEM_DMAKE" = "YES"; then

    echo ""
    echo "dmake is located in search path"
    echo ""

elif test -n "$DMAKE_PATH" -a -x "$DMAKE_PATH" -a  ! -x "$SOLARENV/$INPATH/bin/dmake$EXEEXT"; then

    cp -f "$DMAKE_PATH" "$SOLARENV/$INPATH/bin/dmake$EXEEXT" || exit

    echo ""
    echo "dmake copied to $SOLARENV/$INPATH/bin/dmake$EXEEXT"
    echo ""

else

    if test -x "$SOLARENV/$INPATH/bin/dmake$EXEEXT"; then
        echo ""
        echo "dmake present in $SOLARENV/$INPATH/bin/dmake$EXEEXT"
    fi

fi

# Download missing extensions.
"$PERL" "$SOLARENV/bin/download_missing_extensions.pl"
