Gentoo Logo

Aviso : Este documento não é válido e não é mais mantido.


Guia de atualização do GCC do Gentoo Linux

Conteúdo:

1.  Introdução

Atualizando o GCC

Por que você deve atualizar? Bem, o GCC é parecido com qualquer outro pacote em seu sistema, apenas mais crítico. Você deve atualizar o GCC quando uma nova versão resolve um bug que incomoda você, nova funcionalidade é introduzida, ou se você quer manter seu sistema atualizado. Se nenhum dos casos anteriores aplicam-se a você, você pode adiar a atualização com segurança até sua versão do GCC deixar de ser suportada pelos desenvolvedores do Gentoo.

Se você instalar uma nova versão do GCC, o sistema não irá trocar para usá-lo automaticamente. Você terá que pedir a mudança explicitamente, porque o processo de migração pode necessitar de alguns passos adicionais. Se você decidir não trocar, o Portage continuará a usar a versão antiga de seu compilar, até você mudar de idéia, ou remover o compilador antigo de seu sistema.

Este guia irá documentar os passos necessários para fazer uma atualização do compilador usado por sua máquina Gentoo. Uma seção específica é dedicada para a atualização do GCC 3.3 para 3.4 ou versões superiores e problemas com libstdc++. Uma segunda seção é específica para usuários instalando pela primeira o Gentoo usando uma tarball de stage3, depois de uma nova versão maior/menor do GCC haver sido lançada.

Nota: Deve ser notado que atualizar do GCC-3.4 para GCC-4.0 ou maior não precisa de grandes mudanças feitas pelo usuário, já que GCC-3.4 e GCC-4.0 usam a mesma ABI. Tudo que é necessário é o uso de gcc-config para selecionar o compilador desejado.

2.  Instruções gerais de atualização

Introdução

Importante: Se você estiver procurando instruções específicas para atualização do GCC-3.3 para GCC-3.4 ou maior, por favor consulte a seção dedicada.

Importante: Se você estiver procurando instruções específicas para atualização do GCC em novas instalações, por favor consulte a seção dedicada.

Geralmente falando, atualizações de consertos de bugs, como da 3.3.5 para 3.3.6, são bem seguras -- só faça emerge da nova versão, peça para seu sistema usá-la e reconstrua o único pacote afetado, libtool. No entanto, algumas atualizações do GCC quebram compatibilidade de binários; em tais casos, uma reconstrução dos pacotes afetados (ou até mesmo toda a toolchain e o sistema) pode ser necessária.

Quando nós falamos da necessidade de mudar seu compilador para a nova versão manualmente, nós dissemos que a mudança não irá acontecer, automaticamente. No entanto, existe uma exceção -- atualizações de consertos de bug, como de 3.3.5 para 3.3.6, caso você não use a funcionalidade "multislot", permitindo que coexistam em um sistema. Multislot está desligado por padrão, já que a maioria dos usuários não tiram proveito disso.

Listagem de código 2.1: Atualizando o GCC

# emerge -uav gcc

(Por favor substituia "i686-pc-linux-gnu-3.4.4" com a versão
do GCC e ajustes de CHOST para que você atualizou:)
# gcc-config i686-pc-linux-gnu-3.4.4
# source /etc/profile

(Reconstruindo libtool)
# emerge --oneshot -av libtool

Agora, vamos reconstruir a toolchain e o world, para que possamos fazer uso do novo compilador.

Listagem de código 2.2: Reconstruindo o sistema

# emerge -eav system
# emerge -eav world

É seguro remover a versão antiga do GCC agora. Se você precisar fazer isso, rode o seguinte comando (como sempre, troque =sys-devel/gcc-3.3* pela versão que você quer desinstalar):

Listagem de código 2.3: Removendo versão antiga do GCC

# emerge -aC =sys-devel/gcc-3.3*

3.  Atualizando do GCC-3.3 para 3.4 ou maior

Introdução

A atualização do GCC/3.3 para 3.4 não é tão fácil, já que a ABI de C++ mudou entre as duas versões. Há um problema com a biblioteca libstdc++, com a qual também deve ser lidada.

As escolhas

Importante: Se você estiver atualizando uma máquina SPARC, você terá que fazer uma reconstrução completa do sistema devida a algumas mudanças de ABI internas na passagem de parâmetros do GCC.

Você tem duas possibilidades de como atualizar seu sistema. O primeiro método é mais rápido e requer o uso da ferramenta revdep-rebuild do pacote gentoolkit, enquanto o segundo reconstrói o sistema inteiro do zero, para tirar proveito das novas funções do GCC. É sua a decisão decidir qual dos dois métodos usar. Na maior parte dos casos, o primeiro método é suficiente.

Usando revdep-rebuild

Este método requer que você primeiro instale o gentoolkit, se você ainda não tiver o feito. Então, nós iremos atualizar o GCC e trocar para o novo compilador. Nós também iremos reconstruir o pacote libtool para certificar que a toolchain está saudável.

Listagem de código 3.1: Instalando o gentoolkit e atualizando o GCC

# emerge -an gentoolkit
# emerge -uav gcc
# gcc-config i686-pc-linux-gnu-3.4.4
# source /etc/profile

(Reconstruindo libtool)
# emerge --oneshot -av libtool

Nota: Isto presume que você tem CHOST="i686-pc-linux-gnu" configurado. Se você estiver usando outro CHOST, por favor use a linha de gcc-config adequada.

Agora, nós queremos ver pacotes que o revdep-rebuild irá querer reconstruir. A seguir, nós pediremos para o revdep-rebuild realmente reconstruir os pacotes. Isto pode demorar um pouco, então tenha paciência.

Listagem de código 3.2: Usando revdep-rebuild

# revdep-rebuild --library libstdc++.so.5 -- -p -v
# revdep-rebuild --library libstdc++.so.5

Nota: É possível que você possa ter problemas com versões de pacotes não existentes devido a eles estarem obsoletos ou mascarados. Se este for o caso, você deve usar a opção --package-names junto com o revdep-rebuild. Isto faz com que pacotes sejam recompilados com base no nome do pacote, ao invés de nome e versão exatas.

Para ter compatibilidade com aplicações binárias C++ antigas e outros pacotes que o revdep-rebuild pode ter perdido, sys-libs/libstdc++-v3 precisa ser instalado antes de você desinstalar o GCC 3.3 de seu sistema.

Listagem de código 3.3: Instalando o libstdc++-v3 e limpando

# emerge --oneshot sys-libs/libstdc++-v3
# emerge -aC =sys-devel/gcc-3.3*

Usando emerge -e

Este método, embora seja mais lento, irá reconstruir seu sistema inteiro para ter certeza de que tudo foi reconstruído com seu novo compilador, e é portanto mais seguro. Primeiro, você irá atualizar o GCC e libtool e trocar para seu novo compilador.

Listagem de código 3.4: Atualizando o GCC

# emerge -uav gcc
# gcc-config i686-pc-linux-gnu-3.4.4
# source /etc/profile

(Reconstruindo libtool)
# emerge --oneshot -av libtool

Nota: Isto presume que você tem CHOST="i686-pc-linux-gnu" configurado. Se você estiver usando outro CHOST, por favor use a linha de gcc-config adequada.

Para ter compatibilidade com aplicações binárias C++ mais antigas, sys-libs/libstdc++-v3 precisa ser instalado em seu sistema.

Listagem de código 3.5: Instalando libstdc++-v3

# emerge --oneshot sys-libs/libstdc++-v3

Agora nós iremos primeiro reconstruir o alvo system, depois o alvo world. Isto irá demorar muito, dependendo do número de pacotes que você tem instalado, já que irá reconstruir toda a toolchain e arquivos de sistema de suporte, seguido de todos pacotes em seu sistema, incluindo a toolchain. Isto é necessário para ter certeza que todos pacotes foram compilados com a nova toolchain, incluindo a própria toolchain.

Listagem de código 3.6: Reconstruindo system e world

# emerge -e system
# emerge -e world

Agora é seguro remover versões antigas do GCC:

Listagem de código 3.7: Limpando

# emerge -aC =sys-devel/gcc-3.3*

4.  Atualizando o GCC em uma primeira instalação

Introdução

Uma atualização do GCC em um sistema depois da instalação de uma tarball de stage3 é uma tarefa simples. Uma vantagem que os usuários de novas instalações têm é que eles não têm muito software instalado que se liga contra a versão antiga do GCC. O exemplo seguinte é para uma atualização de GCC-3.3 para 3.4 ou superior. Certas partes serão diferentes se a atualização for de outras versões de GCC. Por exemplo, os nomes de biblioteca usados para revdep-rebuild são específicos do GCC 3.3, bem como a necessidade de instalar libstdc++-v3.

Se um usuário ainda não houver personalizado seu sistema, são poucos passos para atualizar seu sistema para uma nova versão do GCC. Como a atualização de GCC-3.3 para 3.4, o usuário tem duas opções. No entanto, diferente da atualização de GCC-3.3 para 3.4, este é menos complicado, já que há menos diferenças entre os métodos. O primeiro método é mais rápido e faz uso da ferramenta revdep-rebuild do gentoolkit, parecido com o procedimento acima. Usar revdep-rebuild só faz com que pacotes que realmente se ligam contra bibliotecas do GCC sejam reconstruídos, enquanto o segundo método faz com que seu sistema novo inteiro seja recompilado com a nova versão de GCC e leva muito mais tempo. Este segundo método nunca é necessário e só é documentado para ser completo.

Estes primeiros passos são comuns com os dois métodos, e devem ser feitos por todos.

Listagem de código 4.1: Atualizando o GCC

# emerge -uav gcc
# gcc-config i686-pc-linux-gnu-3.4.4
# source /etc/profile

(Reconstruindo libtool)
# emerge --oneshot -av libtool

Nota: Isto presume que você tem CHOST="i686-pc-linux-gnu" configurado. Se você estiver usando outro CHOST, por favor use a linha de gcc-config apropriada.

Para oferecer compatibilidade com aplicações C++ binárias mais antigas, sys-libs/libstdc++-v3 deve ser instalado no seu sistema.

Listagem de código 4.2: Instalando libstdc++-v3

# emerge --oneshot sys-libs/libstdc++-v3

Usando revdep-rebuild

Este método necessita que você primeiro instale gentoolkit se você ainda não tiver o feito. Nós iremos então rodar revdep-rebuild para realmente procurar dentre os pacotes instalados os que precisamos reconstruir, e depois fazer a reconstrução.

Listagem de código 4.3: Instalando gentoolkit e rodando revdep-rebuild

# emerge -an gentoolkit
# revdep-rebuild --library libstdc++.so.5 -- -p -v
# revdep-rebuild --library libstdc++.so.5

Nota: É possível que você tenha problemas com versões de pacote inexistentes devido a serem velhas ou mascaradas. Se for o caso, você deve usar a opção --package-names com o revdep-rebuild. Isto faz com que pacotes sejam recompilados com base no nome de pacote, ao invés do nome e versão exatos.

Usando emerge -e

Este método, embora muito mais lento, irá reconstruir o alvo system para certificar que tudo foi reconstruído com seu novo compilador. Isto não é necessário, mas é válido se você também estiver fazendo mudanças a CFLAGS ou outras variáveis de make.conf que irão afetar a compilação de sistema.

Listagem de código 4.4: Atualizando o GCC

# emerge -uav gcc
# gcc-config i686-pc-linux-gnu-3.4.4
# source /etc/profile

(Reconstruindo o libtool)
# emerge --oneshot -av libtool

Nota: Isto presume que você tem CHOST="i686-pc-linux-gnu" configurado. Se você estiver usando outro CHOST, por favor use a linha de gcc-config apropriada.

Para oferecer compatibilidade com binários C++ mais antigos, sys-libs/libstdc++-v3 precisa ser instalado em seu sistema.

Listagem de código 4.5: Instalando libstdc++-v3

# emerge --oneshot sys-libs/libstdc++-v3

Já que estamos fazendo estas ações depois de uma instalação inicial, nós não precisamos recompilar o alvo world como faríamos depois de fazer uma atualização em um sistema já instalado. No entanto, você pode desejar fazer uma atualização do world ao invés de system, para certificar-se de todos pacotes foram atualizados.

Listagem de código 4.6: Reconstruindo system

# emerge -e system

Também é seguro remover versões mais antigas de GCC agora. Já que esta é uma instalação inicial, nós estamos usando a função prune do Portage para remover todas versões mais antigas do GCC.

Listagem de código 4.7: Limpando

# emerge -aC "<sys-devel/gcc-SUA-NOVA-VERSÃO-DE-GCC"

5.  Erros comuns

É importante desligar o distcc durante a atualização. Misturar versões de compiladores em seus nódulos irá causar problemas de construção. Isto não é necessário para o ccache, já que os objetos de cache serão invalidados de qualquer jeito.

Sempre use a mesma versão de GCC para seu kernel e módulos de kernel adicionais. Uma vez que você reconstruir seu world com o novo GCC, módulos externos (como app-emulation/qemu-softmmu) não carregarão com sucesso. Por favor, reconstrua seu kernel com o novo GCC para consertar este problema.

Se você estiver atualizando em uma máquina SPARC, certifique-se de rodar silo -f novamente após fazer emerge world para evitar possíveis problemas.

Mensagens de erro freqüentes

Se seu sistema reclamar sobre algo como libtool: link: `/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6/libstdc++.la' is not a valid libtool archive, por favor, rode /sbin/fix_libtool_files.sh 3.3.6 (substitua "3.3.6" com os números da versão da mensagem de erro).

Se você vir error: /usr/bin/gcc-config: line 632: /etc/env.d/gcc/i686-pc-linux-gnu-3.3.5: No such file or directory, então tente apagar /etc/env.d/gcc/config-i686-pc-linux-gnu e rodar gcc-config novamente, seguido de source /etc/profile. Só faça isso se você não tiver cross-compiladores configurados, todavia.

Se um pacote falhar durante emerge -e system ou emerge -e world, você pode continuar a operação com emerge --resume. Se um pacote falhar repetidamente, pule-o com emerge --resume --skipfirst. Não rode outras instâncias do emerge no meio termo, ou você perderá a informação para continuar.

Se você obtiver uma mensagem de erro spec failure: unrecognized spec option enquanto estiver atualizando seu compilador, tente voltar para seu compilador padrão, apague a variável GCC_SPECS e atualize o GCC novamente:

Listagem de código 5.1: Voltando a specs primários

# gcc-config 1
# source /etc/profile
# unset GCC_SPECS
# emerge -uav gcc


Imprimir

Atualizado 9 de fevereiro de 2006

A versão original desta tradução não é mais mantida

Resumo: Este documento serve como guia para o usuário atualizar o GCC em suas máquinas rodando Gentoo Linux.

Wernfried Haas
Autor

Jan Kundrát
Autor

Mark Loeser
Editor

Marcelo Góes
Tradutor

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.