# Copyright 2016 The Fuchsia Authors. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1.  Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
# 2.  Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

usage() { echo "$0 usage:" && grep " .)\ #" $0; exit 0; }

script_dir=$(dirname $BASH_SOURCE)
script_dir=`cd $script_dir; pwd`
clean_build=false
clean_cmake=false
os_name=`uname`

default_fuchsia_root=`cd ../../../..;pwd`

if [ x$build_tag == x ] ; then
  build_tag="debug"
fi

case $os_name in
Linux)
    N=`cat /proc/cpuinfo | grep processor | wc -l`
    PARALLEL=-j`expr $N + $N`
    toolchain_suffix=linux
    buildtools_prefix=""
    ;;
Darwin)
    PARALLEL=-j`sysctl -n hw.ncpu`
    toolchain_suffix=darwin
    buildtools_prefix="/mac"
    ;;
*)
    PARALLEL=-j8
    ;;
esac

: ${FUCHSIA_ROOT=$default_fuchsia_root} && export FUCHSIA_ROOT
: ${FUCHSIA_BUILDTOOLS=$FUCHSIA_ROOT/buildtools$buildtools_prefix} && export FUCHSIA_BUILDTOOLS
: ${FUCHSIA_TOOLCHAIN=$FUCHSIA_ROOT/buildtools/toolchain/clang+llvm-x86_64-$toolchain_suffix} && export FUCHSIA_TOOLCHAIN
: ${FUCHSIA_SYSROOT=$FUCHSIA_ROOT/out/build-zircon/build-x86/sysroot} && export FUCHSIA_SYSROOT
: ${ZIRCON_ROOT=$FUCHSIA_ROOT/zircon} && export ZIRCON_ROOT
: ${ZIRCON_TOOLCHAINS=$HOME/projects/zircon_toolchains} && export ZIRCON_TOOLCHAINS
: ${WEBKIT_ROOT=$FUCHSIA_ROOT/third_party/webkit} && export WEBKIT_ROOT
: ${ZIRCON_GCC_DIR=$FUCHSIA_ROOT/zircon/prebuilt/downloads/x86_64-elf-6.2.0-$os_name-x86_64/bin} && export ZIRCON_GCC_DIR
: ${ZIRCON_STRIP=$FUCHSIA_ROOT/zircon/prebuilt/downloads/x86_64-elf-6.2.0-$os_name-x86_64/bin/x86_64-elf-strip} && export ZIRCON_STRIP
: ${ZIRCON_MKBOOTFS=$FUCHSIA_ROOT/zircon/build-x86/tools/mkbootfs} && export ZIRCON_MKBOOTFS
: ${FUCHSIA_OUT_DIR=$FUCHSIA_ROOT/out} && export FUCHSIA_OUT_DIR
: ${FUCHSIA_ARCH_OUT_DIR=$FUCHSIA_OUT_DIR/$build_tag-x86-64} && export FUCHSIA_ARCH_OUT_DIR
: ${WM_DEPS_SOURCE_DIR=$FUCHSIA_OUT_DIR/wmdepsrc} && export WM_DEPS_SOURCE_DIR
: ${FUCHSIA_CROSS_ROOT=$FUCHSIA_ARCH_OUT_DIR/wmdeps} && export FUCHSIA_CROSS_ROOT

declare -x PATH=$FUCHSIA_BUILDTOOLS/cmake/bin:$PATH
case $os_name in
Linux)
    declare -x PATH=$FUCHSIA_BUILDTOOLS:$PATH
    ;;
Darwin)
    declare -x PATH=$FUCHSIA_BUILDTOOLS/mac:$PATH
    ;;
*)
    ;;
esac

maybe_clean_webkit()
{
  if [ $clean_cmake == true ] ; then
    rm -rf $WEBKIT_BUILD/CMake*
  fi
  if [ $clean_build == true ] ; then
    rm -rf $WEBKIT_BUILD
  fi
}

declare -x PATH="$PATH:/usr/local/bin"
