本パッケージの詳細は 「GCC の構成」を参照してください。
GCC パッケージは C コンパイラーや C++ コンパイラーなどの GNU コンパイラーコレクションを提供します。
GCC は GMP、MPFR、MPC の各パッケージを必要とします。 これらのパッケージはホストシステムに含まれていないかもしれないため、以下を実行してビルドの準備をします。 個々のパッケージを GCC ソースディレクトリの中に伸張 (解凍) し、ディレクトリ名を変更します。 これは GCC のビルド処理においてそれらを自動的に利用できるようにするためです。
本節においては誤解が多く発生しています。 ここでの手順は他のものと同様であり、手順の概要 (パッケージビルド手順) は説明済です。 まず初めに gcc-13.2.0 の tarball を伸張 (解凍) し、生成されたソースディレクトリに移動します。 それに加えて本節では、以下の手順を行うものとなります。
tar -xf ../mpfr-4.2.0.tar.xz mv -v mpfr-4.2.0 mpfr tar -xf ../gmp-6.3.0.tar.xz mv -v gmp-6.3.0 gmp tar -xf ../mpc-1.3.1.tar.gz mv -v mpc-1.3.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.38 \ --with-sysroot=$LFS \ --with-newlib \ --without-headers \ --enable-default-pie \ --enable-default-ssp \ --disable-nls \ --disable-shared \ --disable-multilib \ --disable-threads \ --disable-libatomic \ --disable-libgomp \ --disable-libquadmath \ --disable-libssp \ --disable-libvtv \ --disable-libstdcxx \ --enable-languages=c,c++
configure オプションの意味
--with-glibc-version=2.38
このオプションは、ターゲットにおいて用いられることになる Glibc のバージョンを指定します。 これはホストディストリビューションにある libc のバージョンとは関係がありません。 1 回めの GCC によってコンパイルされるものは、すべて chroot 環境内で実行されるものであって、ホストにある libc とは切り離されているためです。
--with-newlib
この時点では利用可能な C ライブラリがまだ存在しません。 したがって libgcc のビルド時に inhibit_libc 定数を定義します。 これを行うことで、libc サポートを必要とするコード部分をコンパイルしないようにします。
--without-headers
完璧なクロスコンパイラーを構築するなら、GCC はターゲットシステムに互換性を持つ標準ヘッダーを必要とします。 本手順においては標準ヘッダーは必要ありません。 このスイッチは GCC がそういったヘッダーを探しにいかないようにします。
--enable-default-pie と
--enable-default-ssp
このスイッチは GCC がプログラムをコンパイルする際にデフォルトとして、堅牢なセキュリティ機能(詳しくは PIE と SSP に関するメモ 参照)をある程度含める指示を行います。 厳密には、この段階で必要となるものではありません。 と言うのも、ここでのコンパイラーは一時的な実行ファイルを生み出すだけのものだからです。 ただし一時的なパッケージだとしても、最終形とするパッケージにできるだけ近づけておけば、理解しやすくなります。
--disable-shared
このスイッチは内部ライブラリをスタティックライブラリとしてリンクすることを指示します。 共有ライブラリが Glibc を必要としており、処理しているシステム上にはまだインストールされていないためです。
--disable-multilib
x86_64 に対して LFS は multilib のサポートをしていません。 このオプション指定は x86 には無関係です。
--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
ビルドが通常行っている方法と同じものです。
以下に示すコマンドは、2 つの手法、つまりバッククォートと $()
構文を使って、ネスト化したコマンド置換を行う例を示しています。
これは、両方の置換において一つの手法のみを使って書き換えることもできます。
ただしここでは、両者を混在させても実現できることを示すものです。 一般的には $()
構文による手法がよく用いられます。
cd .. cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \ `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include/limits.h
本パッケージの詳細は 「GCC の構成」を参照してください。