#!/usr/bin/env bash

# This script keeps track of all projects that are linked to the llvm src
# directory. It can detect, enable, disable and map to specific projects,
# so different builds get to see the source dir as they saw originally.

. llvm-common

safe_run verify_env

prog=`basename $0`
syntax() {
  echo "Syntax: $prog [clang|lldb|lld|rt|libs|all|none] {+/-}[c|x|r|k|d|l|a|u|t]"
  echo " no args: List linked projects"
  echo "   clang: Clang"
  echo "    lldb: Clang + lldb"
  echo "     lld: Clang + lld"
  echo "      rt: Clang + compiler-rt"
  echo "    libs: Clang + libcxx + libcxxabi + libunwind"
  echo "     all: Link all projects"
  echo "    none: Unlink all projects"
  echo " {+/-}: link / unlink projects (default: link)"
  echo "   c Clang"
  echo "   r Compiler-rt"
  echo "   k lld"
  echo "   d lldb"
  echo "   l libcxx"
  echo "   a libcxxabi"
  echo "   u libunwind"
  echo "   t test-suite"
  echo " Long options unlink everything before proceeding. Use the short options for fine-tuning"
}

# Dirs and links into LLVM
clang_dir=clang
clang_link=tools/clang
rt_dir=compiler-rt
rt_link=projects/compiler-rt
libcxx_dir=libcxx
libcxx_link=projects/libcxx
libcxxabi_dir=libcxxabi
libcxxabi_link=projects/libcxxabi
libunwind_dir=libunwind
libunwind_link=projects/libunwind
lld_dir=lld
lld_link=tools/lld
lldb_dir=lldb
lldb_link=tools/lldb
tests_dir=test-suite
tests_link=projects/test-suite

# Check if link exists
has_link() {
  link=$1
  [ -d "$LLVM_SRC/$link" ]
}

# Initialise status
init() {
  link=$1
  if has_link $link; then
    echo "ON";
  else
    echo "OFF"
  fi
}

# Link/Unlink upon need
update() {
  dir=$1
  link=$2
  need=$3
  if [ "$need" = ON ]; then
    if ! has_link $link; then
      pushdq $LLVM_SRC
      branch=`get_branch`
      popdq

      safe_run add_worktree $LLVM_ROOT/repos/$dir $LLVM_SRC/$link $branch
    fi
  else
    safe_run remove_worktree $LLVM_ROOT/repos/$dir $LLVM_SRC/$link
  fi
}

# Enable/disable projects in the CMake cache
update_build_dirs() {
  if [ -d $LLVM_BLD/../build ]; then
    safe_run cmake $* $LLVM_BLD/../build
  fi

  if [ -d $LLVM_BLD/../debug ]; then
    safe_run cmake $* $LLVM_BLD/../debug
  fi
}

# Lists linked projects
list_all() {
  echo "Projects linked:"
  has_link $clang_link && echo " + Clang"
  has_link $rt_link && echo " + Compiler-RT"
  has_link $libcxx_link && echo " + LibC++"
  has_link $libcxxabi_link && echo " + LibC++abi"
  has_link $libunwind_link && echo " + LibUnwind"
  has_link $lld_link && echo " + LLD"
  has_link $lldb_link && echo " + LLDB"
  has_link $tests_link && echo " + Test-Suite"
  echo
}

need_all() {
  need=$1
  clang=$need
  rt=$need
  libcxx=$need
  libcxxabi=$need
  libunwind=$need
  lld=$need
  lldb=$need
  tests=$need
}

# No args, list
if [ "$1" = "" ]; then
  echo "Use $prog -h for options"
  echo
  list_all
  exit
fi

# Need/not need
clang=`init $clang_link`
rt=`init $rt_link`
libcxx=`init $libcxx_link`
libcxxabi=`init $libcxxabi_link`
libunwind=`init $libunwind_link`
lld=`init $lld_link`
lldb=`init $lldb_link`
tests=`init $tests_link`

# See if the first option is one of the long options
opt=$1
case $opt in
  clang)
    need_all OFF
    clang=ON
    shift
    ;;
  lldb)
    need_all OFF
    clang=ON
    lldb=ON
    shift
    ;;
  lld)
    need_all OFF
    clang=ON
    lld=ON
    shift
    ;;
  rt)
    need_all OFF
    clang=ON
    rt=ON
    shift
    ;;
  libs)
    need_all OFF
    clang=ON
    libcxx=ON
    libcxxabi=ON
    libunwind=ON
    shift
    ;;
  all)
    need_all ON
    shift
    ;;
  none)
    need_all OFF
    shift
    ;;
  list)
    list_all
    exit
    ;;
  -h)
    syntax
    exit
    ;;
esac

# Parse short options, if any
while ! test -z $1; do
  opt=$1

  sign=${opt:0:1}
  flag=ON
  if [ "$sign" = "-" ]; then
    flag=OFF
    opt=${opt:1}
  elif [ "$sign" = "+" ]; then
    opt=${opt:1}
  else
    # Doesn't look like one of our short options
    syntax
    exit
  fi

  case $opt in
    c)
      clang=$flag
      ;;
    r)
      rt=$flag
      ;;
    k)
      lld=$flag
      ;;
    d)
      lldb=$flag
      ;;
    l)
      libcxx=$flag
      ;;
    a)
      libcxxabi=$flag
      ;;
    u)
      libunwind=$flag
      ;;
    t)
      tests=$flag
      ;;
    *)
      syntax
      exit
  esac
  shift
done

# Update links
update $tests_dir $tests_link $tests
update $lldb_dir $lldb_link $lldb
update $lld_dir $lld_link $lld
update $libunwind_dir $libunwind_link $libunwind
update $libcxxabi_dir $libcxxabi_link $libcxxabi
update $libcxx_dir $libcxx_link $libcxx
update $rt_dir $rt_link $rt
update $clang_dir $clang_link $clang
update_build_dirs -DLLVM_TOOL_LLDB_BUILD=$lldb \
  -DLLVM_TOOL_LLD_BUILD=$lld \
  -DLLVM_TOOL_LIBUNWIND_BUILD=$libunwind \
  -DLLVM_TOOL_LIBCXXABI_BUILD=$libcxxabi \
  -DLLVM_TOOL_LIBCXX_BUILD=$libcxx \
  -DLLVM_TOOL_COMPILER_RT_BUILD=$rt \
  -DLLVM_TOOL_CLANG_BUILD=$clang \
list_all
