#!/bin/bash

function exportVar {
  NAME=$1
  VALUE=$2
  echo export $NAME=\"$VALUE\"
  export $NAME="$VALUE"
}

function setenv {
  if [ -z "$1" ]; then
    echo "ERROR: setenv() requires one argument."
    exit 1
  fi
  if [ -z "${NACL_SDK_ROOT}" ]; then
    echo "ERROR: This script requires NACL_SDK_ROOT to be set."
    exit 1
  fi

  ARCH_WIDTH=$1
  if [ ${ARCH_WIDTH} = "32" ]; then
    ARCH_TYPE=x86
    CROSS_ID=i686
  elif [ ${ARCH_WIDTH} = "64" ]; then
    ARCH_TYPE=x86_64
    CROSS_ID=x86_64
  else
    echo "ERROR: Unknown arch width: ${ARCH_WIDTH}"
    exit 1
  fi

  OS_NAME=$(uname -s)
  if [ $OS_NAME = "Darwin" ]; then
    OS_SUBDIR="mac"
    OS_SUBDIR_SHORT="mac"
    OS_JOBS=4
  elif [ $OS_NAME = "Linux" ]; then
    OS_SUBDIR="linux"
    OS_SUBDIR_SHORT="linux"
    OS_JOBS=4
  else
    OS_SUBDIR="windows"
    OS_SUBDIR_SHORT="win"
    OS_JOBS=1
  fi

  NACL_TOOLCHAIN_ROOT=${NACL_SDK_ROOT}/toolchain/${OS_SUBDIR_SHORT}_x86_newlib
  NACL_BIN_PATH=${NACL_TOOLCHAIN_ROOT}/bin
  export NACL_CROSS_PREFIX=${CROSS_ID}-nacl

  if [[ -z "$NACL_MAKE_CCACHE" ]]; then
    exportVar NACLCC ${NACL_BIN_PATH}/${NACL_CROSS_PREFIX}-gcc
    exportVar NACLCXX ${NACL_BIN_PATH}/${NACL_CROSS_PREFIX}-g++
  else
    exportVar NACLCC "${NACL_MAKE_CCACHE} ${NACL_BIN_PATH}/${NACL_CROSS_PREFIX}-gcc"
    exportVar NACLCXX "${NACL_MAKE_CCACHE} ${NACL_BIN_PATH}/${NACL_CROSS_PREFIX}-g++"
  fi
  exportVar NACLAR ${NACL_BIN_PATH}/${NACL_CROSS_PREFIX}-ar
  exportVar NACLRANLIB ${NACL_BIN_PATH}/${NACL_CROSS_PREFIX}-ranlib
  exportVar NACLLD ${NACL_BIN_PATH}/${NACL_CROSS_PREFIX}-ld
  exportVar NACLSTRINGS ${NACL_BIN_PATH}/${NACL_CROSS_PREFIX}-strings
  exportVar NACLSTRIP ${NACL_BIN_PATH}/${NACL_CROSS_PREFIX}-strip

  exportVar CC "${NACLCC}"
  exportVar CXX "${NACLCXX}"
  exportVar AR "${NACLAR}"
  exportVar RANLIB "${NACLRANLIB}"
  exportVar PATH ${NACL_BIN_PATH}:${PATH};
  exportVar C_INCLUDE_PATH "${NACL_SDK_ROOT}/include:${NACL_SDK_ROOT}/ports/include:${C_INCLUDE_PATH}"
  exportVar CPLUS_INCLUDE_PATH "${NACL_SDK_ROOT}/include:${NACL_SDK_ROOT}/ports/include:${CPLUS_INCLUDE_PATH}"
  exportVar GYP_DEFINES \
      "skia_os=nacl skia_gpu=0 skia_arch_width=${ARCH_WIDTH} skia_arch_type=${ARCH_TYPE}"
}

function build {
  if [ -z "$1" ]; then
    echo "ERROR: build() requires one argument."
    exit 1
  fi
  setenv $1

  export SKIA_OUT=out/nacl$1
  make ${MAKE_ARGS}
}

MAKE_ARGS=""

while (( "$#" )); do
  if [[ "$1" == "--use-ccache" ]];
  then
    if [[ -z "$NACL_MAKE_CCACHE" ]];
    then
      NACL_MAKE_CCACHE=$(which ccache)
    fi
  elif [ -z "${MAKE_ARGS}" ]; then
    MAKE_ARGS="$1"
  else
    MAKE_ARGS="${MAKE_ARGS} $1"
  fi
  shift
done

if [[ -n "$NACL_MAKE_CCACHE" ]]; then
  $NACL_MAKE_CCACHE --version &> /dev/null
  if [[ "$?" != "0" ]]; then
    echo "Unable to find ccache!"
    exit 1
  fi
fi

build 32 && \
build 64 && \
if ! [ -L platform_tools/nacl/out ]; then
  ln -s ../../out platform_tools/nacl
fi
