Criando o GCC em uma pasta não raiz

1

Tudo bem, então esta é minha primeira pergunta aqui - provavelmente de muitos.

Eu sou um noob do Linux e estou tentando aprender a construir a partir da fonte.

My environment: SSH'd via Putty into Ubuntu Server 14.04.5 on a VM in Windows 10

Eu quero que o GCC seja o primeiro programa que eu construa a partir do código-fonte.

Aqui está o meu processo até agora:

A fim de obter o GCC para que eu possa criar um GCC diferente (engraçado, eu sei), do meu diretório padrão /home/anton eu corri:

sudo apt-get install build-essential
sudo apt-get install m4
sudo apt-get install texinfo

Meu objetivo é criar outro diretório, fora do root, meu diretório de origem para a nova compilação do GCC - vamos chamá-lo de /AntonProj1

Estou tendo um problema com os próximos passos ... aqui estão os meus pensamentos; por favor, deixe-me saber se esta é a lógica correta ou se estou interpretando o processo de compilação / dependência errado.

  • Etapa 1) Faça o download do GCC (gcc-4.1-20080630.tar.bz2 de link ) em /AntonProj1 [vou usar o FileZilla para mover manualmente o arquivo .bz2 para /AntonProj1
  • Etapa 2) Executar contrib/download_prerequisites em /AntonProj1
  • Etapa 3) export PREFIX="AntonProj1/opt/gcc-4.1" ??? < - Isto parece correto?

O passo 3 é sobre onde minha confusão começa ... ou pelo menos onde eu me sinto presa.

Eu li algo aqui que diz:

"Please note that we build everything out of the source directory tree, as is considered good practice. Some packages only support building outside, some only inside and some both (but may not offer extensive checking with make). Building GCC inside the source directory tree fails miserably, at least for older versions."

Isso é apenas dizer que não há problema em criar o GCC em /AntonProj1 (já que o GCC que estou usando para criar esse GCC está em um diretório de origem diferente); mas, por exemplo, se eu quiser usar a nova versão do GCC localizada em /AntonProj1 para criar outros programas ... digamos, algo como o Lynx, preciso ter certeza de que o diretório de origem do Lynx é diferente de /AntonProj1 . . . talvez algo como /AntonProj1/Lynx ?

TL; DR: Qual é a melhor abordagem para se preparar para compilar o GCC a partir do código-fonte quando minhas restrições forem:

  • 1) Faça o download e compile o GCC em /AntonProj1
  • 2) Use o GCC que foi baixado e compilado em /AntonProj1 para criar outros programas a partir da origem, tudo dentro da pasta /AntonProj1
por Anton Rasmussen 24.03.2017 / 17:30

2 respostas

0

Aqui está o processo que acabou funcionando para mim:

Crie diretórios para armazenar os downloads e os diretórios descompactados:

sudo mkdir -p /AntonProj1/opt/downloads /AntonProj1/tmp
  • Passo 1) Faça o download do GCC (gcc-4.1-20080630.tar.bz2 de link ) em /AntonProj1/opt/downloads [usei o FileZilla para mover manualmente o arquivo .bz2 para /AntonProj1

  • Etapa 2) Mova os arquivos para /AntonProj1/opt/downloads

  • Etapa 3) Execute os seguintes comandos:

    sudo apt-get install build-essential sudo apt-get m4 sudo apt-get texinfo

    sudo apt-get install libgmp3-dev sudo apt-get install libmpfr-dev libmpfr-doc libmpfr4 libmpfr4-dbg

    sudo apt-get update sudo apt-get upgrade sudo apt-get autoremove

E agora para a parte mais importante / demorada: (Isto é onde nós realmente garantimos que estamos construindo no diretório desejado /AntonProj1

sudo ./configure -prefix=/AntonProj1 --without-[blah blah]*

* O --without-[blah blah] é uma maneira de ajudar a resolver problemas de dependência quando você faz o comando que realmente cria a partir da origem:

sudo make

* Ou seja, as chances são de que o .configure mostre quais dependências estão faltando ... e podem até parar antes que o makefile seja criado. No entanto, mesmo se um makefile for criado, quando você for realmente sudo make , poderá (leia: will) descobrir que a compilação falha. Então, se você continuar tendo falhas de construção, mesmo quando você instalar as dependências solicitadas, pode ser uma questão de dizer ao compilador para não se preocupar com certas coisas, isso pode ser feito com --without-[blah blah] ; mais sobre os sinalizadores ./configure podem ser encontrados executando .configure -h para acessar o arquivo de ajuda.

Observação: se você acabar alterando as sinalizações ./configure , será necessário executar:

sudo make clean

e, em seguida, ./configure novamente com as novas bandeiras.

    
por Anton Rasmussen 30.03.2017 / 18:11
1

Primeiro, como você executou sudo apt-get install build-essential , você deve ter o gcc instalado. Você pode descobrir qual versão você possui executando gcc -v . A localização desta versão instalada seria /usr/lib/gcc/version-number/ .

/usr/bin/gcc é o local padrão do binário de gcc no Ubuntu.

Em seguida, Você quer instalar uma versão anterior.

  1. Para gcc-4.1

Como esta versão está disponível nas versões mais antigas do Ubuntu, precisamos ter os repositórios apropriados para a versão. De alguma pesquisa, descobri que eles são os seguintes, que devem ser adicionados ao /etc/apt/sources.list

deb     http://snapshot.debian.org/archive/debian/20070730T000000Z/ lenny main
deb-src http://snapshot.debian.org/archive/debian/20070730T000000Z/ lenny main
deb     http://snapshot.debian.org/archive/debian-security/20070730T000000Z/ lenny/updates main
deb-src http://snapshot.debian.org/archive/debian-security/20070730T000000Z/ lenny/updates main

* Estes links foram retirados de esta resposta .

Depois de fazer sudo apt-get update , os novos repositórios estarão disponíveis.

Em seguida, instale o compilador necessário. Eu costumo instalar gcc e g++ da mesma versão para interoperabilidade. Para fins gerais, é recomendado.

Por isso,

sudo apt-get install gcc-4.1 g++-4.1

2. Verificando os compiladores disponíveis

Nesse estágio, um deles terá dois conjuntos de compiladores (oen cada para g++ e gcc ). Estes podem ser verificados por dpkg --list | grep compiler ,

dpkg --list | grep compiler
ii  antlr3.2                              3.2-14                                              all          language tool for constructing recognizers, compilers etc
ii  g++                                   4:5.3.1-1ubuntu1                                    amd64        GNU C++ compiler
ii  g++-4.1                               4.1.2-13                                            amd64        The GNU C++ compiler
ii  g++-4.1-multilib                      4.1.2-13                                            amd64        The GNU C++ compiler (multilib files)
ii  g++-5                                 5.4.0-6ubuntu1~16.04.4                              amd64        GNU C++ compiler
ii  gcc                                   4:5.3.1-1ubuntu1                                    amd64        GNU C compiler
ii  gcc-4.1                               4.1.2-13                                            amd64        The GNU C compiler
ii  gcc-4.1-multilib                      4.1.2-13                                            amd64        The GNU C compiler (multilib files)
ii  gcc-5                                 5.4.0-6ubuntu1~16.04.4                              amd64        GNU C compiler
ii  gcc-5-multilib                        5.4.0-6ubuntu1~16.04.4                              amd64        GNU C compiler (multilib support)
ii  gcc-multilib                          4:5.3.1-1ubuntu1                                    amd64        GNU C compiler (multilib files)
ii  hardening-includes                    2.7ubuntu2                                          all          Makefile for enabling compiler flags for security hardening
ii  libantlr-java                         2.7.7+dfsg-6ubuntu1                                 all          language tool for constructing recognizers, compilers etc (java library)
ii  libllvm3.8:amd64                      1:3.8-2ubuntu3                                      amd64        Modular compiler and toolchain technologies, runtime library
ii  libllvm3.8:i386                       1:3.8-2ubuntu3                                      i386         Modular compiler and toolchain technologies, runtime library
ii  libxkbcommon0:amd64                   0.5.0-1ubuntu2                                      amd64        library interface to the XKB compiler - shared librar

Importante é a localização dos dois conjuntos de compiladores, que podem ser listados por

ls -lh /usr/bin/gcc*
lrwxrwxrwx 1 root root    5  五   5  2016 /usr/bin/gcc -> gcc-5
-rwxr-xr-x 1 root root 208K  七  10  2007 /usr/bin/gcc-4.1
-rwxr-xr-x 1 root root 895K 十一  3 10:00 /usr/bin/gcc-5

e

ls -lh /usr/bin/g++*
-rwxr-xr-x 1 root root 210K  七  10  2007 /usr/bin/g++-4.1
-rwxr-xr-x 1 root root 899K 十一  3 09:41 /usr/bin/g++-5
  1. Selecionando um compilador para o propósito atual (criação de um aplicativo)

Depois de ter exigido compiladores instalados, pode-se simplesmente alternar entre os compiladores. Isso é feito atualizando a lista de versões alternativas de um aplicativo. Para fazer isso, o comando update-alternative deve ser executado com determinados parâmetros.

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 60 --slave /usr/bin/g++ g++ /usr/bin/g++-5
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.1 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.1
sudo update-alternatives --config gcc

Isso vinculará g++ a gcc e, ao alterar somente gcc , o g++ será alterado automaticamente.

Então, sempre que você quiser mudar o compilador, digite:

sudo update-alternatives --config gcc

Em seguida, o usuário é questionado sobre qual compilador escolher.

  Selection    Path              Priority   Status
------------------------------------------------------------
* 0            /usr/bin/gcc-5     60        auto mode
  1            /usr/bin/gcc-4.1   40        manual mode
Press <enter> to keep the current choice[*], or type selection number:

Aqui você pode escolher pressionando a tecla (0,1) e pressionando enter. A mudança na versão atual selecionada pode ser verificada por gcc -v .

4. Construindo um aplicativo usando compiladores instalados

Algumas diretrizes básicas:

  • Em geral, há duas etapas, criação ( build ) e criação ( make ). A etapa build envolve a geração de códigos específicos do sistema para instalação, o que requer a vinculação aos compiladores necessários. make é equivalente a instalação em algum diretório. Qualquer aplicativo pode ser build e make em qualquer pasta, conforme decidido pelo usuário.
  • Para build , uma pasta temporária é escolhida. Esta pasta pode ser removida após uma etapa make bem-sucedida. É importante que, para a etapa make , o destino da instalação seja definido normalmente por --prefix=/path/to/folder enquanto o script build é executado. Por exemplo, se o script de configuração for .setup , na maioria dos casos, ./setup --prefix=/path/to/installation/folder

Para detalhes específicos, consulte o manual ou as diretrizes para sua inscrição.

Ao executar o script de construção, a versão atual do compilador selecionada (para gcc e g++ ) será usada. Ao executar o aplicativo instalado, o comportamento dependerá do caso de o programa extrair o compilador da variável de ambiente ou estar vinculado ao binário específico. Isso deve ser verificado após a instalação.

  • cmake e make são utilitários separados usados para instalação. Aplicativos diferentes requerem versões diferentes, portanto, instale o utilitário e a versão necessários de acordo.

  • A etapa de build e make é igual para os compiladores também.

por ankit7540 28.03.2017 / 15:51