Skip to content

Instantly share code, notes, and snippets.

@bhaskarvk
Last active July 4, 2024 09:47
Show Gist options
  • Select an option

  • Save bhaskarvk/78a80d9b5d308c84ba43b4a4e599a439 to your computer and use it in GitHub Desktop.

Select an option

Save bhaskarvk/78a80d9b5d308c84ba43b4a4e599a439 to your computer and use it in GitHub Desktop.

Revisions

  1. bhaskarvk renamed this gist Feb 16, 2018. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  2. bhaskarvk revised this gist Feb 16, 2018. 4 changed files with 186 additions and 1 deletion.
    12 changes: 11 additions & 1 deletion README.md
    Original file line number Diff line number Diff line change
    @@ -1,2 +1,12 @@
    This approach uses [update-alternatives](https://linux.die.net/man/8/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.
    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](https://gcc.gnu.org/onlinedocs/libstdc++/) which is the default on Linux. There are ways to build `libc++`, which is an LLVM provided [alternative](https://libcxx.llvm.org/) to `libstdc++` and use that instead, but there are hardly any advantages to doing that, so I haven't included notes for that here.
    17 changes: 17 additions & 0 deletions cc-alternatives.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,17 @@
    #!/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
    53 changes: 53 additions & 0 deletions gcc-alternatives.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,53 @@
    #!/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
    105 changes: 105 additions & 0 deletions llvm-clang-alternatives.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,105 @@
    #!/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 #\

  3. bhaskarvk created this gist Feb 16, 2018.
    2 changes: 2 additions & 0 deletions README.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,2 @@
    This approach uses [update-alternatives](https://linux.die.net/man/8/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.