debianでgccのバージョンを切り替える

viコマンドを発行した場合に起動するアプリケーションは、nviかvimか。
起動するバイナリのデフォルトバージョンを変更したい。
そのあたりの問題を自由に制御するために、Debianではalternativesという仕組みを持っている。


altanativesは、同じ機能を持ったアプリケーションのデフォルト起動順の切り替えや、インストールされた異なるバージョンのソフトウエアのデフォルト起動順の切り替えを可能にする。
コマンドに対するシンボリックリンクをコントロールすることで機能を実現しているが、これを管理するツールとしてupdate-alternativesがある。
update-alternativesを使ってgccの切り替えを行うことができる。


現在インストールされているgccのパッケージ。

crossroad:/# dpkg -l | grep gcc | awk '{print $2}'
gcc
gcc-4.1
gcc-4.1-base
gcc-4.2
gcc-4.2-arm-linux-gnueabi
gcc-4.2-arm-linux-gnueabi-base
gcc-4.2-base
gcc-4.2-base-armel-cross
gcc-4.3
gcc-4.3-arm-linux-gnueabi-base
gcc-4.3-base
libgcc1
libgcc1-armel-cross

gccコマンドの状態。

crossroad:/# ls -l /usr/bin/gcc*
lrwxrwxrwx 1 root root      7 Aug 28 04:34 /usr/bin/gcc -> gcc-4.3
-rwxr-xr-x 1 root root 196932 Jun 24 02:23 /usr/bin/gcc-4.1
-rwxr-xr-x 1 root root 192220 Jul  5 20:01 /usr/bin/gcc-4.2
-rwxr-xr-x 1 root root 207648 Jun 11 03:35 /usr/bin/gcc-4.3
-rwxr-xr-x 1 root root  16268 Jun 24 02:19 /usr/bin/gccbug-4.1

gccパッケージがインストールされていない場合は、/usr/bin/gccは存在しないので注意。


設定を変更してみる。

crossroad:/# update-alternatives --config gcc
No alternatives for gcc.
crossroad:/# update-alternatives --display gcc
No alternatives for gcc.

出てこないよ... orz
どうやら、デフォルトでは管理の対象になっていないようだ。


自分で登録する。

# update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.3 43 \
--slave /usr/bin/g++ g++ /usr/bin/g++-4.3 \
--slave /usr/bin/gcov gcov /usr/bin/gcov-4.3

# update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.2 42 \
--slave /usr/bin/g++ g++ /usr/bin/g++-4.2 \
--slave /usr/bin/gcov gcov /usr/bin/gcov-4.2
 
# update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.1 41 \
--slave /usr/bin/g++ g++ /usr/bin/g++-4.1 \
--slave /usr/bin/gcov gcov /usr/bin/gcov-4.1

salveを使うと、連動する設定変更も記述できる。


デフォルトをgcc-4.3からgcc-4.2に変更する。

crossroad:/# update-alternatives --config gcc

There are 3 alternatives which provide `gcc'.

  Selection    Alternative
-----------------------------------------------
*+          1    /usr/bin/gcc-4.3
          2    /usr/bin/gcc-4.2
          3    /usr/bin/gcc-4.1

Press enter to keep the default[*], or type selection number: 2
Using '/usr/bin/gcc-4.2' to provide 'gcc'.

リンクが変更されているのが確認できる。

crossroad:/# ls -al /usr/bin/gcc
lrwxrwxrwx 1 root root 21 Aug 28 04:43 /usr/bin/gcc -> /etc/alternatives/gcc
crossroad:/# ls -al /etc/alternatives/gcc
lrwxrwxrwx 1 root root 16 Aug 28 04:45 /etc/alternatives/gcc -> /usr/bin/gcc-4.2


しかーし、こういう使い方には問題があるのだそう。混ぜるな危険ってことで。
http://d.ma-aya.to/?date=20080828#p01
http://d.ma-aya.to/?date=20050707#p04

The symlinks in /usr/bin (gcc, g++, ...) are not handled using the Debian alternative mechanism. There are differences in the architecture specific ABI on some architectures and the C++ ABI differs as well. Having the symlinks managed by alternatives doesn't allow reliable builds with the same major/minor version of the compiler. To use another compiler version, set the appropriate environment variables as described above in the section "Practical implications".

まぁ、わかってやってる分には問題なさそうだけどね。