Como instalar o GCC peça por peça com GMP, MPFR, MPC, ELF, sem bibliotecas compartilhadas?

115

Como faço para instalar o GCC (GNU Compiler Collection) peça por peça, usando a versão atual,
usando as versões corretas das dependências, não usando um gerenciador de pacotes (como yum, rpm, apt, dpkg) e não usando bibliotecas compartilhadas?

Desenvolvedores típicos provavelmente irão querer instalar o GCC da maneira típica, usar seu gerenciador de pacotes (yum, rpm, apt, dpkg, port, brew, etc.) ou seguir as instruções aqui ( http://gcc.gnu.org/wiki/ Instalando o GCC ).

Minha dúvida é como instalar o GCC peça por peça, sem bibliotecas compartilhadas.

  • Eu quero um GCC totalmente independente que possa ser movido pelo meu sistema sem usar nenhuma biblioteca compartilhada e sem criar nenhuma biblioteca compartilhada.
  • Isso é o que o GCC chama de "o caminho difícil" e não é recomendado para usuários comuns.

O GCC depende de:

  • GMP: GNU Multiple Precision Arithmetic Library
  • MPFR: biblioteca de arredondamento de ponto flutuante de precisão múltipla GNU
  • MPC: Biblioteca C de precisão múltipla GNU
  • ELF: biblioteca de formatos executáveis ​​e vinculáveis
  • PPL: Biblioteca Parma Polyhedra (opcional, para otimizações de memória)
joelparkerhenderson
fonte

Respostas:

123

O caminho fácil

Se você for um desenvolvedor típico, pode instalar da maneira mais fácil, usando as instruções em http://gcc.gnu.org/wiki/InstallingGCC ou no gerenciador de pacotes do sistema, como:

apt  install gcc  # for Debian, Ubuntu, etc.
yum  install gcc  # for RedHat, CentOS, etc.
brew install gcc  # for Mac OS X

O jeito difícil

O GCC diz que a resposta aqui é "da maneira mais difícil" porque ele constrói tudo peça por peça e não usa bibliotecas compartilhadas.

Infraestrutura GCC

Obtenha a infraestrutura GCC:

ftp://gcc.gnu.org/pub/gcc/infrastructure/

Coloque os downloads em um diretório temporário (você pode usar qualquer diretório que desejar).

/opt/downloads

Crie a infraestrutura em um diretório temporário diferente do diretório de downloads ou de seus subdiretórios:

/tmp/gcc

Configure a infraestrutura usando bibliotecas estáticas como esta:

./configure --disable-shared --enable-static --prefix=/tmp/gcc

O sinalizador --disable-shared pode valer a pena um olhar mais atento, dependendo de suas necessidades. Eu uso --disable-shared porque estou construindo apenas código estático e quero ter certeza de que não construo nenhum código compartilhado. Minha necessidade é mover o GCC resultante pelas minhas unidades facilmente, então eu quero todo o código estático e não quero nenhum código compartilhado. Se você preferir código compartilhado, omita o sinalizador --disable-shared.

Versões

Ao executar qualquer um dos comandos nesta resposta, certifique-se de atualizar os comandos para usar o número da versão atual do GCC que corresponda às suas necessidades. Os comandos nesta resposta são para GCC 4.6.2.

Observe que a documentação do GCC diz: "Embora qualquer versão suficientemente nova das ferramentas necessárias geralmente funcione, os requisitos da biblioteca são geralmente mais rígidos. As versões mais recentes podem funcionar em alguns casos, mas é mais seguro usar as versões exatas documentadas."

GMP

GMP é a GNU Multiple Precision Arithmetic Library.

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-4.3.2.tar.bz2
bunzip2 gmp-4.3.2.tar.bz2
tar xvf gmp-4.3.2.tar
cd gmp-4.3.2
./configure --disable-shared --enable-static --prefix=/tmp/gcc
make && make check && make install

MPFR

MPFR é a biblioteca de arredondamento de ponto flutuante de precisão múltipla GNU. Depende do GMP.

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-2.4.2.tar.bz2
bunzip2 mpfr-2.4.2.tar.bz2
tar xvf mpfr-2.4.2.tar
cd mpfr-2.4.2
./configure --disable-shared --enable-static --prefix=/tmp/gcc --with-gmp=/tmp/gcc
make && make check && make install

MPC

MPC é a biblioteca C GNU Multiple-precision. Depende de GMP e MPFR.

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-0.8.1.tar.gz
tar zxvf mpc-0.8.1.tar.gz
cd mpc-0.8.1
./configure --disable-shared --enable-static --prefix=/tmp/gcc --with-gmp=/tmp/gcc --with-mpfr=/tmp/gcc
make && make check && make install

DUENDE

ELF significa Executable and Linkable Format. Esta biblioteca fornece tamanho independente de arquitetura e suporte de endian.

wget http://www.mr511.de/software/libelf-0.8.13.tar.gz
tar zxvf libelf-0.8.13.tar.gz
cd libelf-0.8.13
./configure --disable-shared --enable-static --prefix=/tmp/gcc
make && make check && make install

GCC

GCC é a coleção de compiladores GNU. Depende de GMP, MPFR, MPC e ELF.

wget http://www.netgull.com/gcc/releases/gcc-4.6.2/gcc-4.6.2.tar.gz
tar zxvf gcc-4.6.2.tar.gz

Construa o gcc em um diretório temporário no mesmo ponto de montagem. (Construí-lo em / tmp desencadearia problemas de host de compilação cruzada)

mkdir -p /opt/downloads/gcc-4.6.2-scratch
cd /opt/downloads/gcc-4.6.2-scratch

O comando configure e seus sinalizadores devem estar todos em uma linha de comando (este post os mostra em linhas separadas apenas por causa da largura da página da web).

Observação: usamos o caminho completo para configurar e não definimos as variáveis ​​de ambiente do caminho da biblioteca. Escolhemos desabilitar o bootstrap e desabilitar as bibliotecas compartilhadas porque não as queremos (usuários típicos podem querer ambos), e usar threads posix e sinalizadores que são padrões porque os queremos (usuários típicos podem querer usar outras threads ou pular sinalizadores padrão). YMMV e leia sobre as bandeiras aqui

/opt/downloads/gcc-4.6.2/configure
  --disable-shared
  --disable-bootstrap
  --disable-libstdcxx-pch
  --enable-languages=all
  --enable-libgomp
  --enable-lto
  --enable-threads=posix
  --enable-tls
  --with-gmp=/tmp/gcc
  --with-mpfr=/tmp/gcc
  --with-mpc=/tmp/gcc
  --with-libelf=/tmp/gcc
  --with-fpmath=sse
make && make install

Esta página é ótima para informações de instalação do GCC, como construí-lo, vários sinalizadores e muito mais:

http://www.acsu.buffalo.edu/~charngda/cc_build.html

Atualizações

As bibliotecas ppl podem ser usadas para otimizações de memória: consulte bugseng.com/products/ppl/Download (Obrigado Paul nos comentários)

Você pode executar ./contrib/download_prerequisites a partir do diretório de origem do gcc. (Obrigado ao N7P no reddit)

joelparkerhenderson
fonte
2
Para sua informação, certifique-se de atualizar os números de versão acima para o novo GCC 4.6.3 (ou o que quer que seja atual quando você estiver fazendo isso)
joelparkerhenderson
12
Você pode executar ./contrib/download_prerequisites a partir do diretório de origem do gcc. Este comentário é graças ao N7P no Reddit.
joelparkerhenderson
3
Não, o bootstrapping não depende disso. Faz sentido usar --disable-shared para construir GMP, MPFR e MPC, mas não para o próprio GCC (e usar o script download_prerequisites significa que você não precisa construir GMP, MPFR e MPC manualmente de qualquer maneira). Compilar o GCC sempre cria bibliotecas estáticas e bibliotecas compartilhadas por padrão, --disable-shared apenas significa que você não obtém bibliotecas compartilhadas, o que é a escolha errada para a maioria das pessoas.
Jonathan Wakely
8
--disable-sharedestá errado para a maioria das pessoas, --disable-bootstrappode acelerar a construção, mas pode causar falha dependendo da versão existente do gcc, --enable-libgomphabilitado por padrão de qualquer maneira, --enable-ltohabilitado por padrão, --enable-thread-safenão é uma opção válida, --enable-threads=posixhabilitado por padrão em algumas plataformas, não é válido em outras , --enable-tlsativado por padrão, ... basicamente essas instruções são muito ruins
Jonathan Wakely
1
Você pode usar o Linuxbrew para instalar o gcc (e opcionalmente o glibc) em seu diretório inicial com brew install gcc. Consulte linuxbrew.sh
Shaun Jackman
118

A resposta aceita a torna muito mais complicada do que o necessário e não é correta para todas as versões. Construir o GCC com --disable-sharedgeralmente é uma ideia muito ruim. Veja http://gcc.gnu.org/wiki/InstallingGCC para uma abordagem mais fácil.

A todo processo deve ser mais difícil do que este (substituindo 4.6.2 com a versão que você quer construir):

tar xzf gcc-4.6.2.tar.gz
cd gcc-4.6.2
./contrib/download_prerequisites
cd ..
mkdir objdir
cd objdir
$PWD/../gcc-4.6.2/configure --prefix=$HOME/GCC-4.6.2 
make
make install

(Mas por favor, leia o link acima mesmo assim, ele contém informações úteis.)

Aparentemente, algumas pessoas no Ubuntu têm toneladas de porcaria em seu ambiente que interfere no processo de construção do GCC, e eles precisam remover isso primeiro:

unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH
Jonathan Wakely
fonte
2
Não, não há etapa faltando
Jonathan Wakely
2
@ user2023370, o GCC sabe como encontrar todos os seus próprios cabeçalhos e bibliotecas, é claro. Você precisa definir LD_LIBRARY_PATH para dizer ao vinculador dinâmico como encontrar as bibliotecas (porque quando você executa um GCC executável não está mais envolvido), consulte gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths
Jonathan Wakely
2
@einpoklum, então o seu "algo assim" não era o mesmo. As etapas acima funcionam. Eles trabalham para mim regularmente, com todas as versões do GCC. Eles funcionam para centenas de pessoas.
Jonathan Wakely
3
Para referência futura, isso funcionou para mim para gcc-5.4.0. A única coisa que não foi mencionada foi que eu tinha que fazer isso unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATHantes de tudo, conforme sugerido aqui: stackoverflow.com/questions/12255058/…
Cantfindname
4
Isso funcionou para mim com o gcc 6.2.0 e deve ser definitivamente a resposta aceita! (Funciona em vários sistemas operacionais / versões, etc.)
David Doria
25

Eu trabalho em um cluster. Apenas o nó mestre está conectado à Internet. O software nos nós está desatualizado e geralmente não é mantido. Eu não tenho acesso root. Tenho duas opções:

  • construir o software estático de que preciso (pacotes computacionais); ou
  • construir compiladores estáticos.

Escolhi o segundo e construí gcc, g ++ e gfortran.

Eu construí tudo em

PREFIX=$HOME/cmp/soft/sft

e para makeeu usei

THREADS=8

Abaixo, o gcc é construído com

  • GMP
  • MPFR
  • MPC
  • ISL
  • CLOOG

Pode-se obter o gcc mais recente aqui: ftp://gcc.gnu.org/pub/gcc/releases

As dependências são encontradas aqui: ftp://gcc.gnu.org/pub/gcc/infrastructure

Dependências

Recebo dependências com o seguinte script:

#!/bin/sh

# ===========
## variables:

GMP=gmp-4.3.2.tar.bz2
MPFR=mpfr-2.4.2.tar.bz2
MPC=mpc-0.8.1.tar.gz
ISL=isl-0.12.2.tar.bz2
CLOOG=cloog-0.18.1.tar.gz

MIRROR=ftp://gcc.gnu.org/pub/gcc/infrastructure


# ===========
## functions:

extract() {
    if [ -f $1 ]; then
        case $1 in
            *.tar.bz2)   tar xvjf $1    ;;
            *.tar.gz)    tar xvzf $1    ;;
            *.bz2)       bunzip2 $1     ;;
            *.rar)       unrar x $1     ;;
            *.gz)        gunzip $1      ;;
            *.tar)       tar xvf $1     ;;
            *.tbz2)      tar xvjf $1    ;;
            *.tgz)       tar xvzf $1    ;;
            *.zip)       unzip $1       ;;
            *.Z)         uncompress $1  ;;
            *.7z)        7z x $1        ;;
            *)           echo "I don't know how to extract '$1'..." ;;
        esac
    else
        echo "'$1' is not a valid file!"
    fi
}

# ======================
## download and extract:

wget $MIRROR/$GMP
extract $GMP

wget $MIRROR/$MPFR
extract $MPFR

wget $MIRROR/$MPC
extract $MPC

wget $MIRROR/$ISL
extract $ISL

wget $MIRROR/$CLOOG
extract $CLOOG

A seguinte função bash é usada abaixo:

mkdircd () { mkdir -p "$@" && eval cd "\"\$$#\""; }

Cada um dos comandos abaixo deve ser emitido no diretório da biblioteca recém-baixada.

GMP

mkdircd build
../configure --disable-shared --enable-static --prefix=$PREFIX/gmp
make -j $THREADS && make check && make install

MPFR

mkdircd build
../configure --with-gmp=$PREFIX/gmp --disable-shared --enable-static --prefix=$PREFIX/mpfr
make -j $THREADS && make install

MPC

mkdircd build
../configure --with-gmp=$PREFIX/gmp --with-mpfr=$PREFIX/mpfr --disable-shared --enable-static --prefix=$PREFIX/mpc
make -j $THREADS && make install

ISL

mkdircd build
../configure --with-gmp-prefix=$PREFIX/gmp --disable-shared --enable-static --prefix=$PREFIX/isl
make -j $THREADS && make install

CLOOG

mkdircd build
../configure --with-gmp-prefix=$PREFIX/gmp --with-isl-prefix=$PREFIX/isl --disable-shared --enable-static --prefix=$PREFIX/cloog
make -j $THREADS && make install

gcc

mkdircd build
export LD_LIBRARY_PATH=$PREFIX/gmp/lib:$PREFIX/mpfr/lib:$PREFIX/mpc/lib:$PREFIX/isl/lib:$PREFIX/cloog/lib
export C_INCLUDE_PATH=$PREFIX/gmp/include:$PREFIX/mpfr/include:$PREFIX/mpc/include:$PREFIX/isl/include:$PREFIX/cloog/include
export CPLUS_INCLUDE_PATH=$PREFIX/gmp/include:$PREFIX/mpfr/include:$PREFIX/mpc/include:$PREFIX/isl/include:$PREFIX/cloog/include
../configure --with-gmp=$PREFIX/gmp --with-mpfr=$PREFIX/mpfr --with-mpc=$PREFIX/mpc --with-isl=$PREFIX/isl --with-cloog=$PREFIX/cloog --disable-shared --enable-static --disable-multilib --prefix=$PREFIX/gcc --enable-languages=c,c++,fortran
make -j $THREADS bootstrap && make install
Adobe
fonte
1
Isso é desnecessariamente complicado, as etapas em minha resposta também criam um GCC vinculado estaticamente, sem acesso de root, e você não precisa definir LD_LIBRARY_PATHpara usar o GCC resultante.
Jonathan Wakely
Isso também funciona em situações em que há conflitos com tudo o que está instalado em caminhos "bem definidos" (ou seja, casos em que o procedimento padrão falha de imediato). Versões mais recentes em 19-06-2017: gmp-6.1.2 mpfr-3.1.5 mpc-1.0.3 isl-0.16.1 cloog-0.18.4 gcc-7.1.0
Michael Goldshteyn
7

Usei o que Jonathan mencionou acima, exceto que tive que baixar gmp e mpfr manualmente e criar um link simbólico (a distribuição gcc 4.4.2 provavelmente não tem "download_prerequisites")

cd src/gcc-4.4.2
ln -s ~/linux64/gmp-4.2.1  gmp
ln -s ~/linux64/mpfr-2.3.0 mpfr

A propósito, usando "-with-gmp" e "with-mpfr" com "./configure" deu-me "configure: erro: não é possível calcular o sufixo dos arquivos objeto: não é possível compilar". Portanto, baixei os srcs do gmp e mpfr e criei o link virtual para eles de dentro do diretório gcc src top leve

vptr
fonte
2

Depois de tentar instalar dependências GCC, incluindo GMP, MPFR e MPC. Encontrei requisitos de instalação adicionais, Erros e arquivos ausentes; como arquivo de cabeçalho gmp.h exigido pelo MPFR para instalar. Existem vários problemas que você encontrará no processo. No entanto, há uma maneira mais fácil de construir e instalar o GCC-X.0.0 ou versão posterior com um link automático .

OPÇÃO UM.

Para evitar o trabalho de construir com make, instale e vincule as bibliotecas dinâmicas, simplesmente:

  • Baixe sua versão GCC-X.0.0 (com a versão mais recente em: https://gcc.gnu.org/ )

  • Extraia os arquivos gcc-X-000.tar.gz para um local / somepath /.

  • Depois de extrair o arquivo .tar.gz, execute o script ./contrib/download_prerequisites que está localizado em / somepath / ou no diretório de origem.

  • Este script irá baixar bibliotecas de suporte incluindo: GMP, MPFR e MPC e criar um Symlinks para você, que irá CONSTRUIR todas as dependências do gcc automaticamente como parte do processo de instalação do gcc.

    Não há necessidade de criar e vincular bibliotecas de suporte que foram baixadas para / somepath / emitindo Make, Make Install ou executando o arquivo ./configure ou adicionando links como --with-gmp = / gmp_path / ... / ..... , --with-mpfr = / mpfr_path / ... / ... porque isso foi feito quando você executou o script que criou links simbólicos .

OPÇÃO DOIS.

  • Use o seu sistema de gerenciamento de pacotes do SO para instalar as bibliotecas de suporte no local do sistema padrão. Para sistemas baseados em Debian, incluindo Ubuntu, instale libgmp-dev, libmpfr-dev e libmpc-dev . Para sistemas baseados em RPM, incluindo Fedora e SUSE, instale os pacotes gmp-devel e libmpc-devel ( mpc-devel no SUSE).
  • Esta opção instalará bibliotecas e arquivos de cabeçalho em um diretório de sistema padrão onde serão encontrados automaticamente ao construir o GCC.
  • Esta é a vantagem do gerenciamento de instalação do pacote de sistema operacional quando você invoca a instalação "sudo apt-get install libgmp-dev" ou "sudo apt-get install libmpfr-dev" e o link é feito para você. Além disso, você não precisa construir as bibliotecas de suporte com Make, Make install ou ./configure. Além disso, o processo leva alguns minutos para ser concluído.
  • Agora você pode prosseguir com a instalação do GCC.

CONFIGURAÇÃO:

This is the GCC config Process, with gcc-X-000.tar.gz 

Questão:

tar -xvf gcc-X-000.tar.gz 
cd gcc-X-000
./contrib/download_prerequisites
cd ..
mkdir objdir
/../gcc-X-000/configure --prefix=$HOME/gcc-X-000 --enable-languages=c,c++,fortran,go --disable-multilib
make -j 2
make install

NB:

--enable-languages como c ++ ou c.

--disable-multilib ; desative o multilib com base no seu sistema e sistema operacional, você será solicitado sobre o multilib para continuar.

O make levará muito tempo para ser concluído. No entanto, você pode emitir a opção -j #no_pro. Isso executará o Make simultaneamente em paralelo com base no número de processadores em seu PC ou Mac.

Para obter informações detalhadas sobre como executar este processo, você pode visitar: https://gcc.gnu.org/wiki/InstallingGCC .

Juniar
fonte
1

Segui a resposta mais aceita por joelparkerhenderson. Esta é a melhor resposta que pude encontrar para instalar em um sistema * NIX pela Internet.

Para a posteridade, quero acrescentar que se você receber um erro como "erro de instalação: não é possível calcular o sufixo dos arquivos objeto: não é possível compilar"

em seguida, atualize seu LD_LIBRBARY_PATH com / tmp / gcc / lib (consulte a resposta completa de joelparkerhenderson para o contexto)

/ tmp / gcc / lib contém todos os mpfr / mpc / gmp necessários para que os arquivos e o vinculador de tempo de execução não possam localizá-los, a menos que você os adicione a LD_LIBRARY_PATH. Também não se esqueça de exportar LD_LIBRARY_PATH;). Mais contexto aqui: https://gcc.gnu.org/wiki/FAQ#configure_suffix

Abhimanu Kumar
fonte
Ter que atualizar seu LD_LIBRARY_PATH apenas para usar o compilador é idiota. Se você usar stackoverflow.com/a/10662297/981959 em vez disso, isso não é necessário.
Jonathan Wakely