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

die() {
    echo "$@" 1>&2 ; exit 1
}

arg () {
    echo "$1" | sed "s/^${2-[^=]*=}//" | sed "s/:/;/g"
}

# Detect directory information.
source_dir=`cd "\`dirname \"$0\"\`";pwd`
binary_dir=`pwd`

# Choose the default install prefix.
default_prefix="/usr/local/hawq"

# Choose the default dependency install prefix
default_dependency=${DEPENDENCY_INSTALL_PREFIX}

if [ x"${default_dependency}" = x"" ]; then
    default_dependency=${default_prefix}
fi

# Display bootstrap usage
usage() {
echo '
Usage: '"$0"' [<options>]
Options: [defaults in brackets after descriptions]
Configuration:
    --help                          print this message
    --prefix=PREFIX                 install files in tree rooted at PREFIX
                                    ['"${default_prefix}"']
    --dependency=DIRs               specify the dependencies at DIRs, separated by colon 
                                    ['"${default_dependency}"']
    --enable-debug                  enable debug build
    --enable-boost                  force to enable boost
    --enable-coverage               enable build with code coverage support
    --enable-libc++                 using libc++ instead of libstdc++, only valid for clang compiler
    
Dependencies:
    c/c++ compiler
    GNU make
    cmake           http://www.cmake.org/
    protobuf        https://code.google.com/p/protobuf/
    kerberos        http://web.mit.edu/kerberos/
    libgsasl        http://www.gnu.org/software/gsasl/
    libxml2         http://xmlsoft.org/
    libuuid         http://sourceforge.net/projects/libuuid/
    boost 1.53+     http://www.boost.org/
                    [boost is not required if c++ compiler is g++ 4.6.0+ or clang++ with stdc++]

Example:
    mkdir build
    cd build
    ../bootstrap --prefix=/path/to/install --dependency=/path/to/protobuf:/path/to/kerberos/:path/to/others
    make
    make install                  
'
    exit 10
}

# Parse arguments
prefix_dirs="${default_prefix}"
dependency_dir="${default_dependency}"
build_type="Release"
enable_boost="OFF"
enable_coverage="OFF"
enable_clang_lib="OFF"
while test $# != 0; do
    case "$1" in
    --prefix=*) dir=`arg "$1"`
                prefix_dirs="$dir";;
    --dependency=*) dir=`arg "$1"`
                dependency_dir="$dir";;
    --enable-debug) enable_build="ON";;
    --enable-boost) enable_boost="ON";;
    --enable-coverage) enable_coverage="ON";;
    --enable-libc++) enable_clang_lib="ON";;
    --help) usage ;;
    *) die "Unknown option: $1" ;;
    esac
    shift
done

if [ ${source_dir} = ${binary_dir} ]; then
    die "cannot build the project in the source directory! Out-of-source build is enforced!"
fi

# Check clang compiler
if [[ x"${CC}" = x"" ]]; then
    CC=gcc
fi

if [[ x"${CXX}" = x"" ]]; then
    CXX=g++
fi

c_compiler=`which ${CC}`
cxx_compiler=`which ${CXX}`
cmake=`which cmake`

if [[ ! -x ${c_compiler} ]]; then
    die "cannot found c compiler"
fi

if [[ ! -x ${cxx_compiler} ]]; then
    die "cannot found cplusplus compiler"
fi

if [[ ! -x ${cmake} ]]; then
    die "cannot found cmake"
fi

# Configure 
${cmake} -DENABLE_DEBUG=${enable_build} -DCMAKE_INSTALL_PREFIX=${prefix_dirs} \
    -DCMAKE_C_COMPILER=${c_compiler} -DCMAKE_CXX_COMPILER=${cxx_compiler} \
    -DCMAKE_PREFIX_PATH=${dependency_dir} -DENABLE_BOOST=${enable_boost} \
    -DENABLE_COVERAGE=${enable_coverage} -DENABLE_LIBCPP=${enable_clang_lib} ${source_dir} \
    || die "failed to configure the project"

echo 'bootstrap success. Run "make" to build.'
