x86なサーバのGCCのバージョンアップ

x86 環境のサーバにも gcc-4.4.3-r2 が来ていたので迷った挙句にバージョンを上げることにしました。 amd64 なデスクトップ環境では導入していたんだけどね。

てことで emerge …2時間半かかりました。(´・ω・`)

$ genlop -t gcc
 * sys-devel/gcc

     Tue Jun  8 19:53:52 2010 >>> sys-devel/gcc-4.4.3-r2
       merge time: 2 hours, 28 minutes and 33 seconds.


これだけではインストールされただけで基本的には使われません。がんがん使ってやりたいので、人柱覚悟で gcc-4.4.3 をデフォルトのコンパイラに指定してやります。

$ sudo su -
# gcc-config i686-pc-linux-gnu-4.4.3
 * Switching native-compiler to i686-pc-linux-gnu-4.4.3 ...
>>> Regenerating /etc/ld.so.cache...                               [ ok ]

 * If you intend to use the gcc from the new profile in an already
 * running shell, please remember to do:

 *   # source /etc/profile

# source /etc/profile
# env-update
# gcc-config -l
 [1] i686-pc-linux-gnu-4.3.4
 [2] i686-pc-linux-gnu-4.4.3 *

これでデフォルトのコンパイラになりました。せっかく gcc のバージョンが上がったので全部コンパイルしなおすかなーとも思ったのですが、さすがに不毛なのでやめておきましたw

分散コンパイルgcc のビルド

うちでは distcc と crossdev を用いた分散コンパイルを行っており、分散した先のコンパイラのバージョンも合わせなくてはならないので、この作業を忘れずにやっておきます。

一応、分散元の環境の各ツールのバージョンをとっておきます。

$ eix -c -I binutils
$ eix -c -I linux-headers
$ eix -c -I gcc
$ eix -c -I glibc


ちなみに、こんな感じでした。

package version
binutils 2.18-r3
linux-headers 2.6.30-r1
gcc 4.3.4 / 4.4.3-r2
glibc 2.10.1-r1

gcc についてはスロットで 2 つ入っていますね。


次に、分散させる先のマシンにログオン。同じくバージョンを調べます。こちらは crossdev で作ったツールのバージョンを調べなきゃいけないことに注意。前回の crossdev を用いたツールの作成で、 cross-i686-pc-linux-gnu カテゴリに全部インストールされているので、コレをリストすれば OK 。

参考
http://d.hatena.ne.jp/korokorokoron/20100318#1268875465
$ eix -I -C cross-i686-pc-linux-gnu
[I] cross-i686-pc-linux-gnu/binutils [1] (2.18-r3(i686-pc-linux-gnu)@2010年03月18日)
  : Tools necessary to build programs
[I] cross-i686-pc-linux-gnu/gcc [1] (4.3.4(i686-pc-linux-gnu-4.3)@2010年03月18日)
  : The GNU Compiler Collection. Includes C/C++, java compilers, pie+ssp extensions, Haj Ten Brugge runtime bounds checking
[I] cross-i686-pc-linux-gnu/glibc [1] (2.10.1-r1(i686-pc-linux-gnu-2.2)@2010年03月18日)
  : GNU libc6 (also called glibc2) C library
[I] cross-i686-pc-linux-gnu/linux-headers [1] (2.6.30-r1(i686-pc-linux-gnu)@2010年03月18日)
  : Linux system headers
[1] "local-original" /usr/local/portage/original

Found 4 matches.


gcc だけ新しいバージョンを作ればいいようです。コレを crossdev を使って作成してやるのですが、自分の環境では package.mask ファイルでマスクされてたのであらかじめコレを外してやります。

その後、 crossdev で作成します。わかんないけど emerge で叩いても作れるのかな…?

$ sudo crossdev -t i686 --b 2.18-r3 --g 4.4.3-r2 --k 2.6.30-r1 --l 2.10.1-r1

                                                                                                                                                              • -
* Host Portage ARCH: amd64 * Target Portage ARCH: x86 * Target System: i686-pc-linux-gnu * Stage: 4 (C/C++ compiler) * binutils: binutils-2.18-r3 * gcc: gcc-4.4.3-r2 * headers: linux-headers-2.6.30-r1 * libc: glibc-2.10.1-r1 * PORTDIR_OVERLAY: /usr/local/portage/original * PORT_LOGDIR: /var/log/portage * PKGDIR: /usr/portage/packages/cross/i686-pc-linux-gnu * PORTAGE_TMPDIR: /var/tmp/cross/i686-pc-linux-gnu _ - ~ - _ - ~ - _ - ~ - _ - ~ - _ - ~ - _ - ~ - _ - * Forcing the latest versions of {binutils,gcc}-config/gnuconfig ... [ ok ] * Log: /var/log/portage/cross-i686-pc-linux-gnu-binutils.log * Emerging cross-binutils ... [ ok ] * Log: /var/log/portage/cross-i686-pc-linux-gnu-linux-headers-quick.log * Emerging cross-linux-headers-quick ... [ ok ] * Log: /var/log/portage/cross-i686-pc-linux-gnu-glibc-headers.log * Emerging cross-glibc-headers ... [ ok ] * Log: /var/log/portage/cross-i686-pc-linux-gnu-gcc-stage1.log * Emerging cross-gcc-stage1 ... [ ok ] * Log: /var/log/portage/cross-i686-pc-linux-gnu-linux-headers.log * Emerging cross-linux-headers ... [ ok ] * Log: /var/log/portage/cross-i686-pc-linux-gnu-glibc.log * Emerging cross-glibc ... [ ok ] * Log: /var/log/portage/cross-i686-pc-linux-gnu-gcc-stage2.log * Emerging cross-gcc-stage2 ... [ ok ]


最後に、 crossdev で使われる gcc のバージョンを指定しておきます。分散元のコンパイラのバージョンとあわせましょう。作業についてはココを参考にしました。


http://www.gentoo.org/proj/en/base/embedded/cross-development.xml
(ただし記事が結構古いです。最新のはコッチらしい)

$ gcc-config -l
 [1] i686-pc-linux-gnu-4.3.4 *
 [2] i686-pc-linux-gnu-4.4.3

 [3] x86_64-pc-linux-gnu-4.3.4
 [4] x86_64-pc-linux-gnu-4.4.3 *

わかりにくいですが、緑色のアスタリスクがシステムデフォルト、水色のアスタリスクがクロスコンパイラのデフォルトなんだそーです。システムデフォルトは amd64 環境なので 64bit コンパイラがデフォルトになっています。



これも、分散元でやったように gcc-config を使って指定してやります。

$ sudo su -
# gcc-config i686-pc-linux-gnu-4.4.3
 * Switching native-compiler to i686-pc-linux-gnu-4.4.3 ...
>>> Regenerating /etc/ld.so.cache...                               [ ok ]

 * If you intend to use the gcc from the new profile in an already
 * running shell, please remember to do:

 *   # source /etc/profile

# source /etc/profile
# env-update
# gcc-config -l
 [1] i686-pc-linux-gnu-4.3.4
 [2] i686-pc-linux-gnu-4.4.3 *

 [3] x86_64-pc-linux-gnu-4.3.4
 [4] x86_64-pc-linux-gnu-4.4.3 *

以上で以降は (多分) 完了です。あとはエラーとかがでないのを祈るのみ…w