5.3. GCC-10.2.0 - 1回め

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

概算ビルド時間: 11 SBU
必要ディスク容量: 3.7 GB

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

GCC は GMP、MPFR、MPC の各パッケージを必要とします。 これらのパッケージはホストシステムに含まれていないかもしれないため、以下を実行してビルドの準備をします。 個々のパッケージを GCC ソースディレクトリの中に伸張 (解凍) し、ディレクトリ名を変更します。 これは GCC のビルド処理においてそれらを自動的に利用できるようにするためです。

[注記]

注記

本節においては誤解が多く発生しています。 ここでの手順は他のものと同様であり、手順の概要 (パッケージビルド手順) は説明済です。 まず初めに gcc の tarball を伸張 (解凍) し、生成されたソースディレクトリに移動します。 それに加えて本節では、以下の手順を行うものとなります。

tar -xf ../mpfr-4.1.0.tar.xz
mv -v mpfr-4.1.0 mpfr
tar -xf ../gmp-6.2.1.tar.xz
mv -v gmp-6.2.1 gmp
tar -xf ../mpc-1.2.1.tar.gz
mv -v mpc-1.2.1 mpc

x86_64 ホストにおいて、64 ビットライブラリに対するデフォルトのディレクトリ名はlibです。

case $(uname -m) in
  x86_64)
    sed -e '/m64=/s/lib64/lib/' \
        -i.orig gcc/config/i386/t-linux64
 ;;
esac

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

mkdir -v build
cd       build

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

../configure                                       \
    --target=$LFS_TGT                              \
    --prefix=$LFS/tools                            \
    --with-glibc-version=2.11                      \
    --with-sysroot=$LFS                            \
    --with-newlib                                  \
    --without-headers                              \
    --enable-initfini-array                        \
    --disable-nls                                  \
    --disable-shared                               \
    --disable-multilib                             \
    --disable-decimal-float                        \
    --disable-threads                              \
    --disable-libatomic                            \
    --disable-libgomp                              \
    --disable-libquadmath                          \
    --disable-libssp                               \
    --disable-libvtv                               \
    --disable-libstdcxx                            \
    --enable-languages=c,c++

configure オプションの意味

--with-glibc-version=2.11

このオプションは、ホストにある glibc とこのパッケージが互換性を持つようにします。 ホストシステム要件 に示す glibc の要件を最低限満たすものです。

--with-newlib

この時点では利用可能な C ライブラリがまだ存在しません。 したがって libgcc のビルド時に inhibit_libc 定数を定義します。 これを行うことで、libc サポートを必要とするコード部分をコンパイルしないようにします。

--without-headers

完璧なクロスコンパイラーを構築するなら、GCC はターゲットシステムに互換性を持つ標準ヘッダーを必要とします。 本手順においては標準ヘッダーは必要ありません。 このスイッチは GCC がそういったヘッダーを探しにいかないようにします。

--enable-initfini-array

このスイッチは内部データ構造を利用することを指示します。 クロスコンパイラーのビルド時にこれが必要になりますが、自動では設定されません。

--disable-shared

このスイッチは内部ライブラリをスタティックライブラリとしてリンクすることを指示します。 共有ライブラリが glibc を必要としており、処理しているシステム上にはまだインストールされていないためです。

--disable-multilib

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

--disable-decimal-float, --disable-threads, --disable-libatomic, --disable-libgomp, --disable-libquadmath, --disable-libssp, --disable-libvtv, --disable-libstdcxx

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

--enable-languages=c,c++

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

GCC をコンパイルします。

make

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

make install

ここでの GCC ビルドにおいては、内部にあるシステムヘッダーファイルをいくつかインストールしました。 そのうちの limits.h というものは、対応するシステムヘッダーファイルである limits.h を読み込むものになっています。 そのファイルはここでは $LFS/usr/include/limits.h になります。 ただし GCC をビルドしたこの時点において $LFS/usr/include/limits.h は存在していません。 したがってインストールされたばかりの内部ヘッダーファイルは、部分的に自己完結したファイルとなり、システムヘッダーファイルによる拡張された機能を含むものになっていません。 glibc をビルドする際にはこれでもかまわないのですが、後々内部ヘッダーファイルは完全なものが必要になります。 以下のようなコマンドを通じて、その内部ヘッダーファイルの完成版を作り出します。 このコマンドは GCC ビルドが通常行っている方法と同じものです。

cd ..
cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
  `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/install-tools/include/limits.h

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