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を使うと、連動する設定変更も記述できる。
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".
まぁ、わかってやってる分には問題なさそうだけどね。