Guia de atualização do GCC do Gentoo Linux
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
# gcc-config i686-pc-linux-gnu-3.4.4
# source /etc/profile
# 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
# 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
# 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
# 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
# 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
|
O conteúdo deste documento está licenciado pela licença Creative Commons -
Attribution / Share Alike.
|