#!/usr/bin/env bash
# Copyright 2016 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly ROOT_DIR="$(dirname "${SCRIPT_DIR}")"

readonly HOST_ARCH=$(uname -m)
readonly HOST_OS=$(uname | tr '[:upper:]' '[:lower:]')
readonly HOST_TRIPLE="${HOST_ARCH}-${HOST_OS}"

readonly CMAKE_PROGRAM=${CMAKE_PROGRAM:-${ROOT_DIR}/buildtools/cmake/bin/cmake}

JOBS=`getconf _NPROCESSORS_ONLN` || {
  Cannot get number of processors
  exit 1
}

readonly CMAKE_HOST_TOOLS="\
  -DCMAKE_MAKE_PROGRAM=${ROOT_DIR}/buildtools/ninja \
  -DCMAKE_C_COMPILER=${ROOT_DIR}/buildtools/toolchain/clang+llvm-${HOST_TRIPLE}/bin/clang \
  -DCMAKE_CXX_COMPILER=${ROOT_DIR}/buildtools/toolchain/clang+llvm-${HOST_TRIPLE}/bin/clang++ \
  -DCMAKE_AR=${ROOT_DIR}/buildtools/toolchain/clang+llvm-${HOST_TRIPLE}/bin/llvm-ar \
  -DCMAKE_NM=${ROOT_DIR}/buildtools/toolchain/clang+llvm-${HOST_TRIPLE}/bin/llvm-nm \
  -DCMAKE_RANLIB=${ROOT_DIR}/buildtools/toolchain/clang+llvm-${HOST_TRIPLE}/bin/llvm-ranlib \
  -DCMAKE_OBJDUMP=${ROOT_DIR}/buildtools/toolchain/clang+llvm-${HOST_TRIPLE}/bin/llvm-objdump \
  -DCMAKE_OBJCOPY=false \
  -DCMAKE_STRIP=false"

readonly CMAKE_SHARED_FLAGS="\
  -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \
  -DCMAKE_INSTALL_PREFIX='' \
  -DCMAKE_TOOLCHAIN_FILE=${ROOT_DIR}/third_party/llvm/cmake/platforms/Fuchsia.cmake \
  -DLLVM_PATH=${ROOT_DIR}/third_party/llvm \
  -DLLVM_ENABLE_LIBCXX=ON"

set -eo pipefail; [[ "${TRACE}" ]] && set -x

usage() {
  printf >&2 '%s: [-c] [-r] [-t target] [-o outdir] [-d destdir]\n' "$0" && exit 1
}

build() {
  local target="$1" outdir="$2" destdir="$3" clean="$4" release="$5"
  local sysroot="${destdir}/${target}-fuchsia"
  local magenta_buildroot="${outdir}/build-magenta"

  if [[ "${clean}" = "true" ]]; then
    rm -rf -- "${magenta_buildroot}" "${outdir}/build-libunwind-${target}" "${outdir}/build-libcxxabi-${target}" "${outdir}/build-libcxx-${target}"
  fi

  case "${target}" in
    "x86_64") local magenta_target="magenta-pc-x86-64" ;;
    "aarch64") local magenta_target="magenta-qemu-arm64" ;;
    "*") echo "unknown target '${target}'" 1>&2 && exit 1;;
  esac

  local magenta_sysroot="${magenta_buildroot}/build-${magenta_target}/sysroot"

  if [[ "${release}" = "true" ]]; then
    local cmake_build_type_flags="${CMAKE_SHARED_FLAGS:-} -DCMAKE_BUILD_TYPE=Release"
    local magenta_build_type_flags="DEBUG=0"
  else
    local cmake_build_type_flags="${CMAKE_SHARED_FLAGS:-} -DCMAKE_BUILD_TYPE=Debug"
    local magenta_build_type_flags=""
  fi

  rm -rf -- "${sysroot}" && mkdir -p -- "${sysroot}"

  pushd "${ROOT_DIR}/magenta"
  rm -rf -- "${magenta_sysroot}"
  # build the sysroot for the target architecture
  make -j ${JOBS} ${magenta_build_type_flags:-} BUILDROOT=${magenta_buildroot} ${magenta_target} BUILDDIR_SUFFIX=
  # build host tools
  make -j ${JOBS} BUILDDIR=${outdir}/build-magenta tools
  popd

  cp -r -- \
    "${magenta_sysroot}/include" \
    "${magenta_sysroot}/lib" \
    "${sysroot}"

  if [[ -d "${magenta_sysroot}/debug-info" ]]; then
    cp -r -- \
      "${magenta_sysroot}/debug-info" \
      "${sysroot}"
  fi

  local libgcc_file_name="$(${ROOT_DIR}/buildtools/toolchain/clang+llvm-${HOST_TRIPLE}/bin/clang --target=${target}-fuchsia -print-libgcc-file-name)"

  mkdir -p -- "${outdir}/build-libunwind-${target}"
  pushd "${outdir}/build-libunwind-${target}"
  [[ -f "${outdir}/build-libunwind-${target}/build.ninja" ]] || CXXFLAGS="-I${ROOT_DIR}/third_party/llvm/runtimes/libcxx/include" ${CMAKE_PROGRAM} -GNinja \
    ${CMAKE_HOST_TOOLS:-} \
    ${CMAKE_SHARED_FLAGS:-} \
    ${cmake_build_type_flags:-} \
    -DCMAKE_EXE_LINKER_FLAGS="-nodefaultlibs -lc" \
    -DCMAKE_SHARED_LINKER_FLAGS="${libgcc_file_name}" \
    -DLIBUNWIND_ENABLE_SHARED=ON \
    -DLIBUNWIND_ENABLE_STATIC=ON \
    -DLIBUNWIND_TARGET_TRIPLE="${target}-fuchsia" \
    -DLIBUNWIND_SYSROOT="${sysroot}" \
    ${ROOT_DIR}/third_party/llvm/runtimes/libunwind
  env DESTDIR="${sysroot}" ${ROOT_DIR}/buildtools/ninja install
  popd

  mkdir -p -- "${outdir}/build-libcxxabi-${target}"
  pushd "${outdir}/build-libcxxabi-${target}"
  [[ -f "${outdir}/build-libcxxabi-${target}/build.ninja" ]] || ${CMAKE_PROGRAM} -GNinja \
    ${CMAKE_HOST_TOOLS:-} \
    ${CMAKE_SHARED_FLAGS:-} \
    ${cmake_build_type_flags:-} \
    -DCMAKE_EXE_LINKER_FLAGS="-nodefaultlibs -lc" \
    -DCMAKE_SHARED_LINKER_FLAGS="${libgcc_file_name}" \
    -DLIBCXXABI_TARGET_TRIPLE="${target}-fuchsia" \
    -DLIBCXXABI_SYSROOT="${sysroot}" \
    -DLIBCXXABI_LIBCXX_INCLUDES="${ROOT_DIR}/third_party/llvm/runtimes/libcxx/include" \
    -DLIBCXXABI_LIBUNWIND_INCLUDES="${ROOT_DIR}/third_party/llvm/runtimes/libunwind/include" \
    -DLIBCXXABI_USE_LLVM_UNWINDER=ON \
    -DLIBCXXABI_ENABLE_SHARED=ON \
    ${ROOT_DIR}/third_party/llvm/runtimes/libcxxabi
  env DESTDIR="${sysroot}" ${ROOT_DIR}/buildtools/ninja install
  popd

  mkdir -p -- "${outdir}/build-libcxx-${target}"
  pushd "${outdir}/build-libcxx-${target}"
  [[ -f "${outdir}/build-libcxx-${target}/build.ninja" ]] || ${CMAKE_PROGRAM} -GNinja \
    ${CMAKE_HOST_TOOLS:-} \
    ${CMAKE_SHARED_FLAGS:-} \
    ${cmake_build_type_flags:-} \
    -DCMAKE_EXE_LINKER_FLAGS="-nodefaultlibs -lc" \
    -DCMAKE_SHARED_LINKER_FLAGS="${libgcc_file_name}" \
    -DLIBCXX_CXX_ABI=libcxxabi \
    -DLIBCXXABI_USE_LLVM_UNWINDER=ON \
    -DLIBCXX_CXX_ABI_INCLUDE_PATHS="${ROOT_DIR}/third_party/llvm/runtimes/libcxxabi/include" \
    -DLIBCXX_ABI_VERSION=2 \
    -DLIBCXX_ENABLE_SHARED=ON \
    -DLIBCXX_HAS_MUSL_LIBC=ON \
    -DLIBCXX_TARGET_TRIPLE="${target}-fuchsia" \
    -DLIBCXX_SYSROOT="${sysroot}" \
    ${ROOT_DIR}/third_party/llvm/runtimes/libcxx
  env DESTDIR="${sysroot}" ${ROOT_DIR}/buildtools/ninja install
  popd

  local stamp="$(LC_ALL=POSIX cat $(find "${sysroot}" -type f | sort) | shasum -a1  | awk '{print $1}')"
  echo "${stamp}" > "${sysroot}/.stamp"
}

declare CLEAN="${CLEAN:-false}"
declare TARGET="${TARGET:-x86_64}"
declare OUTDIR="${OUTDIR:-${ROOT_DIR}/out}"
declare DESTDIR="${DESTDIR:-${OUTDIR}/sysroot}"
declare RELEASE="${RELEASE:-false}"

while getopts "cd:t:o:r" opt; do
  case "${opt}" in
    c) CLEAN="true" ;;
    d) DESTDIR="${OPTARG}" ;;
    o) OUTDIR="${OPTARG}" ;;
    r) RELEASE="true" ;;
    t) TARGET="${OPTARG}" ;;
    *) usage;;
  esac
done

readonly CLEAN TARGET OUTDIR DESTDIR RELEASE

build "${TARGET}" "${OUTDIR}" "${DESTDIR}" "${CLEAN}" "${RELEASE}"
