# 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_tag-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"
