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