GCC のアップグレード
カーネルのアップデートが自動では行われないというのは先日ご紹介したとおりですが、ほかにもアップデートに特別な作業が必要なパッケージがあります。その代表的なもののひとつが gcc です。
ご存知のとおり gcc は Linux カーネルを含むすべての C/C++ プログラムをコンパイルするために使用されるコンパイラであり、非常に重要なパッケージです。このため、gcc のアップデートは慎重に行う必要があります。もしバイナリ互換性のない gcc のバージョンでコンパイルされたプログラムが混在していると、動作が不安定になる要因となります。
このため、GentooLinux では、(後述する例外を除き)gcc のアップデートは別スロットとしてインストールされ、明示的な切り替え作業を行うまでは使用されません。今日は、この gcc の切り替え手順についてご紹介します。基本的には Gentoo Linux GCCアップグレードガイドほぼそのままですが、この文書はいまいち理解しにくいので、自分なりにまとめてみようと思います。
- 追記
- gcc 3.x から gcc 4.x への移行方法を(たぶん)安全な GCC 4.1 へのアップデート方法にまとめました。併せてご参照ください。
作業が必要かどうかの判断
gcc がアップデートされたとき常に手作業が必要なわけではありません。バグ修正のみのマイナーアップデートは完全に互換性が保たれるため、通常のパッケージ同様に上書きで更新されます。手作業が必要かどうかは、"emerge --pretend --update gcc" の表示で判断できます。以下のように "[ebuild U]" と表示された場合は何の作業も必要ありません。
[ebuild U ] sys-devel/gcc-3.3.6 [3.3.5.20050130-r1]
この場合、単純に "emerge --update world" で万事うまくいきます。
これに対して、以下のように "[ebuild NS]" と表示された場合は、以下にご紹介する手順を踏まなければ新しいバージョンが有効になりません。
[ebuild NS ] sys-devel/gcc-3.4.4-r1
それでは、上記の "gcc-3.4.4-r1" にアップデートすることを前提にして、その手順をご紹介します。
パッケージのアップデート
まず、通常通りパッケージのアップデート作業を行います。
emerge --update gcc
必要なら etc-update なども実行しておいてください。
プロファイルの変更
GentooLinux では、gcc の設定を行うツールとして gcc-config が用意されています。新しいバージョンの gcc に移行するためには、このツールでプロファイルを変更する必要があります。まずは以下のように -l オプション付きで実行してください。
gcc-config -l
すると、以下のように表示されると思います。
[1] i686-pc-linux-gnu-3.3.6 * [2] i686-pc-linux-gnu-3.3.6-hardened [3] i686-pc-linux-gnu-3.3.6-hardenednopie [4] i686-pc-linux-gnu-3.3.6-hardenednopiessp [5] i686-pc-linux-gnu-3.3.6-hardenednossp [6] i686-pc-linux-gnu-3.4.4 [7] i686-pc-linux-gnu-3.4.4-hardened [8] i686-pc-linux-gnu-3.4.4-hardenednopie [9] i686-pc-linux-gnu-3.4.4-hardenednopiessp [10] i686-pc-linux-gnu-3.4.4-hardenednossp
これが現在利用可能なプロファイルのリストです。* が付いているのが使用中のプロファイルですので、そのバージョンが上がったものを設定すればよいということになります。この場合は "i686-pc-linux-gnu-3.4.4" ですね。gcc-config のコマンドラインにプロファイル名を指定して実行することで、プロファイルが変更できます。
gcc-config i686-pc-linux-gnu-3.4.4
さらに、"/etc/profile" を実行して環境を設定します。
source /etc/profile
これでプロファイルの変更は終了です。gcc を --version オプション付きで実行して、バージョンを確認してみましょう。
gcc --version
パッケージの再構築
gcc をアップデートした際には、パッケージをすべて再構築することが推奨されているようです。以下、その作業をしていきます。
libtool の再構築
最初に最も関連性の深い libtool パッケージを再構築します。これは、他のパッケージに先駆けて実行しなければなりませんので、以下のようにします。
emerge --oneshot libtool
互換性のためのパッケージをインストール
これは 3.3 から 3.4 にアップデートする際に特有の手順です。それ以外の場合は必要ありません。gcc 3.4 では C++ ABI (Application Binary Interface) に変更があったため、以前の gcc でコンパイルされた C++ プログラムを gcc 3.4 以降でコンパイルされたライブラリにリンクできません。そこで、そのようなプログラムをリンクするための libstdc++-v3 パッケージをインストールします。
emerge --oneshot sys-libs/libstdc++-v3
パッケージの再構築
system, world の順でパッケージを再構築していきます。
emerge -e system emerge -e world
インストールしているパッケージの量にもよりますが、かなりの時間がかかります。気長に待ちましょう。
古い gcc のアンインストール
この時点で、すべてのシステムが新しい gcc でコンパイルされています(カーネルを除く)。古い gcc はもう必要ないはずですので、削除してしまいましょう。
emerge --unmerge =sys-devel/gcc-3.3.6
これで gcc のアップデートは完了です。
詳しくはこちらの記事をどうぞ!
この記事にコメントする