Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ssledz/57119a93cb8debd3b17cd8f8acdee9d3 to your computer and use it in GitHub Desktop.
Save ssledz/57119a93cb8debd3b17cd8f8acdee9d3 to your computer and use it in GitHub Desktop.
Proper GCC (vers. 5/6/7) & LLVM/CLANG (vers. 4/5) Toolchain Setup on Ubuntu/Linux Mint
#!/usr/bin/env sh
# Remove all existing alternatives
sudo update-alternatives --remove-all cc
# exit on first error
set -e
sudo update-alternatives \
--install /usr/bin/cc cc /usr/bin/gcc 30 \
--slave /usr/bin/c++ c++ /usr/bin/g++ \
--slave /usr/bin/ld ld /usr/bin/x86_64-linux-gnu-ld
sudo update-alternatives \
--install /usr/bin/cc cc /usr/bin/clang 20 \
--slave /usr/bin/c++ c++ /usr/bin/clang++ \
--slave /usr/bin/ld ld /usr/bin/lld
#!/usr/bin/env sh
# Remove all existing alternatives
sudo update-alternatives --remove-all gcc
# exit on first error
set -e
# To install gcc toolchain versions 5/6/7.
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
sudo apt update
sudo apt install -y gcc-5 g++-5 gfortran-5 cpp-5
sudo apt install -y gcc-6 g++-6 gfortran-6 cpp-6
sudo apt install -y gcc-7 g++-7 gfortran-7 cpp-7
# GCC 7.x
sudo update-alternatives \
--install /usr/bin/gcc gcc /usr/bin/gcc-7 30 \
--slave /usr/bin/g++ g++ /usr/bin/g++-7 \
--slave /usr/bin/cpp cpp /usr/bin/cpp-7 \
--slave /usr/bin/gfortran gfortran /usr/bin/gfortran-7 \
--slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-7 \
--slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-7 \
--slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-7 \
--slave /usr/bin/gcov gcov /usr/bin/gcov-7 \
--slave /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-7 \
--slave /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-7
# GCC 6.x
sudo update-alternatives \
--install /usr/bin/gcc gcc /usr/bin/gcc-6 20 \
--slave /usr/bin/g++ g++ /usr/bin/g++-6 \
--slave /usr/bin/cpp cpp /usr/bin/cpp-6 \
--slave /usr/bin/gfortran gfortran /usr/bin/gfortran-6 \
--slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-6 \
--slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-6 \
--slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-6 \
--slave /usr/bin/gcov gcov /usr/bin/gcov-6 \
--slave /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-6 \
--slave /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-6
# GCC 5.x
sudo update-alternatives \
--install /usr/bin/gcc gcc /usr/bin/gcc-5 10 \
--slave /usr/bin/g++ g++ /usr/bin/g++-5 \
--slave /usr/bin/cpp cpp /usr/bin/cpp-5 \
--slave /usr/bin/gfortran gfortran /usr/bin/gfortran-5 \
--slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-5 \
--slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-5 \
--slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-5 \
--slave /usr/bin/gcov gcov /usr/bin/gcov-5 \
--slave /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-5 \
--slave /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-5
#!/usr/bin/env sh
# Remove all existing alternatives
sudo update-alternatives --remove-all llvm
sudo update-alternatives --remove-all clang
# exit on first error
set -e
# To Install llvm/clang 4.0/5.0
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
sudo apt-add-repository -y "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-4.0 main"
sudo apt-add-repository "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-5.0 main"
sudo apt update
sudo apt install -y clang-5.0 llvm-5.0 lld-5.0 lldb-5.0
sudo apt install clang-{format,tidy,tools}-5.0 clang-5.0-doc clang-5.0-examples
sudo apt install -y clang-4.0 llvm-4.0 lld-4.0
sudo apt install clang-{format,tidy}-4.0
# llvm-5.0 and clang-5.0
sudo update-alternatives \
--install /usr/lib/llvm llvm /usr/lib/llvm-5.0 20 \
--slave /usr/bin/llvm-config llvm-config /usr/bin/llvm-config-5.0 \
--slave /usr/bin/llvm-ar llvm-ar /usr/bin/llvm-ar-5.0 \
--slave /usr/bin/llvm-as llvm-as /usr/bin/llvm-as-5.0 \
--slave /usr/bin/llvm-bcanalyzer llvm-bcanalyzer /usr/bin/llvm-bcanalyzer-5.0 \
--slave /usr/bin/llvm-cov llvm-cov /usr/bin/llvm-cov-5.0 \
--slave /usr/bin/llvm-diff llvm-diff /usr/bin/llvm-diff-5.0 \
--slave /usr/bin/llvm-dis llvm-dis /usr/bin/llvm-dis-5.0 \
--slave /usr/bin/llvm-dwarfdump llvm-dwarfdump /usr/bin/llvm-dwarfdump-5.0 \
--slave /usr/bin/llvm-extract llvm-extract /usr/bin/llvm-extract-5.0 \
--slave /usr/bin/llvm-link llvm-link /usr/bin/llvm-link-5.0 \
--slave /usr/bin/llvm-mc llvm-mc /usr/bin/llvm-mc-5.0 \
--slave /usr/bin/llvm-mcmarkup llvm-mcmarkup /usr/bin/llvm-mcmarkup-5.0 \
--slave /usr/bin/llvm-nm llvm-nm /usr/bin/llvm-nm-5.0 \
--slave /usr/bin/llvm-objdump llvm-objdump /usr/bin/llvm-objdump-5.0 \
--slave /usr/bin/llvm-ranlib llvm-ranlib /usr/bin/llvm-ranlib-5.0 \
--slave /usr/bin/llvm-readobj llvm-readobj /usr/bin/llvm-readobj-5.0 \
--slave /usr/bin/llvm-rtdyld llvm-rtdyld /usr/bin/llvm-rtdyld-5.0 \
--slave /usr/bin/llvm-size llvm-size /usr/bin/llvm-size-5.0 \
--slave /usr/bin/llvm-stress llvm-stress /usr/bin/llvm-stress-5.0 \
--slave /usr/bin/llvm-symbolizer llvm-symbolizer /usr/bin/llvm-symbolizer-5.0 \
--slave /usr/bin/llvm-tblgen llvm-tblgen /usr/bin/llvm-tblgen-5.0
sudo update-alternatives \
--install /usr/bin/clang clang /usr/bin/clang-5.0 20 \
--slave /usr/bin/clang++ clang++ /usr/bin/clang++-5.0 \
--slave /usr/bin/lld lld /usr/bin/lld-5.0 \
--slave /usr/bin/clang-format clang-format /usr/bin/clang-format-5.0 \
--slave /usr/bin/clang-tidy clang-tidy /usr/bin/clang-tidy-5.0 \
--slave /usr/bin/clang-tidy-diff.py clang-tidy-diff.py /usr/bin/clang-tidy-diff-5.0.py \
--slave /usr/bin/clang-include-fixer clang-include-fixer /usr/bin/clang-include-fixer-5.0 \
--slave /usr/bin/clang-offload-bundler clang-offload-bundler /usr/bin/clang-offload-bundler-5.0 \
--slave /usr/bin/clangd clangd /usr/bin/clangd-5.0 \
--slave /usr/bin/clang-check clang-check /usr/bin/clang-check-5.0 \
--slave /usr/bin/scan-view scan-view /usr/bin/scan-view-5.0 \
--slave /usr/bin/clang-apply-replacements clang-apply-replacements /usr/bin/clang-apply-replacements-5.0 \
--slave /usr/bin/clang-query clang-query /usr/bin/clang-query-5.0 \
--slave /usr/bin/modularize modularize /usr/bin/modularize-5.0 \
--slave /usr/bin/sancov sancov /usr/bin/sancov-5.0 \
--slave /usr/bin/c-index-test c-index-test /usr/bin/c-index-test-5.0 \
--slave /usr/bin/clang-reorder-fields clang-reorder-fields /usr/bin/clang-reorder-fields-5.0 \
--slave /usr/bin/clang-change-namespace clang-change-namespace /usr/bin/clang-change-namespace-5.0 \
--slave /usr/bin/clang-import-test clang-import-test /usr/bin/clang-import-test-5.0 \
--slave /usr/bin/scan-build scan-build /usr/bin/scan-build-5.0 \
--slave /usr/bin/scan-build-py scan-build-py /usr/bin/scan-build-py-5.0 \
--slave /usr/bin/clang-cl clang-cl /usr/bin/clang-cl-5.0 \
--slave /usr/bin/clang-rename clang-rename /usr/bin/clang-rename-5.0 \
--slave /usr/bin/find-all-symbols find-all-symbols /usr/bin/find-all-symbols-5.0 \
--slave /usr/bin/lldb lldb /usr/bin/lldb-5.0 \
--slave /usr/bin/lldb-server lldb-server /usr/bin/lldb-server-5.0
# llvm-4.0 and clang-4.0
sudo update-alternatives \
--install /usr/lib/llvm llvm /usr/lib/llvm-4.0 10 \
--slave /usr/bin/llvm-config llvm-config /usr/bin/llvm-config-4.0 \
--slave /usr/bin/llvm-ar llvm-ar /usr/bin/llvm-ar-4.0 \
--slave /usr/bin/llvm-as llvm-as /usr/bin/llvm-as-4.0 \
--slave /usr/bin/llvm-bcanalyzer llvm-bcanalyzer /usr/bin/llvm-bcanalyzer-4.0 \
--slave /usr/bin/llvm-cov llvm-cov /usr/bin/llvm-cov-4.0 \
--slave /usr/bin/llvm-diff llvm-diff /usr/bin/llvm-diff-4.0 \
--slave /usr/bin/llvm-dis llvm-dis /usr/bin/llvm-dis-4.0 \
--slave /usr/bin/llvm-dwarfdump llvm-dwarfdump /usr/bin/llvm-dwarfdump-4.0 \
--slave /usr/bin/llvm-extract llvm-extract /usr/bin/llvm-extract-4.0 \
--slave /usr/bin/llvm-link llvm-link /usr/bin/llvm-link-4.0 \
--slave /usr/bin/llvm-mc llvm-mc /usr/bin/llvm-mc-4.0 \
--slave /usr/bin/llvm-mcmarkup llvm-mcmarkup /usr/bin/llvm-mcmarkup-4.0 \
--slave /usr/bin/llvm-nm llvm-nm /usr/bin/llvm-nm-4.0 \
--slave /usr/bin/llvm-objdump llvm-objdump /usr/bin/llvm-objdump-4.0 \
--slave /usr/bin/llvm-ranlib llvm-ranlib /usr/bin/llvm-ranlib-4.0 \
--slave /usr/bin/llvm-readobj llvm-readobj /usr/bin/llvm-readobj-4.0 \
--slave /usr/bin/llvm-rtdyld llvm-rtdyld /usr/bin/llvm-rtdyld-4.0 \
--slave /usr/bin/llvm-size llvm-size /usr/bin/llvm-size-4.0 \
--slave /usr/bin/llvm-stress llvm-stress /usr/bin/llvm-stress-4.0 \
--slave /usr/bin/llvm-symbolizer llvm-symbolizer /usr/bin/llvm-symbolizer-4.0 \
--slave /usr/bin/llvm-tblgen llvm-tblgen /usr/bin/llvm-tblgen-4.0
sudo update-alternatives \
--install /usr/bin/clang clang /usr/bin/clang-4.0 10 \
--slave /usr/bin/clang++ clang++ /usr/bin/clang++-4.0 \
--slave /usr/bin/lld lld /usr/bin/lld-4.0 \
--slave /usr/bin/clang-format clang-format /usr/bin/clang-format-4.0 \
--slave /usr/bin/clang-tidy clang-tidy /usr/bin/clang-tidy-4.0 \
--slave /usr/bin/clang-tidy-diff.py clang-tidy-diff.py /usr/bin/clang-tidy-diff-4.0.py #\

This approach uses update-alternatives to manage GCC and LLVM/CLANG C/C++ compiler toolchains. Although tested on Linux Mint 18.3, this approach should work on any Debian based distro or for that matter any Linux distro with update-alternatives support, provided the packages are installed correctly.

There are 3 files

  • gcc-alternatives.sh installs GCC versions 5/6/7 and sets up alternatives for gcc/g++/cpp/gfortran.
  • llvm-clang-alternatives.sh installs LLVM and CLANG versions 4/5 and sets up alternatives for various LLVM and CLANG programs including clang and clang++.
  • cc-alternatives.sh sets up alternatives for the cc, cxx, and the ld commands. This script can be used to change systemwide default compiler/linker combination to either GCC or CLANG.

Once these scripts are run you can change the system GCC/CLANG versions by running sudo update-alternatives --config gcc|clang. To change the default compiler/linker combo used by the system do sudo update-alternatives --config cc.

NOTE: Both the gcc and the clang compilers use the libstdc++, the C++ standards library which is the default on Linux. There are ways to build libc++, which is an LLVM provided alternative to libstdc++ and use that instead, but there are hardly any advantages to doing that, so I haven't included notes for that here.

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