blob: ecc9d0e2cc477060601abe5976f5509da19bcd35 [file] [log] [blame]
#!/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