# 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-magenta/build-magenta-pc-x86-64/sysroot} && export FUCHSIA_SYSROOT
: ${MAGENTA_ROOT=$FUCHSIA_ROOT/magenta} && export MAGENTA_ROOT
: ${MAGENTA_TOOLCHAINS=$HOME/projects/magenta_toolchains} && export MAGENTA_TOOLCHAINS
: ${WEBKIT_ROOT=$FUCHSIA_ROOT/third_party/webkit} && export WEBKIT_ROOT
: ${MAGENTA_GCC_DIR=$FUCHSIA_ROOT/magenta/prebuilt/downloads/x86_64-elf-6.2.0-$os_name-x86_64/bin} && export MAGENTA_GCC_DIR
: ${MAGENTA_STRIP=$FUCHSIA_ROOT/magenta/prebuilt/downloads/x86_64-elf-6.2.0-$os_name-x86_64/bin/x86_64-elf-strip} && export MAGENTA_STRIP
: ${MAGENTA_MKBOOTFS=$FUCHSIA_ROOT/magenta/build-magenta-pc-x86-64/tools/mkbootfs} && export MAGENTA_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"
