(たぶん)安全な GCC 4.1 へのアップデート方法
先日、 gcc の 4.1.1 が stable になりました。先日トラックバックをいただいた「適当な日記。」さんのこちらの記事によると、アップデートの途中で "fix_libtool_files.sh" というコマンドを実行しないとうまくアップデートできないそうです。トラックバックをいただかなければ私も気付かないところでした。大感謝です。このことは英語のGentoo GCC Upgrade Guideには記載されているのですが、日本訳であるGentoo Linux GCCアップグレードガイドにはまだ反映されていません。そこで、いくらか足しになればということで私が行った手順を記事にすることにしました。これからアップデートする方の参考になれば幸いです。
gcc, glibc 以外のパッケージを更新しておく
まず余計なトラブルを避けるため、 gcc, glibc 以外のパッケージを最新の状態に更新しましょう。 gcc-4.1 以降、 glibc-2.4 以降をマスクするために "/etc/portage/package.mask" に以下の行を追加します。
>=sys-devel/gcc-4.1 >=sys-libs/glibc-2.4
その後、以下のコマンドでパッケージを更新しましょう。
emerge --update world
必要に応じて dispatch-conf を実行して設定ファイルを更新しておいてください。可能ならば、念のため再起動して動作確認をしておいたほうがよいと思います。
なお、前述の「適当な日記。」さんの記事によると ccache を導入している環境ではトラブルが起きるそうです。私は使っていないので確認できていないのですが、もし導入しているならこの時点で外しておいたほうが無難でしょう。
glibc のアップデート
gcc-4.1.1 をインストールする前に、 glibc を 2.4 以降にアップデートしておく必要があります。基本的には普通に emerge するだけなのですが、 glibc の 2.4 以降は nptl, nptlonly USEフラグが必須になっています。もしこれらが有効になっていない場合は、 "/etc/make.conf" を書き換えて関連パッケージを再構築する必要があります。現在有効なUSEフラグは以下のようにして確認できます。
emerge --info
蛇足ですが、 NPTL とは Native POSIX Thread Library の略で、 Linux カーネル 2.6 からサポートされた新しいスレッドライブラリです。従来のライブラリよりも高速で、 POSIX への適合度も上がっています。
これまで nptl, nptlonly USEフラグを指定していなかった場合の glibc の更新手順は以下のようになります。
- "/etc/make.conf" の USE 変数に nptl, nptlonly を追加する。
- "/etc/portage/package.mask" から先ほど追加した glibc の行を削除する。
- "emerge --update --deep --newuse world" を実行する。
USEフラグを変更した際の詳しい手順に関しては、「USEフラグの変更手順」にまとめてありますので、ご参照ください。
もし以前から nptl, nptlonly が有効だった場合は、単に glibc のマスクを解除して "emerge --update sys-libs/glibc" で OK です。
gcc のアップデート
最後に gcc をアップデートしましょう。基本的には「GCC のアップグレード」の要領で普通に更新すれば良いのですが("/etc/portage/package.mask" によるマスクを解除するのを忘れずに ^^;)、 libtool を再構築する前に "fix_libtool_files.sh" というコマンドを実行する必要があります。書式は以下のとおりです。
fix_libtool_files.sh <以前のgccのバージョン>
上記のとおり以前の gcc のバージョンを指定する必要があるので、あらかじめ "gcc --version" を実行して調べておきましょう。後は、通常通りシステム全体をリビルドすれば終わりです。
参考までに、私が実行したコマンドを挙げておきます。 gcc を 3.4.6 から 4.1.1 に更新する場合です。
emerge --update sys-devel/gcc gcc-config i686-pc-linux-gnu-4.1.1 source /etc/profile fix_libtool_files.sh 3.4.6 emerge --oneshot libtool emerge -e system emerge -e world
以上で gcc の更新が完了しました。ただし古い gcc のパッケージは残ったままですので、動作確認して問題ないようなら、手動で削除しましょう。以下のコマンドでよいと思います(バージョン指定は適宜変更してください)。
emerge --unmerge =sys-devel/gcc-3.4.6
しかし毎回 gcc の更新は厄介ですね。無料で使わせてもらっている立場なのであまり贅沢は言えませんが、できれば ABI を頻繁に変更するのは控えてほしいところです・・・(´ー`;
詳しくはこちらの記事をどうぞ!
この記事にコメントする