Skip to content

Instantly share code, notes, and snippets.

@lopesivan
Last active July 5, 2023 04:57
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save lopesivan/6f638631552ed7090e2236cd83358028 to your computer and use it in GitHub Desktop.
Save lopesivan/6f638631552ed7090e2236cd83358028 to your computer and use it in GitHub Desktop.
update-alternatives
#!/usr/bin/env bash
test -n "$DEBUG" && set -x
# __ __ ___
# /\ \\ \ /'___`\
# \ \ \\ \ /\_\ /\ \
# \ \ \\ \_\/_/// /__
# \ \__ ,__\ // /_\ \
# \/_/\_\_//\______/
# \/_/ \/_____/
# Algoritimos
#
#
# Author: Ivan Lopes
# Mail: ivan@42algoritmos.com.br
# Site: http://www.42algoritmos.com.br
# License: gpl
# Phone: +1 561 801 7985
# Language: Shell Script
# File: u.sh
# Date: Sex 03 Ago 2018 03:39:01 -03
# Description:
# ----------------------------------------------------------------------------
# Modo strict
set -euo pipefail
# ----------------------------------------------------------------------------
##############################################################################
##############################################################################
##############################################################################
# ----------------------------------------------------------------------------
versions=(
5 6 7 8
)
let i=50
for v in ${versions[*]}; do
echo -e '\e[1;49;36m'gcc-${v}'\e[0m' >&2
echo -n sudo update-alternatives
echo -n " "--install /usr/bin/gcc gcc /usr/bin/gcc-$v $i
dpkg -L gcc-$v g++-$v|
awk -F'/bin/' '/.*bin\// {print $2}' |
while read line; do
[[ "$line" == "gcc-$v" ]] && continue
cmd=${line%-*}
echo -n " "--slave /usr/bin/$cmd $cmd /usr/bin/$line
done
echo
let i=$((i + 10))
done
# ----------------------------------------------------------------------------
exit 0
@lopesivan
Copy link
Author

sudo update-alternatives  \
  --install /usr/bin/gcc gcc /usr/bin/gcc-5 50  \
  --slave /usr/bin/gcov gcov /usr/bin/gcov-5  \
  --slave /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-5  \
  --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-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/gcov-dump gcov-dump /usr/bin/gcov-dump-5  \
  --slave /usr/bin/x86_64-linux-gnu-gcc-ar x86_64-linux-gnu-gcc-ar /usr/bin/x86_64-linux-gnu-gcc-ar-5  \
  --slave /usr/bin/x86_64-linux-gnu-gcov-tool x86_64-linux-gnu-gcov-tool /usr/bin/x86_64-linux-gnu-gcov-tool-5  \
  --slave /usr/bin/x86_64-linux-gnu-gcc x86_64-linux-gnu-gcc /usr/bin/x86_64-linux-gnu-gcc-5  \
  --slave /usr/bin/x86_64-linux-gnu-gcc-ranlib x86_64-linux-gnu-gcc-ranlib /usr/bin/x86_64-linux-gnu-gcc-ranlib-5  \
  --slave /usr/bin/x86_64-linux-gnu-gcov-dump x86_64-linux-gnu-gcov-dump /usr/bin/x86_64-linux-gnu-gcov-dump-5  \
  --slave /usr/bin/x86_64-linux-gnu-gcov x86_64-linux-gnu-gcov /usr/bin/x86_64-linux-gnu-gcov-5  \
  --slave /usr/bin/x86_64-linux-gnu-gcc-nm x86_64-linux-gnu-gcc-nm /usr/bin/x86_64-linux-gnu-gcc-nm-5  \
  --slave /usr/bin/g++ g++ /usr/bin/g++-5  \
  --slave /usr/bin/x86_64-linux-gnu-g++ x86_64-linux-gnu-g++ /usr/bin/x86_64-linux-gnu-g++-5

sudo update-alternatives  \
  --install /usr/bin/gcc gcc /usr/bin/gcc-6 60  \
  --slave /usr/bin/x86_64-linux-gnu-gcov-dump x86_64-linux-gnu-gcov-dump /usr/bin/x86_64-linux-gnu-gcov-dump-6  \
  --slave /usr/bin/x86_64-linux-gnu-gcov-tool x86_64-linux-gnu-gcov-tool /usr/bin/x86_64-linux-gnu-gcov-tool-6  \
  --slave /usr/bin/x86_64-linux-gnu-gcov x86_64-linux-gnu-gcov /usr/bin/x86_64-linux-gnu-gcov-6  \
  --slave /usr/bin/x86_64-linux-gnu-gcc x86_64-linux-gnu-gcc /usr/bin/x86_64-linux-gnu-gcc-6  \
  --slave /usr/bin/x86_64-linux-gnu-gcc-ar x86_64-linux-gnu-gcc-ar /usr/bin/x86_64-linux-gnu-gcc-ar-6  \
  --slave /usr/bin/x86_64-linux-gnu-gcc-nm x86_64-linux-gnu-gcc-nm /usr/bin/x86_64-linux-gnu-gcc-nm-6  \
  --slave /usr/bin/x86_64-linux-gnu-gcc-ranlib x86_64-linux-gnu-gcc-ranlib /usr/bin/x86_64-linux-gnu-gcc-ranlib-6  \
  --slave /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-6  \
  --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-6  \
  --slave /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-6  \
  --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-6  \
  --slave /usr/bin/gcov gcov /usr/bin/gcov-6  \
  --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-6  \
  --slave /usr/bin/x86_64-linux-gnu-g++ x86_64-linux-gnu-g++ /usr/bin/x86_64-linux-gnu-g++-6  \
  --slave /usr/bin/g++ g++ /usr/bin/g++-6

sudo update-alternatives  \
  --install /usr/bin/gcc gcc /usr/bin/gcc-7 70  \
  --slave /usr/bin/x86_64-linux-gnu-gcov-tool x86_64-linux-gnu-gcov-tool /usr/bin/x86_64-linux-gnu-gcov-tool-7  \
  --slave /usr/bin/x86_64-linux-gnu-gcc x86_64-linux-gnu-gcc /usr/bin/x86_64-linux-gnu-gcc-7  \
  --slave /usr/bin/x86_64-linux-gnu-gcc-ar x86_64-linux-gnu-gcc-ar /usr/bin/x86_64-linux-gnu-gcc-ar-7  \
  --slave /usr/bin/x86_64-linux-gnu-gcov-dump x86_64-linux-gnu-gcov-dump /usr/bin/x86_64-linux-gnu-gcov-dump-7  \
  --slave /usr/bin/x86_64-linux-gnu-gcov x86_64-linux-gnu-gcov /usr/bin/x86_64-linux-gnu-gcov-7  \
  --slave /usr/bin/x86_64-linux-gnu-gcc-nm x86_64-linux-gnu-gcc-nm /usr/bin/x86_64-linux-gnu-gcc-nm-7  \
  --slave /usr/bin/x86_64-linux-gnu-gcc-ranlib x86_64-linux-gnu-gcc-ranlib /usr/bin/x86_64-linux-gnu-gcc-ranlib-7  \
  --slave /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-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/gcov gcov /usr/bin/gcov-7  \
  --slave /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-7  \
  --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-7  \
  --slave /usr/bin/x86_64-linux-gnu-g++ x86_64-linux-gnu-g++ /usr/bin/x86_64-linux-gnu-g++-7  \
  --slave /usr/bin/g++ g++ /usr/bin/g++-7

sudo update-alternatives  \
  --install /usr/bin/gcc gcc /usr/bin/gcc-8 80  \
  --slave /usr/bin/x86_64-linux-gnu-gcc-ar x86_64-linux-gnu-gcc-ar /usr/bin/x86_64-linux-gnu-gcc-ar-8  \
  --slave /usr/bin/x86_64-linux-gnu-gcc-ranlib x86_64-linux-gnu-gcc-ranlib /usr/bin/x86_64-linux-gnu-gcc-ranlib-8  \
  --slave /usr/bin/x86_64-linux-gnu-gcov-tool x86_64-linux-gnu-gcov-tool /usr/bin/x86_64-linux-gnu-gcov-tool-8  \
  --slave /usr/bin/x86_64-linux-gnu-gcc-nm x86_64-linux-gnu-gcc-nm /usr/bin/x86_64-linux-gnu-gcc-nm-8  \
  --slave /usr/bin/x86_64-linux-gnu-gcc x86_64-linux-gnu-gcc /usr/bin/x86_64-linux-gnu-gcc-8  \
  --slave /usr/bin/x86_64-linux-gnu-gcov x86_64-linux-gnu-gcov /usr/bin/x86_64-linux-gnu-gcov-8  \
  --slave /usr/bin/x86_64-linux-gnu-gcov-dump x86_64-linux-gnu-gcov-dump /usr/bin/x86_64-linux-gnu-gcov-dump-8  \
  --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-8  \
  --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-8  \
  --slave /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-8  \
  --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-8  \
  --slave /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-8  \
  --slave /usr/bin/gcov gcov /usr/bin/gcov-8  \
  --slave /usr/bin/x86_64-linux-gnu-g++ x86_64-linux-gnu-g++ /usr/bin/x86_64-linux-gnu-g++-8  \
  --slave /usr/bin/g++ g++ /usr/bin/g++-8

@JPvRiel
Copy link

JPvRiel commented Sep 17, 2021

Thanks for this, very useful! Helped me fix an issue where I thought I was building python with gcc 10, but because the generated python make file used x86_64-linux-gnu-gcc and not gcc, it was actually building with gcc 9...

On Ubuntu 20.04, with gcc9 and gcc10, I refactored this and generated the command to use via:

versions=(9 10)
i=90
for v in ${versions[*]}; do
    echo -e '\e[1;49;36m'"gcc-${v}"'\e[0m' >&2
    cmd_str_install="sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$v $i\n"
    cmd_str_slaves=$(
        dpkg -L "gcc-$v" "g++-$v" |
            awk -F'/bin/' '/.*bin\// {print $2}' |
                while read -r line; do
                    [[ "$line" == "gcc-$v" ]] && continue
                    cmd=${line%-*}
                    echo "  --slave /usr/bin/$cmd $cmd /usr/bin/$line"
                done
    )
    # remove trailing newline and backslash split each slave section
    echo -ne "$cmd_str_install$cmd_str_slaves" | sed -z 's/\n$//' | sed -z 's/\n/ \\\n/g'
    echo
    i=$((i + 10))
done

It generated:

gcc-9
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 \
  --slave /usr/bin/x86_64-linux-gnu-gcc x86_64-linux-gnu-gcc /usr/bin/x86_64-linux-gnu-gcc-9 \
  --slave /usr/bin/x86_64-linux-gnu-gcc-ar x86_64-linux-gnu-gcc-ar /usr/bin/x86_64-linux-gnu-gcc-ar-9 \
  --slave /usr/bin/x86_64-linux-gnu-gcc-nm x86_64-linux-gnu-gcc-nm /usr/bin/x86_64-linux-gnu-gcc-nm-9 \
  --slave /usr/bin/x86_64-linux-gnu-gcc-ranlib x86_64-linux-gnu-gcc-ranlib /usr/bin/x86_64-linux-gnu-gcc-ranlib-9 \
  --slave /usr/bin/x86_64-linux-gnu-gcov x86_64-linux-gnu-gcov /usr/bin/x86_64-linux-gnu-gcov-9 \
  --slave /usr/bin/x86_64-linux-gnu-gcov-dump x86_64-linux-gnu-gcov-dump /usr/bin/x86_64-linux-gnu-gcov-dump-9 \
  --slave /usr/bin/x86_64-linux-gnu-gcov-tool x86_64-linux-gnu-gcov-tool /usr/bin/x86_64-linux-gnu-gcov-tool-9 \
  --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-9 \
  --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-9 \
  --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-9 \
  --slave /usr/bin/gcov gcov /usr/bin/gcov-9 \
  --slave /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-9 \
  --slave /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-9 \
  --slave /usr/bin/x86_64-linux-gnu-g++ x86_64-linux-gnu-g++ /usr/bin/x86_64-linux-gnu-g++-9 \
  --slave /usr/bin/g++ g++ /usr/bin/g++-9
gcc-10
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 \
  --slave /usr/bin/x86_64-linux-gnu-gcc x86_64-linux-gnu-gcc /usr/bin/x86_64-linux-gnu-gcc-10 \
  --slave /usr/bin/x86_64-linux-gnu-gcc-ar x86_64-linux-gnu-gcc-ar /usr/bin/x86_64-linux-gnu-gcc-ar-10 \
  --slave /usr/bin/x86_64-linux-gnu-gcc-nm x86_64-linux-gnu-gcc-nm /usr/bin/x86_64-linux-gnu-gcc-nm-10 \
  --slave /usr/bin/x86_64-linux-gnu-gcc-ranlib x86_64-linux-gnu-gcc-ranlib /usr/bin/x86_64-linux-gnu-gcc-ranlib-10 \
  --slave /usr/bin/x86_64-linux-gnu-gcov x86_64-linux-gnu-gcov /usr/bin/x86_64-linux-gnu-gcov-10 \
  --slave /usr/bin/x86_64-linux-gnu-gcov-dump x86_64-linux-gnu-gcov-dump /usr/bin/x86_64-linux-gnu-gcov-dump-10 \
  --slave /usr/bin/x86_64-linux-gnu-gcov-tool x86_64-linux-gnu-gcov-tool /usr/bin/x86_64-linux-gnu-gcov-tool-10 \
  --slave /usr/bin/x86_64-linux-gnu-lto-dump x86_64-linux-gnu-lto-dump /usr/bin/x86_64-linux-gnu-lto-dump-10 \
  --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-10 \
  --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-10 \
  --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-10 \
  --slave /usr/bin/gcov gcov /usr/bin/gcov-10 \
  --slave /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-10 \
  --slave /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-10 \
  --slave /usr/bin/lto-dump lto-dump /usr/bin/lto-dump-10 \
  --slave /usr/bin/x86_64-linux-gnu-g++ x86_64-linux-gnu-g++ /usr/bin/x86_64-linux-gnu-g++-10 \
  --slave /usr/bin/g++ g++ /usr/bin/g++-10

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