#!/usr/bin/env bash
#
# utils/build-toolchain - documents process for building a toolchain
#
# This source file is part of the Swift.org open source project
#
# Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
# Licensed under Apache License v2.0 with Runtime Library Exception
#
# See https://swift.org/LICENSE.txt for license information
# See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors

function usage() {
  echo "$0 <bundle_prefix> [OPTIONS]"
  echo ""
  echo "<bundle_prefix> - Prefix to use for bundle name"
  echo ""
  echo "OPTIONS"
  echo ""
  echo "-h --help"
  echo "Show help information."
  echo ""
  echo "-n --dry-run"
  echo "Do a dry run."
  echo ""
  echo "-t --test"
  echo "Run tests."
  echo ""
  echo "--distcc"
  echo "Build with distcc to speed up the toolchain build"
  echo ""
}

RESULT_DIR=$PWD
cd "$(dirname $0)/.." || exit

# Set defaults
DISTCC_FLAG=
DRY_RUN=
BUNDLE_PREFIX=
case $(uname -s) in
  Darwin)
    SWIFT_PACKAGE=buildbot_osx_package,no_test
    OS_SUFFIX=osx
  ;;
  Linux)
    SWIFT_PACKAGE=buildbot_linux,no_test
    OS_SUFFIX=linux
  ;;
  *)
    echo "Unrecognised platform $(uname -s)"
    exit 1
  ;;
esac

# Process command line arguments
FIRST_ARG_PROCESSED=0
while [ $# -ne 0 ]; do
  case "$1" in
    -n|--dry-run)
      DRY_RUN="-n"
  ;;
    -t|--test)
      if [ "$(uname -s)" == "Linux" ]; then
        SWIFT_PACKAGE=buildbot_linux
      else
        SWIFT_PACKAGE=buildbot_osx_package
      fi
  ;;
    --distcc)
      DISTCC_FLAG="--distcc"
  ;;
  -h|--help)
    usage
    exit 0
  ;;
  *)
    if [ ${FIRST_ARG_PROCESSED} -eq 0 ]; then
      # This is the bundle prefix
      BUNDLE_PREFIX="$1"
    else
      echo "Unrecognised argument \"$1\""
      exit 1
    fi
  ;;
  esac
  FIRST_ARG_PROCESSED=1
  shift
done

if [ -z "${BUNDLE_PREFIX}" ]; then
  echo "Bundle prefix cannot be empty. See $0 --help"
  exit 1
fi

# Report the commands being run
set -x
YEAR=$(date +"%Y")
MONTH=$(date +"%m")
DAY=$(date +"%d")
TOOLCHAIN_VERSION="swift-LOCAL-${YEAR}-${MONTH}-${DAY}-a"
DARWIN_TOOLCHAIN_VERSION="0.0.${YEAR}${MONTH}${DAY}"
ARCHIVE="${TOOLCHAIN_VERSION}-${OS_SUFFIX}.tar.gz"
SYM_ARCHIVE="${TOOLCHAIN_VERSION}-${OS_SUFFIX}-symbols.tar.gz"
BUNDLE_PREFIX=${BUNDLE_PREFIX:?Please specify a bundle prefix}
BUNDLE_IDENTIFIER="${BUNDLE_PREFIX}.${YEAR}${MONTH}${DAY}"
DISPLAY_NAME_SHORT="Local Swift Development Snapshot"
DISPLAY_NAME="${DISPLAY_NAME_SHORT} ${YEAR}-${MONTH}-${DAY}"
TOOLCHAIN_NAME="${TOOLCHAIN_VERSION}"

SWIFT_INSTALLABLE_PACKAGE="${RESULT_DIR}/${ARCHIVE}"
SWIFT_INSTALL_DIR="${RESULT_DIR}/swift-nightly-install"
SWIFT_INSTALL_SYMROOT="${RESULT_DIR}/swift-nightly-symroot"
SWIFT_TOOLCHAIN_DIR="/Library/Developer/Toolchains/${TOOLCHAIN_NAME}.xctoolchain"
SYMBOLS_PACKAGE="${RESULT_DIR}/${SYM_ARCHIVE}"
DRY_RUN="${DRY_RUN}"
DISTCC_FLAG="${DISTCC_FLAG}"

./utils/build-script ${DRY_RUN} ${DISTCC_FLAG} --preset="${SWIFT_PACKAGE}" \
        install_destdir="${SWIFT_INSTALL_DIR}" \
        installable_package="${SWIFT_INSTALLABLE_PACKAGE}" \
        install_toolchain_dir="${SWIFT_TOOLCHAIN_DIR}" \
        install_symroot="${SWIFT_INSTALL_SYMROOT}" \
        symbols_package="${SYMBOLS_PACKAGE}" \
        darwin_toolchain_bundle_identifier="${BUNDLE_IDENTIFIER}" \
        darwin_toolchain_display_name="${DISPLAY_NAME}" \
        darwin_toolchain_display_name_short="${DISPLAY_NAME_SHORT}" \
        darwin_toolchain_xctoolchain_name="${TOOLCHAIN_NAME}" \
        darwin_toolchain_version="${DARWIN_TOOLCHAIN_VERSION}" \
        darwin_toolchain_alias="Local"
