5.5. GCC-4.5.1 - 1回め

GCC パッケージは C コンパイラや C++ コンパイラなどの GNU コンパイラコレクションを提供します。

概算ビルド時間: 5.0 SBU
必要ディスク容量: 809 MB

5.5.1. クロスコンパイル版 GCC のインストール

最近の GCC は GMP、MPFR、MPC の各パッケージを必要とします。 これらのパッケージはホストシステムに含まれていないかもしれないため、以下を実行してビルドの準備をします。

tar -jxf ../mpfr-3.0.0.tar.bz2
mv -v mpfr-3.0.0 mpfr
tar -jxf ../gmp-5.0.1.tar.bz2
mv -v gmp-5.0.1 gmp
tar -zxf ../mpc-0.8.2.tar.gz
mv -v mpc-0.8.2 mpc

GCC のドキュメントでは、ソースディレクトリ以外の専用のビルドディレクトリを作成することが推奨されています。

mkdir -v ../gcc-build
cd ../gcc-build

GCC をコンパイルするための準備を行います。

../gcc-4.5.1/configure \
    --target=$LFS_TGT --prefix=/tools \
    --disable-nls --disable-shared --disable-multilib \
    --disable-decimal-float --disable-threads \
    --disable-libmudflap --disable-libssp \
    --disable-libgomp --enable-languages=c \
    --with-gmp-include=$(pwd)/gmp --with-gmp-lib=$(pwd)/gmp/.libs \
    --without-ppl --without-cloog

configure オプションの意味:

--disable-shared

このオプションは内部ライブラリをスタティックライブラリとしてリンクすることを指示します。 ホストシステムに関係しそうな問題を回避するためです。

--disable-decimal-float, --disable-threads, --disable-libmudflap, --disable-libssp, --disable-libgomp

これらのオプションは順に、十進浮動小数点制御、スレッド処理、libmudflap、libssp、libgomp のサポートをいずれも無効にすることを指示します。 これらの機能を含めていると、クロスコンパイラをビルドする際にはコンパイルに失敗します。 またクロスコンパイルによって一時的な libc ライブラリを構築する際には不要なものです。

--disable-multilib

x86_64 に対して LFS は まだ multilib のサポートをしていません。 このオプション指定は x86 には無関係です。

--enable-languages=c

このオプションは C コンパイラのみビルドすることを指示します。 この時点で必要なのはこの言語だけだからです。

--with-gmp-include=...

このオプションは GCC に対して GMP のヘッダファイルの場所を指定するものです。

--with-gmp-lib=...

このオプションは GCC に対して GMP のライブラリファイルの場所を指定するものです。

--without-ppl, --without-cloog

このオプションは、PPL および CLooG ライブラリがホストシステムに存在していたとしても、chroot 環境ではそれらを利用することが出来ないため、リンクしないようにします。

GCC をコンパイルします。

make

コンパイルが終了しました。 この時点でもテストスイートを実行することはできます。 ただ前にも述べているように、テストスイートのフレームワークがまだ準備できていません。 さらにこの時点で生成されるプログラムは、すぐに次の生成作業によって置き換えられますから、 この時点でテストを実行することはあまり意味がありません。

パッケージをインストールします。

make install

--disable-shared オプションを指定すると libgcc_eh.a を生成せずインストールしません。 Glibc パッケージはこのライブラリに依存しており、ビルドの際に -lgcc_eh を指定することで利用されます。依存している点は libgcc.a へのシンボリックリンクを生成しておけば問題はありません。 libgcc_eh.a に含まれるオブジェクトが、 最終的には libgcc.a の中にも含まれることになるからです。

ln -vs libgcc.a `$LFS_TGT-gcc -print-libgcc-file-name | \
    sed 's/libgcc/&_eh/'`

本パッケージの詳細は 6.16.2. 「GCC の構成」 を参照してください。