#!/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

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 + Clang Tools Extra"
  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 "   x Clang Tools Extra"
  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
clang_extra_dir=clang-tools-extra
clang_extra_link=tools/clang/tools/extra
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=$1
  [ -s "$LLVM_SRC/$link" ]
}

# Initialise status
init() {
  link=$1
  if has $link; then
    echo "true";
  else
    echo "false"
  fi
}

# Link/Unlink upon need
update() {
  dir=$1
  link=$2
  need=$3
  if $need; then
    ln -sf $LLVM_SRC/../$dir $LLVM_SRC/$link
  else
    rm -f $LLVM_SRC/$link
  fi
}

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

need_all() {
  need=$1
  clang=$need
  clang_extra=$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`
clang_extra=`init $clang_extra_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 false
    clang=true
    clang_extra=true
    shift
    ;;
  lldb)
    need_all false
    clang=true
    lldb=true
    shift
    ;;
  lld)
    need_all false
    clang=true
    lld=true
    shift
    ;;
  rt)
    need_all false
    clang=true
    rt=true
    shift
    ;;
  libs)
    need_all false
    clang=true
    libcxx=true
    libcxxabi=true
    libunwind=true
    shift
    ;;
  all)
    need_all true
    shift
    ;;
  none)
    need_all false
    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=true
  if [ "$sign" = "-" ]; then
    flag=false
    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
      ;;
    x)
      clang_extra=$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

# clang and clang-tools-extra have a special relationship: we can't enable
# clang-tools-extra without enabling clang, and we also can't disable clang
# without also disabling clang-tools-extra
if [ "$clang_extra" = true -a "$clang" = false ]; then
  echo "Can't have Clang Tools Extra without Clang! Try to add +c or -x"
  exit
fi


# 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 $clang_extra_dir $clang_extra_link $clang_extra
list_all
