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