Detalhes acerca deste pacote estão localizados em Seção 8.26.2, “Conteúdo do GCC.”
O pacote GCC contém a GNU Compiler Collection, a qual inclui os compiladores C e C++.
O GCC exige os pacotes GMP, MPFR e MPC. Uma vez que esses pacotes talvez não estejam incluídos na sua distribuição anfitriã, eles serão construídos com o GCC. Desempacote cada pacote dentro do diretório de fonte do GCC e renomeie os diretórios resultantes, de forma que os procedimentos de construção do GCC automaticamente os usarão:
Existem mal-entendidos frequentes a respeito deste capítulo. Os procedimentos são os mesmos que todos os outros capítulos, conforme explicados anteriormente (Instruções de construção de pacote). Primeiro, extraia o tarball gcc-12.2.0 a partir do diretório dos fontes e então mude para o diretório criado. Somente então deveria você prosseguir com as instruções abaixo.
tar -xf ../mpfr-4.2.0.tar.xz mv -v mpfr-4.2.0 mpfr tar -xf ../gmp-6.2.1.tar.xz mv -v gmp-6.2.1 gmp tar -xf ../mpc-1.3.1.tar.gz mv -v mpc-1.3.1 mpc
Em anfitriões x86_64, configure o nome padrão de diretório para bibliotecas de 64 bits para “lib”:
case $(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/' \ -i.orig gcc/config/i386/t-linux64 ;; esac
A documentação do GCC recomenda construir o GCC em um diretório de construção dedicado:
mkdir -v build cd build
Prepare o GCC para compilação:
../configure \ --target=$LFS_TGT \ --prefix=$LFS/tools \ --with-glibc-version=2.37 \ --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++
O significado das opções do configure:
--with-glibc-version=2.37
Essa opção especifica a versão da Glibc que será usada no alvo. Ela não é relevante para a libc da distribuição anfitriã, pois tudo compilado pela passagem 1 do GCC executará no ambiente chroot, o qual é isolado da libc da distribuição anfitriã.
--with-newlib
Uma vez que uma biblioteca C funcional ainda não está disponível, isso assegura que a constante inhibit_libc esteja definida quando da construção de libgcc. Isso evita a compilação de qualquer código que exija suporte à libc.
--without-headers
Quando da criação de um compilador cruzado completo, o GCC exige cabeçalhos padrão compatíveis com o sistema alvo. Para nossos propósitos esses cabeçalhos não serão necessários. Essa chave evita que o GCC procure por eles.
--enable-default-pie and
--enable-default-ssp
Essas chaves permitem que o GCC compile aplicativos com alguns recursos de segurança reforçados (mais informação a respeito deles no observação a respeito de PIE e SSP no capítulo 8) por padrão. Eles não são estritamente necessários neste estágio, pois o compilador produzirá apenas executáveis temporários. Mas, é mais limpo ter os pacotes temporários o mais próximo possível dos finais.
--disable-shared
Essa chave força o GCC a vincular as bibliotecas internas dele estaticamente. Nós precisamos disso, pois as bibliotecas compartilhadas exigem a Glibc, que ainda não está instalada no sistema alvo.
--disable-multilib
Em x86_64, o LFS não suporta uma configuração multi bibliotecas. Essa chave é inofensiva para x86.
--disable-threads, --disable-libatomic,
--disable-libgomp, --disable-libquadmath, --disable-libssp,
--disable-libvtv, --disable-libstdcxx
Essas chaves desabilitam o suporte para threading, libatomic, libgomp, libquadmath, libssp, libvtv e à biblioteca padrão C++ respectivamente. Esses recursos possivelmente falhem para compilar quando da construção de um compilador cruzado e não são necessários para a tarefa de compilar cruzadamente a libc temporária.
--enable-languages=c,c++
Essa opção garante que apenas os compiladores C e C++ sejam construídos. Essas são as únicas linguagens necessárias agora.
Compile o GCC executando:
make
Instale o pacote:
make install
Essa construção do GCC instalou um par de cabeçalhos internos de
sistema. Normalmente um deles, limits.h
, sequencialmente incluiria o
correspondente cabeçalho de sistema limits.h
, nesse caso, $LFS/usr/include/limits.h
. Entretanto, ao tempo
dessa construção do GCC, $LFS/usr/include/limits.h
não existe, de forma
que o cabeçalho interno que tenha sido instalado é um arquivo
parcial, auto-contido, e não inclui os recursos estendidos do
cabeçalho de sistema. Isso é adequado para a construção da Glibc,
porém o cabeçalho interno completo será necessário posteriormente.
Crie uma versão completa do cabeçalho interno usando um comando que
é idêntico ao que o sistema de construção do GCC faz em
circunstâncias normais:
O comando abaixo mostra um exemplo da substituição de comando
aninhada usando dois métodos: aspas invertidas e uma construção
$()
. Poderia ser reescrito usando o
mesmo método para ambas as substituições, porém é mostrado dessa
maneira para demonstrar o como eles podem ser misturados.
Geralmente o método $()
é preferido.
cd .. cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \ `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/install-tools/include/limits.h
Detalhes acerca deste pacote estão localizados em Seção 8.26.2, “Conteúdo do GCC.”