Last active
July 4, 2024 09:47
-
-
Save bhaskarvk/78a80d9b5d308c84ba43b4a4e599a439 to your computer and use it in GitHub Desktop.
Revisions
-
bhaskarvk renamed this gist
Feb 16, 2018 . 1 changed file with 0 additions and 0 deletions.There are no files selected for viewing
File renamed without changes. -
bhaskarvk revised this gist
Feb 16, 2018 . 4 changed files with 186 additions and 1 deletion.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal 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. 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. This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal 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 This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal 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 This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal 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 #\ -
bhaskarvk created this gist
Feb 16, 2018 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal 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.