Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@junkdog
Created November 18, 2017 20:29
Show Gist options
  • Save junkdog/70231d6953592cd6f27def59fe19e50d to your computer and use it in GitHub Desktop.
Save junkdog/70231d6953592cd6f27def59fe19e50d to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
# --slave /usr/bin/$1 $1 /usr/bin/$1-\${version} \\
function register_clang_version {
local version=$1
local priority=$2
update-alternatives \
--install /usr/bin/llvm-config llvm-config /usr/bin/llvm-config-${version} ${priority} \
--slave /usr/bin/llvm-ar llvm-ar /usr/bin/llvm-ar-${version} \
--slave /usr/bin/llvm-as llvm-as /usr/bin/llvm-as-${version} \
--slave /usr/bin/llvm-bcanalyzer llvm-bcanalyzer /usr/bin/llvm-bcanalyzer-${version} \
--slave /usr/bin/llvm-cov llvm-cov /usr/bin/llvm-cov-${version} \
--slave /usr/bin/llvm-diff llvm-diff /usr/bin/llvm-diff-${version} \
--slave /usr/bin/llvm-dis llvm-dis /usr/bin/llvm-dis-${version} \
--slave /usr/bin/llvm-dwarfdump llvm-dwarfdump /usr/bin/llvm-dwarfdump-${version} \
--slave /usr/bin/llvm-extract llvm-extract /usr/bin/llvm-extract-${version} \
--slave /usr/bin/llvm-link llvm-link /usr/bin/llvm-link-${version} \
--slave /usr/bin/llvm-mc llvm-mc /usr/bin/llvm-mc-${version} \
--slave /usr/bin/llvm-mcmarkup llvm-mcmarkup /usr/bin/llvm-mcmarkup-${version} \
--slave /usr/bin/llvm-nm llvm-nm /usr/bin/llvm-nm-${version} \
--slave /usr/bin/llvm-objdump llvm-objdump /usr/bin/llvm-objdump-${version} \
--slave /usr/bin/llvm-ranlib llvm-ranlib /usr/bin/llvm-ranlib-${version} \
--slave /usr/bin/llvm-readobj llvm-readobj /usr/bin/llvm-readobj-${version} \
--slave /usr/bin/llvm-rtdyld llvm-rtdyld /usr/bin/llvm-rtdyld-${version} \
--slave /usr/bin/llvm-size llvm-size /usr/bin/llvm-size-${version} \
--slave /usr/bin/llvm-stress llvm-stress /usr/bin/llvm-stress-${version} \
--slave /usr/bin/llvm-symbolizer llvm-symbolizer /usr/bin/llvm-symbolizer-${version} \
--slave /usr/bin/llvm-tblgen llvm-tblgen /usr/bin/llvm-tblgen-${version}
update-alternatives \
--install /usr/bin/clang clang /usr/bin/clang-${version} ${priority} \
--slave /usr/bin/clang++ clang++ /usr/bin/clang++-${version} \
--slave /usr/bin/asan_symbolize asan_symbolize /usr/bin/asan_symbolize-${version} \
--slave /usr/bin/c-index-test c-index-test /usr/bin/c-index-test-${version} \
--slave /usr/bin/clang-check clang-check /usr/bin/clang-check-${version} \
--slave /usr/bin/clang-cl clang-cl /usr/bin/clang-cl-${version} \
--slave /usr/bin/clang-cpp clang-cpp /usr/bin/clang-cpp-${version} \
--slave /usr/bin/clang-format clang-format /usr/bin/clang-format-${version} \
--slave /usr/bin/clang-format-diff clang-format-diff /usr/bin/clang-format-diff-${version} \
--slave /usr/bin/clang-import-test clang-import-test /usr/bin/clang-import-test-${version} \
--slave /usr/bin/clang-include-fixer clang-include-fixer /usr/bin/clang-include-fixer-${version} \
--slave /usr/bin/clang-offload-bundler clang-offload-bundler /usr/bin/clang-offload-bundler-${version} \
--slave /usr/bin/clang-query clang-query /usr/bin/clang-query-${version} \
--slave /usr/bin/clang-rename clang-rename /usr/bin/clang-rename-${version} \
--slave /usr/bin/clang-reorder-fields clang-reorder-fields /usr/bin/clang-reorder-fields-${version} \
--slave /usr/bin/clang-tidy clang-tidy /usr/bin/clang-tidy-${version} \
--slave /usr/bin/lldb lldb /usr/bin/lldb-${version} \
--slave /usr/bin/lldb-server lldb-server /usr/bin/lldb-server-${version}
}
register_clang_version $1 $2
@computerjohney
Copy link

Yes, thanks, finally got llvm/clang toolchain versions on ubuntu

@bheu
Copy link

bheu commented Nov 28, 2020

Thanks

@ricab
Copy link

ricab commented May 18, 2021

Very useful, thanks. There's one entry that could perhaps be added:

[...]
--slave   /usr/bin/git-clang-format      git-clang-format      /usr/bin/git-clang-format-${version} \
[...]

@kevinkreiser
Copy link

ditto what others have said, thanks for posting!

@StatusCode404
Copy link

For building the linux kernel on a distro like Ubuntu 18.04+, substituting all GNU utils, compilers, and linker and allowing for thin LTO; the above will NOT work and fail.

This is how I got it to work...

#!/usr/bin/env bash'

#     --slave /usr/bin/$1 $1 /usr/bin/$1-\${version} \\

function register_clang_version {
    local version=$1
    local priority=$2

    update-alternatives \
        --verbose \
        --install /usr/bin/llvm-config       llvm-config      /usr/bin/llvm-config-${version} ${priority} \
        --slave   /usr/bin/llvm-ar           llvm-ar          /usr/bin/llvm-ar-${version} \
        --slave   /usr/bin/llvm-as           llvm-as          /usr/bin/llvm-as-${version} \
        --slave   /usr/bin/llvm-bcanalyzer   llvm-bcanalyzer  /usr/bin/llvm-bcanalyzer-${version} \
        --slave   /usr/bin/llvm-cov          llvm-cov         /usr/bin/llvm-cov-${version} \
        --slave   /usr/bin/llvm-diff         llvm-diff        /usr/bin/llvm-diff-${version} \
        --slave   /usr/bin/llvm-dis          llvm-dis         /usr/bin/llvm-dis-${version} \
        --slave   /usr/bin/llvm-dwarfdump    llvm-dwarfdump   /usr/bin/llvm-dwarfdump-${version} \
        --slave   /usr/bin/llvm-extract      llvm-extract     /usr/bin/llvm-extract-${version} \
        --slave   /usr/bin/llvm-link         llvm-link        /usr/bin/llvm-link-${version} \
        --slave   /usr/bin/llvm-mc           llvm-mc          /usr/bin/llvm-mc-${version} \
        --slave   /usr/bin/llvm-nm           llvm-nm          /usr/bin/llvm-nm-${version} \
        --slave   /usr/bin/llvm-objdump      llvm-objdump     /usr/bin/llvm-objdump-${version} \
        --slave   /usr/bin/llvm-ranlib       llvm-ranlib      /usr/bin/llvm-ranlib-${version} \
        --slave   /usr/bin/llvm-readobj      llvm-readobj     /usr/bin/llvm-readobj-${version} \
        --slave   /usr/bin/llvm-rtdyld       llvm-rtdyld      /usr/bin/llvm-rtdyld-${version} \
        --slave   /usr/bin/llvm-size         llvm-size        /usr/bin/llvm-size-${version} \
        --slave   /usr/bin/llvm-stress       llvm-stress      /usr/bin/llvm-stress-${version} \
        --slave   /usr/bin/llvm-symbolizer   llvm-symbolizer  /usr/bin/llvm-symbolizer-${version} \
        --slave   /usr/bin/llvm-tblgen       llvm-tblgen      /usr/bin/llvm-tblgen-${version} \
        --slave   /usr/bin/llvm-objcopy      llvm-objcopy     /usr/bin/llvm-objcopy-${version} \
        --slave   /usr/bin/llvm-strip	     llvm-strip       /usr/bin/llvm-strip-${version}

    update-alternatives \
        --verbose \
        --install /usr/bin/clang                 clang                 /usr/bin/clang-${version} ${priority} \
        --slave   /usr/bin/clang++               clang++               /usr/bin/clang++-${version}  \
        --slave   /usr/bin/asan_symbolize        asan_symbolize        /usr/bin/asan_symbolize-${version} \
        --slave   /usr/bin/clang-cpp             clang-cpp             /usr/bin/clang-cpp-${version} \
        --slave   /usr/bin/ld.lld		 ld.lld		       /usr/bin/ld.lld-${version}
}

register_clang_version $1 $2

The above works with clang-12, llvm-12, and ld.lld-12
And will successfully build the Linux kernel even with thin LTO.

There are additions to the OP's list which are:

1. llvm-objcopy
2. llvm-strip
3. ld.lld

The rest where superfluous and deleted.

@tyler274
Copy link

tyler274 commented Sep 29, 2021

Those shims aren't superfluous at all, you probably want a debugger and formatter...

#!/usr/bin/env bash

#     --slave /usr/bin/$1 $1 /usr/bin/$1-\${version} \\

function register_clang_version {
    local version=$1
    local priority=$2

    update-alternatives \
        --verbose \
        --install /usr/bin/llvm-config       llvm-config      /usr/bin/llvm-config-${version} ${priority} \
        --slave   /usr/bin/llvm-ar           llvm-ar          /usr/bin/llvm-ar-${version} \
        --slave   /usr/bin/llvm-as           llvm-as          /usr/bin/llvm-as-${version} \
        --slave   /usr/bin/llvm-bcanalyzer   llvm-bcanalyzer  /usr/bin/llvm-bcanalyzer-${version} \
        --slave   /usr/bin/llvm-cov          llvm-cov         /usr/bin/llvm-cov-${version} \
        --slave   /usr/bin/llvm-diff         llvm-diff        /usr/bin/llvm-diff-${version} \
        --slave   /usr/bin/llvm-dis          llvm-dis         /usr/bin/llvm-dis-${version} \
        --slave   /usr/bin/llvm-dwarfdump    llvm-dwarfdump   /usr/bin/llvm-dwarfdump-${version} \
        --slave   /usr/bin/llvm-extract      llvm-extract     /usr/bin/llvm-extract-${version} \
        --slave   /usr/bin/llvm-link         llvm-link        /usr/bin/llvm-link-${version} \
        --slave   /usr/bin/llvm-mc           llvm-mc          /usr/bin/llvm-mc-${version} \
        --slave   /usr/bin/llvm-nm           llvm-nm          /usr/bin/llvm-nm-${version} \
        --slave   /usr/bin/llvm-objdump      llvm-objdump     /usr/bin/llvm-objdump-${version} \
        --slave   /usr/bin/llvm-ranlib       llvm-ranlib      /usr/bin/llvm-ranlib-${version} \
        --slave   /usr/bin/llvm-readobj      llvm-readobj     /usr/bin/llvm-readobj-${version} \
        --slave   /usr/bin/llvm-rtdyld       llvm-rtdyld      /usr/bin/llvm-rtdyld-${version} \
        --slave   /usr/bin/llvm-size         llvm-size        /usr/bin/llvm-size-${version} \
        --slave   /usr/bin/llvm-stress       llvm-stress      /usr/bin/llvm-stress-${version} \
        --slave   /usr/bin/llvm-symbolizer   llvm-symbolizer  /usr/bin/llvm-symbolizer-${version} \
        --slave   /usr/bin/llvm-tblgen       llvm-tblgen      /usr/bin/llvm-tblgen-${version} \
        --slave   /usr/bin/llvm-objcopy      llvm-objcopy     /usr/bin/llvm-objcopy-${version} \
        --slave   /usr/bin/llvm-strip	     llvm-strip       /usr/bin/llvm-strip-${version}

    update-alternatives \
        --verbose \
        --install /usr/bin/clang                 clang                 /usr/bin/clang-${version} ${priority} \
        --slave   /usr/bin/clang++               clang++               /usr/bin/clang++-${version}  \
        --slave   /usr/bin/asan_symbolize        asan_symbolize        /usr/bin/asan_symbolize-${version} \
        --slave   /usr/bin/clang-cpp             clang-cpp             /usr/bin/clang-cpp-${version} \
        --slave   /usr/bin/clang-check           clang-check           /usr/bin/clang-check-${version} \
        --slave   /usr/bin/clang-cl              clang-cl              /usr/bin/clang-cl-${version} \
        --slave   /usr/bin/ld.lld		         ld.lld		           /usr/bin/ld.lld-${version} \
        --slave   /usr/bin/lld		             lld	               /usr/bin/lld-${version} \
        --slave   /usr/bin/lld-link		         lld-link	           /usr/bin/lld-link-${version} \
        --slave   /usr/bin/clang-format          clang-format          /usr/bin/clang-format-${version} \
        --slave   /usr/bin/clang-format-diff     clang-format-diff     /usr/bin/clang-format-diff-${version} \
        --slave   /usr/bin/clang-include-fixer   clang-include-fixer   /usr/bin/clang-include-fixer-${version} \
        --slave   /usr/bin/clang-offload-bundler clang-offload-bundler /usr/bin/clang-offload-bundler-${version} \
        --slave   /usr/bin/clang-query           clang-query           /usr/bin/clang-query-${version} \
        --slave   /usr/bin/clang-rename          clang-rename          /usr/bin/clang-rename-${version} \
        --slave   /usr/bin/clang-reorder-fields  clang-reorder-fields  /usr/bin/clang-reorder-fields-${version} \
        --slave   /usr/bin/clang-tidy            clang-tidy            /usr/bin/clang-tidy-${version} \
        --slave   /usr/bin/lldb                  lldb                  /usr/bin/lldb-${version} \
        --slave   /usr/bin/lldb-server           lldb-server           /usr/bin/lldb-server-${version}
}

register_clang_version $1 $2

@mnesarco
Copy link

[2022-09-20] Added the clang language server: clangd

#!/usr/bin/env bash

#     --slave /usr/bin/$1 $1 /usr/bin/$1-\${version} \\

function register_clang_version {
    local version=$1
    local priority=$2

    update-alternatives \
        --verbose \
        --install /usr/bin/llvm-config       llvm-config      /usr/bin/llvm-config-${version} ${priority} \
        --slave   /usr/bin/llvm-ar           llvm-ar          /usr/bin/llvm-ar-${version} \
        --slave   /usr/bin/llvm-as           llvm-as          /usr/bin/llvm-as-${version} \
        --slave   /usr/bin/llvm-bcanalyzer   llvm-bcanalyzer  /usr/bin/llvm-bcanalyzer-${version} \
        --slave   /usr/bin/llvm-cov          llvm-cov         /usr/bin/llvm-cov-${version} \
        --slave   /usr/bin/llvm-diff         llvm-diff        /usr/bin/llvm-diff-${version} \
        --slave   /usr/bin/llvm-dis          llvm-dis         /usr/bin/llvm-dis-${version} \
        --slave   /usr/bin/llvm-dwarfdump    llvm-dwarfdump   /usr/bin/llvm-dwarfdump-${version} \
        --slave   /usr/bin/llvm-extract      llvm-extract     /usr/bin/llvm-extract-${version} \
        --slave   /usr/bin/llvm-link         llvm-link        /usr/bin/llvm-link-${version} \
        --slave   /usr/bin/llvm-mc           llvm-mc          /usr/bin/llvm-mc-${version} \
        --slave   /usr/bin/llvm-nm           llvm-nm          /usr/bin/llvm-nm-${version} \
        --slave   /usr/bin/llvm-objdump      llvm-objdump     /usr/bin/llvm-objdump-${version} \
        --slave   /usr/bin/llvm-ranlib       llvm-ranlib      /usr/bin/llvm-ranlib-${version} \
        --slave   /usr/bin/llvm-readobj      llvm-readobj     /usr/bin/llvm-readobj-${version} \
        --slave   /usr/bin/llvm-rtdyld       llvm-rtdyld      /usr/bin/llvm-rtdyld-${version} \
        --slave   /usr/bin/llvm-size         llvm-size        /usr/bin/llvm-size-${version} \
        --slave   /usr/bin/llvm-stress       llvm-stress      /usr/bin/llvm-stress-${version} \
        --slave   /usr/bin/llvm-symbolizer   llvm-symbolizer  /usr/bin/llvm-symbolizer-${version} \
        --slave   /usr/bin/llvm-tblgen       llvm-tblgen      /usr/bin/llvm-tblgen-${version} \
        --slave   /usr/bin/llvm-objcopy      llvm-objcopy     /usr/bin/llvm-objcopy-${version} \
        --slave   /usr/bin/llvm-strip        llvm-strip       /usr/bin/llvm-strip-${version}

    update-alternatives \
        --verbose \
        --install /usr/bin/clang                 clang                 /usr/bin/clang-${version} ${priority} \
        --slave   /usr/bin/clang++               clang++               /usr/bin/clang++-${version}  \
        --slave   /usr/bin/asan_symbolize        asan_symbolize        /usr/bin/asan_symbolize-${version} \
        --slave   /usr/bin/clang-cpp             clang-cpp             /usr/bin/clang-cpp-${version} \
        --slave   /usr/bin/clang-check           clang-check           /usr/bin/clang-check-${version} \
        --slave   /usr/bin/clang-cl              clang-cl              /usr/bin/clang-cl-${version} \
        --slave   /usr/bin/ld.lld                ld.lld                /usr/bin/ld.lld-${version} \
        --slave   /usr/bin/lld                   lld                   /usr/bin/lld-${version} \
        --slave   /usr/bin/lld-link              lld-link              /usr/bin/lld-link-${version} \
        --slave   /usr/bin/clang-format          clang-format          /usr/bin/clang-format-${version} \
        --slave   /usr/bin/clang-format-diff     clang-format-diff     /usr/bin/clang-format-diff-${version} \
        --slave   /usr/bin/clang-include-fixer   clang-include-fixer   /usr/bin/clang-include-fixer-${version} \
        --slave   /usr/bin/clang-offload-bundler clang-offload-bundler /usr/bin/clang-offload-bundler-${version} \
        --slave   /usr/bin/clang-query           clang-query           /usr/bin/clang-query-${version} \
        --slave   /usr/bin/clang-rename          clang-rename          /usr/bin/clang-rename-${version} \
        --slave   /usr/bin/clang-reorder-fields  clang-reorder-fields  /usr/bin/clang-reorder-fields-${version} \
        --slave   /usr/bin/clang-tidy            clang-tidy            /usr/bin/clang-tidy-${version} \
        --slave   /usr/bin/lldb                  lldb                  /usr/bin/lldb-${version} \
        --slave   /usr/bin/lldb-server           lldb-server           /usr/bin/lldb-server-${version} \
        --slave   /usr/bin/clangd                clangd                /usr/bin/clangd-${version}
}

register_clang_version $1 $2

@ppigazzini
Copy link

ppigazzini commented Oct 14, 2022

Thank you. Compact and generic version, with all the files "/usr/bin/*-16" installed by clang 16 on Ubuntu/Debian (https://apt.llvm.org/)

#!/bin/bash
# add clang ${version} to Ubuntu

update_alternatives() {
    local version=${1}
    local priority=${2}
    local master=${3}
    local slaves=${4}
    local path=${5}
    local cmdln

    cmdln="--verbose --install ${path}${master} ${master} ${path}${master}-${version} ${priority}"
    for slave in ${slaves}; do
        cmdln="${cmdln} --slave ${path}${slave} ${slave} ${path}${slave}-${version}"
    done
    sudo update-alternatives ${cmdln}
}


if [[ ${#} -ne 2 ]]; then
    echo usage: "${0}" clang_version priority
    exit 1
fi

version=${1}
priority=${2}
path="/usr/bin/"

sudo apt update

# download and launch the setup script
wget https://apt.llvm.org/llvm.sh
sudo bash llvm.sh ${version}
#sudo bash llvm.sh ${version} all

# configure with update-alternatives
master="llvm-config"
slaves="llvm-addr2line llvm-ar llvm-as llvm-bcanalyzer llvm-bitcode-strip llvm-cat llvm-cfi-verify llvm-cov llvm-c-test llvm-cvtres llvm-cxxdump llvm-cxxfilt llvm-cxxmap llvm-debuginfo-analyzer llvm-debuginfod llvm-debuginfod-find llvm-diff llvm-dis llvm-dlltool llvm-d
warfdump llvm-dwarfutil llvm-dwp llvm-exegesis llvm-extract llvm-gsymutil llvm-ifs llvm-install-name-tool llvm-jitlink llvm-jitlink-executor llvm-lib llvm-libtool-darwin llvm-link llvm-lipo llvm-lto llvm-lto2 llvm-mc llvm-mca llvm-ml llvm-modextract llvm-mt llvm-nm llv
m-objcopy llvm-objdump llvm-opt-report llvm-otool llvm-pdbutil llvm-PerfectShuffle llvm-profdata llvm-profgen llvm-ranlib llvm-rc llvm-readelf llvm-readobj llvm-reduce llvm-remark-size-diff llvm-remarkutil llvm-rtdyld llvm-sim llvm-size llvm-split llvm-stress llvm-stri
ngs llvm-strip llvm-symbolizer llvm-tapi-diff llvm-tblgen llvm-tli-checker llvm-undname llvm-windres llvm-xray"

update_alternatives "${version}" "${priority}" "${master}" "${slaves}" "${path}"

master="clang"
slaves="asan_symbolize bugpoint clang++ clang-cpp clangd count dsymutil FileCheck ld64.lld ld.lld llc lld lldb lldb-argdumper lldb-instr lldb-server lldb-vscode lld-link lli lli-child-target not obj2yaml opt sanstats split-file UnicodeNameMappingGenerator verify-uselis
torder wasm-ld yaml2obj yaml-bench"

update_alternatives "${version}" "${priority}" "${master}" "${slaves}" "${path}"

# to uninstall a Clang version
# LLVM_VERSION=12
# sudo apt purge -y clang-${LLVM_VERSION} lldb-${LLVM_VERSION} lld-${LLVM_VERSION} clangd-${LLVM_VERSION} && sudo apt autoremove -y

# to generate the list of slaves on a clean vm
# 0. sudo apt update && sudo apt full-upgrade -y && sudo apt autoremove -y && sudo apt autoclean
# 1. ls /usr/bin > usr_bin_orig
# 2. install the new version of clang
# 3. ls /usr/bin > usr_bin_new
# 4. diff usr_bin_new usr_bin_orig | awk '/^< (llvm-).*-16$/ {gsub("-16",""); printf "%s ", $2} END {print ""}' > slaves_llvm
# 5  diff usr_bin_new usr_bin_orig | awk '/^< / && !/llvm-/ && /-16$/ {gsub("^< ",""); gsub("-16$",""); printf "%s ", $0} END {print ""}' > slaves_clang

@g-berthiaume
Copy link

Thanks, @mnesarco; it works great.

@hasufell
Copy link

hasufell commented Dec 9, 2022

...

master="clang"
slaves="analyze-build asan_symbolize bugpoint c-index-test clang++ clang-apply-replacements clang-change-namespace clang-check clang-cl clang-cpp clangd clang-doc clang-extdef-mapping clang-format clang-format-diff clang-include-fixer clang-linker-wrapper clang-move clang-nvlink-wrapper clang-offload-bundler clang-offload-packager clang-offload-wrapper clang-pseudo clang-query clang-refactor clang-rename clang-reorder-fields clang-repl clang-scan-deps clang-tidy count diagtool dsymutil FileCheck find-all-symbols git-clang-format hmaptool hwasan_symbolize intercept-build ld64.lld ld.lld llc lld lldb lldb-argdumper lldb-instr lldb-server lldb-vscode lld-link lli lli-child-target modularize not obj2yaml opt pp-trace run-clang-tidy sancov sanstats scan-build scan-build-py scan-view split-file UnicodeNameMappingGenerator verify-uselistorder wasm-ld yaml2obj yaml-bench"

update_alternatives "${version}" "${priority}" "${master}" "${slaves}" "${path}"

This is the only correct one. The others are all missing opt, llc etc. Not sure how those users got their toolchain working without it.

@ppigazzini
Copy link

This is the only correct one. The others are all missing opt, llc etc. Not sure how those users got their toolchain working without it.

To be honest the original script is 5 years old, but still a great reference. I wrote my version two months ago checking the differences on a clean Ubuntu before and after installing clang-15 llvm-15.

@miguno
Copy link

miguno commented Nov 4, 2023

@StatusCode404
Copy link

StatusCode404 commented Nov 5, 2023

This is the only correct one. The others are all missing opt, llc etc. Not sure how those users got their toolchain working without it.

To be honest the original script is 5 years old, but still a great reference. I wrote my version two months ago checking the differences on a clean Ubuntu before and after installing clang-15 llvm-15.

Yeah I've had to update my script as well over the years, this is what I'm using now a days with LLVM 15.0.7.

This is on Ubuntu 22.04+ Builds Linux kernel with LTO.

#!/usr/bin/env bash

#     --slave /usr/bin/$1 $1 /usr/bin/$1-\${version} \\

function register_clang_version {
    local version=$1
    local priority=$2

    update-alternatives \
       	--verbose \
        --install /usr/bin/llvm-config          llvm-config          /usr/bin/llvm-config-${version} ${priority} \
        --slave   /usr/bin/llvm-ar              llvm-ar              /usr/bin/llvm-ar-${version} \
        --slave   /usr/bin/llvm-as              llvm-as              /usr/bin/llvm-as-${version} \
        --slave   /usr/bin/llvm-bcanalyzer      llvm-bcanalyzer      /usr/bin/llvm-bcanalyzer-${version} \
        --slave   /usr/bin/llvm-c-test          llvm-c-test          /usr/bin/llvm-c-test-${version} \
        --slave   /usr/bin/llvm-cat             llvm-cat             /usr/bin/llvm-cat-${version} \
        --slave   /usr/bin/llvm-cfi-verify      llvm-cfi-verify      /usr/bin/llvm-cfi-verify-${version} \
        --slave   /usr/bin/llvm-cov             llvm-cov             /usr/bin/llvm-cov-${version} \
        --slave   /usr/bin/llvm-cvtres          llvm-cvtres          /usr/bin/llvm-cvtres-${version} \
        --slave   /usr/bin/llvm-cxxdump         llvm-cxxdump         /usr/bin/llvm-cxxdump-${version} \
        --slave   /usr/bin/llvm-cxxfilt         llvm-cxxfilt         /usr/bin/llvm-cxxfilt-${version} \
        --slave   /usr/bin/llvm-diff            llvm-diff            /usr/bin/llvm-diff-${version} \
        --slave   /usr/bin/llvm-dis             llvm-dis             /usr/bin/llvm-dis-${version} \
        --slave   /usr/bin/llvm-dlltool         llvm-dlltool         /usr/bin/llvm-dlltool-${version} \
        --slave   /usr/bin/llvm-dwarfdump       llvm-dwarfdump       /usr/bin/llvm-dwarfdump-${version} \
        --slave   /usr/bin/llvm-dwp             llvm-dwp             /usr/bin/llvm-dwp-${version} \
        --slave   /usr/bin/llvm-exegesis        llvm-exegesis        /usr/bin/llvm-exegesis-${version} \
        --slave   /usr/bin/llvm-extract         llvm-extract         /usr/bin/llvm-extract-${version} \
        --slave   /usr/bin/llvm-lib             llvm-lib             /usr/bin/llvm-lib-${version} \
        --slave   /usr/bin/llvm-link            llvm-link            /usr/bin/llvm-link-${version} \
        --slave   /usr/bin/llvm-lto             llvm-lto             /usr/bin/llvm-lto-${version} \
        --slave   /usr/bin/llvm-lto2            llvm-lto2            /usr/bin/llvm-lto2-${version} \
        --slave   /usr/bin/llvm-mc              llvm-mc              /usr/bin/llvm-mc-${version} \
        --slave   /usr/bin/llvm-mca             llvm-mca             /usr/bin/llvm-mca-${version} \
        --slave   /usr/bin/llvm-modextract      llvm-modextract      /usr/bin/llvm-modextract-${version} \
        --slave   /usr/bin/llvm-mt              llvm-mt              /usr/bin/llvm-mt-${version} \
        --slave   /usr/bin/llvm-nm              llvm-nm              /usr/bin/llvm-nm-${version} \
        --slave   /usr/bin/llvm-objcopy         llvm-objcopy         /usr/bin/llvm-objcopy-${version} \
        --slave   /usr/bin/llvm-objdump         llvm-objdump         /usr/bin/llvm-objdump-${version} \
        --slave   /usr/bin/llvm-opt-report      llvm-opt-report      /usr/bin/llvm-opt-report-${version} \
        --slave   /usr/bin/llvm-pdbutil         llvm-pdbutil         /usr/bin/llvm-pdbutil-${version} \
        --slave   /usr/bin/llvm-PerfectShuffle  llvm-PerfectShuffle  /usr/bin/llvm-PerfectShuffle-${version} \
        --slave   /usr/bin/llvm-profdata        llvm-profdata        /usr/bin/llvm-profdata-${version} \
        --slave   /usr/bin/llvm-ranlib          llvm-ranlib          /usr/bin/llvm-ranlib-${version} \
        --slave   /usr/bin/llvm-rc              llvm-rc              /usr/bin/llvm-rc-${version} \
        --slave   /usr/bin/llvm-readelf         llvm-readelf         /usr/bin/llvm-readelf-${version} \
        --slave   /usr/bin/llvm-readobj         llvm-readobj         /usr/bin/llvm-readobj-${version} \
        --slave   /usr/bin/llvm-rtdyld          llvm-rtdyld          /usr/bin/llvm-rtdyld-${version} \
        --slave   /usr/bin/llvm-size            llvm-size            /usr/bin/llvm-size-${version} \
        --slave   /usr/bin/llvm-split           llvm-split           /usr/bin/llvm-split-${version} \
        --slave   /usr/bin/llvm-stress          llvm-stress          /usr/bin/llvm-stress-${version} \
        --slave   /usr/bin/llvm-strings         llvm-strings         /usr/bin/llvm-strings-${version} \
        --slave   /usr/bin/llvm-strip           llvm-strip           /usr/bin/llvm-strip-${version} \
        --slave   /usr/bin/llvm-symbolizer      llvm-symbolizer      /usr/bin/llvm-symbolizer-${version} \
        --slave   /usr/bin/llvm-tblgen          llvm-tblgen          /usr/bin/llvm-tblgen-${version} \
        --slave   /usr/bin/llvm-undname         llvm-undname         /usr/bin/llvm-undname-${version} \
        --slave   /usr/bin/llvm-xray            llvm-xray            /usr/bin/llvm-xray-${version}
        

    update-alternatives \
       	--verbose \
        --install /usr/bin/clang					clang					/usr/bin/clang-${version} ${priority} \
        --slave   /usr/bin/clang++					clang++					/usr/bin/clang++-${version}  \
        --slave   /usr/bin/clang-format				clang-format			/usr/bin/clang-format-${version}  \
        --slave   /usr/bin/clang-cpp				clang-cpp				/usr/bin/clang-cpp-${version} \
        --slave   /usr/bin/asan_symbolize			asan_symbolize			/usr/bin/asan_symbolize-${version} \
        --slave   /usr/bin/bugpoint					bugpoint				/usr/bin/bugpoint-${version} \
        --slave   /usr/bin/dsymutil					dsymutil				/usr/bin/dsymutil-${version} \
        --slave   /usr/bin/lld						lld						/usr/bin/lld-${version} \
        --slave   /usr/bin/ld.lld					ld.lld					/usr/bin/ld.lld-${version} \
        --slave   /usr/bin/lld-link					lld-link				/usr/bin/lld-link-${version} \
        --slave   /usr/bin/llc						llc						/usr/bin/llc-${version} \
        --slave   /usr/bin/lli						lli						/usr/bin/lli-${version} \
        --slave   /usr/bin/obj2yaml					obj2yaml				/usr/bin/obj2yaml-${version} \
        --slave   /usr/bin/opt						opt						/usr/bin/opt-${version} \
        --slave   /usr/bin/sanstats					sanstats				/usr/bin/sanstats-${version} \
        --slave   /usr/bin/verify-uselistorder		verify-uselistorder		/usr/bin/verify-uselistorder-${version} \
        --slave   /usr/bin/wasm-ld					wasm-ld					/usr/bin/wasm-ld-${version} \
        --slave   /usr/bin/yaml2obj					yaml2obj					/usr/bin/yaml2obj-${version}
        
}

register_clang_version $1 $2

@ShangjinTang
Copy link

ShangjinTang commented Jan 25, 2024

There are plenty llvm related tools (more than 100).

I‘ve wrote a script to glob all llvm tools instead of manually specify them , tested on Ubuntu 22.04 x86_64.

It would automatically glob all the tools in /lib/llvm-${VERSION} as slave commands of /usr/bin/clang-{VERSION}

See: https://github.com/ShangjinTang/dotfiles/blob/05ef87daae29475244c276db5d406b58c52be445/linux/ubuntu/22.04/bin/update-alternatives-clang

To use it (requires sudo permission):

wget https://raw.githubusercontent.com/ShangjinTang/dotfiles/05ef87daae29475244c276db5d406b58c52be445/linux/ubuntu/22.04/bin/update-alternatives-clang
sudo bash ./update-alternatives-clang

Result:

[Adding alternative /usr/bin/clang-17 ...]
Master command: clang-17
Slave commands: amdgpu-arch-17 analyze-build-17 bugpoint-17 c-index-test-17 clang++-17 clang-apply-replacements-17 clang-change-namespace-17 clang-check-17 clang-cl-17 clang-cpp-17 clangd-17 clang-doc-17 clang-extdef-mapping-17 clang-format-17 clang-include-cleaner-17 clang-include-fixer-17 clang-linker-wrapper-17 clang-move-17 clang-offload-bundler-17 clang-offload-packager-17 clang-pseudo-17 clang-query-17 clang-refactor-17 clang-rename-17 clang-reorder-fields-17 clang-repl-17 clang-scan-deps-17 clang-tblgen-17 clang-tidy-17 count-17 diagtool-17 dsymutil-17 FileCheck-17 find-all-symbols-17 git-clang-format-17 hmaptool-17 intercept-build-17 ld64.lld-17 ld.lld-17 llc-17 lld-17 lldb-17 lldb-argdumper-17 lldb-instr-17 lldb-server-17 lldb-vscode-17 lld-link-17 lli-17 lli-child-target-17 llvm-addr2line-17 llvm-ar-17 llvm-as-17 llvm-bcanalyzer-17 llvm-bitcode-strip-17 llvm-cat-17 llvm-cfi-verify-17 llvm-config-17 llvm-cov-17 llvm-c-test-17 llvm-cvtres-17 llvm-cxxdump-17 llvm-cxxfilt-17 llvm-cxxmap-17 llvm-debuginfo-analyzer-17 llvm-debuginfod-17 llvm-debuginfod-find-17 llvm-diff-17 llvm-dis-17 llvm-dlltool-17 llvm-dwarfdump-17 llvm-dwarfutil-17 llvm-dwp-17 llvm-exegesis-17 llvm-extract-17 llvm-gsymutil-17 llvm-ifs-17 llvm-install-name-tool-17 llvm-jitlink-17 llvm-jitlink-executor-17 llvm-lib-17 llvm-libtool-darwin-17 llvm-link-17 llvm-lipo-17 llvm-lto-17 llvm-lto2-17 llvm-mc-17 llvm-mca-17 llvm-ml-17 llvm-modextract-17 llvm-mt-17 llvm-nm-17 llvm-objcopy-17 llvm-objdump-17 llvm-omp-device-info-17 llvm-omp-kernel-replay-17 llvm-opt-report-17 llvm-otool-17 llvm-pdbutil-17 llvm-PerfectShuffle-17 llvm-profdata-17 llvm-profgen-17 llvm-ranlib-17 llvm-rc-17 llvm-readelf-17 llvm-readobj-17 llvm-reduce-17 llvm-remark-size-diff-17 llvm-remarkutil-17 llvm-rtdyld-17 llvm-sim-17 llvm-size-17 llvm-split-17 llvm-stress-17 llvm-strings-17 llvm-strip-17 llvm-symbolizer-17 llvm-tapi-diff-17 llvm-tblgen-17 llvm-tli-checker-17 llvm-undname-17 llvm-windres-17 llvm-xray-17 modularize-17 not-17 nvptx-arch-17 obj2yaml-17 opt-17 pp-trace-17 run-clang-tidy-17 sancov-17 sanstats-17 scan-build-17 scan-build-py-17 scan-view-17 split-file-17 UnicodeNameMappingGenerator-17 verify-uselistorder-17 wasm-ld-17 yaml2obj-17 yaml-bench-17
[Adding alternative /usr/bin/clang-17: succeeded]

[Adding alternative /usr/bin/clang-18 ...]
Master command: clang-18
Slave commands: amdgpu-arch-18 analyze-build-18 bugpoint-18 c-index-test-18 clang++-18 clang-apply-replacements-18 clang-change-namespace-18 clang-check-18 clang-cl-18 clang-cpp-18 clangd-18 clang-doc-18 clang-extdef-mapping-18 clang-format-18 clang-include-cleaner-18 clang-include-fixer-18 clang-linker-wrapper-18 clang-move-18 clang-offload-bundler-18 clang-offload-packager-18 clang-pseudo-18 clang-query-18 clang-refactor-18 clang-rename-18 clang-reorder-fields-18 clang-repl-18 clang-scan-deps-18 clang-tblgen-18 clang-tidy-18 count-18 diagtool-18 dsymutil-18 FileCheck-18 find-all-symbols-18 git-clang-format-18 hmaptool-18 intercept-build-18 ld64.lld-18 ld.lld-18 llc-18 lld-18 lld-link-18 lli-18 lli-child-target-18 llvm-addr2line-18 llvm-ar-18 llvm-as-18 llvm-bcanalyzer-18 llvm-bitcode-strip-18 llvm-cat-18 llvm-cfi-verify-18 llvm-config-18 llvm-cov-18 llvm-c-test-18 llvm-cvtres-18 llvm-cxxdump-18 llvm-cxxfilt-18 llvm-cxxmap-18 llvm-debuginfo-analyzer-18 llvm-debuginfod-18 llvm-debuginfod-find-18 llvm-diff-18 llvm-dis-18 llvm-dlltool-18 llvm-dwarfdump-18 llvm-dwarfutil-18 llvm-dwp-18 llvm-exegesis-18 llvm-extract-18 llvm-gsymutil-18 llvm-ifs-18 llvm-install-name-tool-18 llvm-jitlink-18 llvm-jitlink-executor-18 llvm-lib-18 llvm-libtool-darwin-18 llvm-link-18 llvm-lipo-18 llvm-lto-18 llvm-lto2-18 llvm-mc-18 llvm-mca-18 llvm-ml-18 llvm-modextract-18 llvm-mt-18 llvm-nm-18 llvm-objcopy-18 llvm-objdump-18 llvm-opt-report-18 llvm-otool-18 llvm-pdbutil-18 llvm-PerfectShuffle-18 llvm-profdata-18 llvm-profgen-18 llvm-ranlib-18 llvm-rc-18 llvm-readelf-18 llvm-readobj-18 llvm-readtapi-18 llvm-reduce-18 llvm-remarkutil-18 llvm-rtdyld-18 llvm-sim-18 llvm-size-18 llvm-split-18 llvm-stress-18 llvm-strings-18 llvm-strip-18 llvm-symbolizer-18 llvm-tblgen-18 llvm-tli-checker-18 llvm-undname-18 llvm-windres-18 llvm-xray-18 modularize-18 not-18 nvptx-arch-18 obj2yaml-18 opt-18 pp-trace-18 run-clang-tidy-18 sancov-18 sanstats-18 scan-build-18 scan-build-py-18 scan-view-18 split-file-18 UnicodeNameMappingGenerator-18 verify-uselistorder-18 wasm-ld-18 yaml2obj-18 yaml-bench-18
[Adding alternative /usr/bin/clang-18: succeeded]

======================================================================
clang alternative is set to: /usr/bin/clang-18
======================================================================

Info:
  use 'sudo update-alternatives --config clang' to change default clang alternative
  use 'sudo update-alternatives --remove clang /usr/bin/clang-*' to delete a clang alternative
  use 'sudo update-alternatives --remove-all clang' to delete all clang alternatives

@amirsojoodi
Copy link

I had to add a bunch of other slaves to clang config, including clangd, clang-tidy, etc.

#!/usr/bin/env bash

#     --slave /usr/bin/$1 $1 /usr/bin/$1-\${version} \\

function register_clang_version {
    local version=$1
    local priority=$2

    update-alternatives \
         --verbose \
        --install /usr/bin/llvm-config          llvm-config          /usr/bin/llvm-config-${version} ${priority} \
        --slave   /usr/bin/llvm-ar              llvm-ar              /usr/bin/llvm-ar-${version} \
        --slave   /usr/bin/llvm-as              llvm-as              /usr/bin/llvm-as-${version} \
        --slave   /usr/bin/llvm-bcanalyzer      llvm-bcanalyzer      /usr/bin/llvm-bcanalyzer-${version} \
        --slave   /usr/bin/llvm-c-test          llvm-c-test          /usr/bin/llvm-c-test-${version} \
        --slave   /usr/bin/llvm-cat             llvm-cat             /usr/bin/llvm-cat-${version} \
        --slave   /usr/bin/llvm-cfi-verify      llvm-cfi-verify      /usr/bin/llvm-cfi-verify-${version} \
        --slave   /usr/bin/llvm-cov             llvm-cov             /usr/bin/llvm-cov-${version} \
        --slave   /usr/bin/llvm-cvtres          llvm-cvtres          /usr/bin/llvm-cvtres-${version} \
        --slave   /usr/bin/llvm-cxxdump         llvm-cxxdump         /usr/bin/llvm-cxxdump-${version} \
        --slave   /usr/bin/llvm-cxxfilt         llvm-cxxfilt         /usr/bin/llvm-cxxfilt-${version} \
        --slave   /usr/bin/llvm-diff            llvm-diff            /usr/bin/llvm-diff-${version} \
        --slave   /usr/bin/llvm-dis             llvm-dis             /usr/bin/llvm-dis-${version} \
        --slave   /usr/bin/llvm-dlltool         llvm-dlltool         /usr/bin/llvm-dlltool-${version} \
        --slave   /usr/bin/llvm-dwarfdump       llvm-dwarfdump       /usr/bin/llvm-dwarfdump-${version} \
        --slave   /usr/bin/llvm-dwp             llvm-dwp             /usr/bin/llvm-dwp-${version} \
        --slave   /usr/bin/llvm-exegesis        llvm-exegesis        /usr/bin/llvm-exegesis-${version} \
        --slave   /usr/bin/llvm-extract         llvm-extract         /usr/bin/llvm-extract-${version} \
        --slave   /usr/bin/llvm-lib             llvm-lib             /usr/bin/llvm-lib-${version} \
        --slave   /usr/bin/llvm-link            llvm-link            /usr/bin/llvm-link-${version} \
        --slave   /usr/bin/llvm-lto             llvm-lto             /usr/bin/llvm-lto-${version} \
        --slave   /usr/bin/llvm-lto2            llvm-lto2            /usr/bin/llvm-lto2-${version} \
        --slave   /usr/bin/llvm-mc              llvm-mc              /usr/bin/llvm-mc-${version} \
        --slave   /usr/bin/llvm-mca             llvm-mca             /usr/bin/llvm-mca-${version} \
        --slave   /usr/bin/llvm-modextract      llvm-modextract      /usr/bin/llvm-modextract-${version} \
        --slave   /usr/bin/llvm-mt              llvm-mt              /usr/bin/llvm-mt-${version} \
        --slave   /usr/bin/llvm-nm              llvm-nm              /usr/bin/llvm-nm-${version} \
        --slave   /usr/bin/llvm-objcopy         llvm-objcopy         /usr/bin/llvm-objcopy-${version} \
        --slave   /usr/bin/llvm-objdump         llvm-objdump         /usr/bin/llvm-objdump-${version} \
        --slave   /usr/bin/llvm-opt-report      llvm-opt-report      /usr/bin/llvm-opt-report-${version} \
        --slave   /usr/bin/llvm-pdbutil         llvm-pdbutil         /usr/bin/llvm-pdbutil-${version} \
        --slave   /usr/bin/llvm-PerfectShuffle  llvm-PerfectShuffle  /usr/bin/llvm-PerfectShuffle-${version} \
        --slave   /usr/bin/llvm-profdata        llvm-profdata        /usr/bin/llvm-profdata-${version} \
        --slave   /usr/bin/llvm-ranlib          llvm-ranlib          /usr/bin/llvm-ranlib-${version} \
        --slave   /usr/bin/llvm-rc              llvm-rc              /usr/bin/llvm-rc-${version} \
        --slave   /usr/bin/llvm-readelf         llvm-readelf         /usr/bin/llvm-readelf-${version} \
        --slave   /usr/bin/llvm-readobj         llvm-readobj         /usr/bin/llvm-readobj-${version} \
        --slave   /usr/bin/llvm-rtdyld          llvm-rtdyld          /usr/bin/llvm-rtdyld-${version} \
        --slave   /usr/bin/llvm-size            llvm-size            /usr/bin/llvm-size-${version} \
        --slave   /usr/bin/llvm-split           llvm-split           /usr/bin/llvm-split-${version} \
        --slave   /usr/bin/llvm-stress          llvm-stress          /usr/bin/llvm-stress-${version} \
        --slave   /usr/bin/llvm-strings         llvm-strings         /usr/bin/llvm-strings-${version} \
        --slave   /usr/bin/llvm-strip           llvm-strip           /usr/bin/llvm-strip-${version} \
        --slave   /usr/bin/llvm-symbolizer      llvm-symbolizer      /usr/bin/llvm-symbolizer-${version} \
        --slave   /usr/bin/llvm-tblgen          llvm-tblgen          /usr/bin/llvm-tblgen-${version} \
        --slave   /usr/bin/llvm-undname         llvm-undname         /usr/bin/llvm-undname-${version} \
        --slave   /usr/bin/llvm-xray            llvm-xray            /usr/bin/llvm-xray-${version}
        

    update-alternatives \
         --verbose \
        --install /usr/bin/clang                clang                /usr/bin/clang-${version} ${priority} \
        --slave   /usr/bin/clang++              clang++              /usr/bin/clang++-${version}  \
        --slave   /usr/bin/clang-format         clang-format         /usr/bin/clang-format-${version}  \
        --slave   /usr/bin/clang-cpp            clang-cpp            /usr/bin/clang-cpp-${version} \
        --slave   /usr/bin/clang-cl             clang-cl             /usr/bin/clang-cl-${version} \
        --slave   /usr/bin/clangd               clangd               /usr/bin/clangd-${version} \
        --slave   /usr/bin/clang-tidy           clang-tidy           /usr/bin/clang-tidy-${version} \
        --slave   /usr/bin/clang-check          clang-check          /usr/bin/clang-check-${version} \
        --slave   /usr/bin/clang-query          clang-query          /usr/bin/clang-query-${version} \
        --slave   /usr/bin/asan_symbolize       asan_symbolize       /usr/bin/asan_symbolize-${version} \
        --slave   /usr/bin/bugpoint             bugpoint             /usr/bin/bugpoint-${version} \
        --slave   /usr/bin/dsymutil             dsymutil             /usr/bin/dsymutil-${version} \
        --slave   /usr/bin/lld                  lld                  /usr/bin/lld-${version} \
        --slave   /usr/bin/ld.lld               ld.lld               /usr/bin/ld.lld-${version} \
        --slave   /usr/bin/lld-link             lld-link             /usr/bin/lld-link-${version} \
        --slave   /usr/bin/llc                  llc                  /usr/bin/llc-${version} \
        --slave   /usr/bin/lli                  lli                  /usr/bin/lli-${version} \
        --slave   /usr/bin/obj2yaml             obj2yaml             /usr/bin/obj2yaml-${version} \
        --slave   /usr/bin/opt                  opt                  /usr/bin/opt-${version} \
        --slave   /usr/bin/sanstats             sanstats             /usr/bin/sanstats-${version} \
        --slave   /usr/bin/verify-uselistorder  verify-uselistorder  /usr/bin/verify-uselistorder-${version} \
        --slave   /usr/bin/wasm-ld              wasm-ld              /usr/bin/wasm-ld-${version} \
        --slave   /usr/bin/yaml2obj             yaml2obj             /usr/bin/yaml2obj-${version}
        
}

register_clang_version $1 $2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment