WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

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 のアップデートは完了です。

関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles