5.3. GCC-13.2.0 - Passagem 1

O pacote GCC contém a GNU Compiler Collection, a qual inclui os compiladores C e C++.

Tempo aproximado de construção: 3,8 UPC
Espaço em disco exigido: 4,1 GB

5.3.1. Instalação do GCC Cruzado

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:

[Nota]

Nota

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-13.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.1.tar.xz
mv -v mpfr-4.2.1 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

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.39 \
    --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.39

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 e --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 na 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 e --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:

[Nota]

Nota

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)`/include/limits.h

Detalhes acerca deste pacote estão localizados na Seção 8.28.2, “Conteúdo do GCC.”