Eu não uso muito o Ubuntu, sendo um engenheiro de plataformas e construção em uma organização que é principalmente a Red Hat Enterprise e seus similares.
O problema de apenas construir e usar um GCC atualizado são as bibliotecas de tempo de execução da linguagem. Eu teria que distribuí-los, complicando as remessas e deixando os advogados nervosos com a GPL, ou exigir que meus clientes construíssem e instalassem o mesmo GCC.
Eu produzo software comercial de código fechado, principalmente modelagem matemática, compilado a partir de fontes C e C++ e enviado como bibliotecas compartilhadas. Isso significa que estou extremamente interessado em obter compatibilidade binária entre distribuições. Isso é prático porque tudo o que minhas bibliotecas precisam está disponível na glibc e nos tempos de execução da linguagem GCC ( libgcc_s.so.1
e libstdc++.so.6
). Ambos os conjuntos de bibliotecas têm compatibilidade futura muito forte, devido ao fato de todos os seus símbolos serem versionados e novas versões serem criadas sempre que há uma mudança de comportamento.
Atualmente, faço minhas compilações no RHEL 8.x. Ele possui GCC (8.x) e glibc (2.28) bastante antigos; portanto, se eu construísse minhas bibliotecas usando-o ingenuamente, teria compatibilidade futura com Linux com versões iguais ou posteriores dessas bibliotecas. No entanto, aquele antigo GCC não suporta o padrão de linguagem C++20, que os desenvolvedores desejam muito usar, muito menos o novo padrão C++23. RHEL fornece uma solução para isso, mas não encontrei nada semelhante para o Ubuntu.
A solução Red Hat é um "conjunto de ferramentas GCC". Existem vários deles, mas todos funcionam da mesma maneira. Eles fornecem uma versão posterior do GCC, construída para rodar nos tempos de execução do RHEL 8.x, nos cabeçalhos padrão e em alguns scripts especiais para GNU ld
. Esses scripts dizem ao vinculador para usar as bibliotecas do sistema para os tempos de execução da linguagem GCC sempre que possível, e para funções que não estão nas bibliotecas do sistema, vincular estaticamente o código necessário à biblioteca compartilhada (ou executável) que está sendo vinculada. Isso parece assustador, mas funciona extremamente bem. Provavelmente isso ocorre porque a Red Hat é uma grande contribuidora para o GCC e garante que ele continue funcionando.
O Ubuntu tem algo semelhante? Eu gostaria de ter uma alternativa ao Red Hat, caso a exploração das brechas da GPL consiga eliminar as semelhanças de trabalho de seu sistema operacional, que é muito caro para ser executado em todas as máquinas de teste.
Meu conhecimento atual de compilação e tempos de execução do Ubuntu é explicado em minha resposta a uma pergunta relacionada aqui .
Para o caso C++20, mudar para o Ubuntu LTS 22.04 preencheria a necessidade. No entanto, o C++23 está começando a aparecer. Podemos esperar o Ubuntu LTS 24.04 em breve, mas provavelmente será muito cedo para o suporte ao C++ 23 no GCC 14, com lançamento previsto para abril ou maio de 2024. Estou presumindo que os clientes "empresariais" do Ubuntu irão instale apenas versões LTS em seus servidores principais, em vez das versões intermediárias.
Se o Ubuntu não fizer isso, tudo bem. Dado que é um Enterprise Linux, pensei que poderia estar faltando alguma coisa.
Não conheço algo semelhante no Ubuntu às 'bibliotecas shim' que você descreve - e que reconhecidamente são uma solução elegante para um problema. No entanto, acho que o problema não é tão proeminente no Ubuntu.
As versões do Ubuntu geralmente incluem (e são construídas com, consulte o conjunto de ferramentas PPA e a página Wiki relacionada ) a versão upstream mais recente do GCC.
Por exemplo, o 22.04 LTS tinha o GCC 11.2, que era o lançamento mais recente da FSF na época, e o Ubuntu 23.10 tinha o GCC 13.2, o lançamento atual da FSF (julho de 23). Com os lançamentos do Ubuntu saindo a cada seis meses, na prática você sempre estará no GCC mais recente.
(Existe até o
gcc-snapsnot
pacote com a versão de desenvolvimento upstream mais recente do GCC, mas não se destina a compilações distribuíveis.)O problema existiria apenas para desenvolvedores que trabalham com, digamos, 20.04 LTS (a versão mais antiga do Ubuntu suportada), que precisam de um compilador mais recente que o GCC 9.3. Não consigo pensar em uma solução mais simples para esse problema do que apenas atualizar para 22.04 LTS ou 23.10 e obter o GCC mais recente gratuitamente com ele.
Além disso, se eles precisarem de recursos do GCC mais recente (e estiverem direcionados ao Ubuntu), então isso quase certamente seria para construir software para o próximo lançamento. Por que eles fariam isso a partir de 20.04 LTS?
Considerando que se isso for para manutenção de software em uma versão suportada (atualmente 20.04, 22.04 e 23.10), então seria improvável que isso exigisse uma grande atualização do GCC. Isso pode ser um problema maior para a Canonical, com o programa de manutenção estendida (ESM).
Sim. Vá para https://gnu.org , baixe a fonte do GCC e o ambiente de construção, instale o
build-essential
pacote. Leia todos osREADME*
arquivos e outros documentos que o acompanham. Leiaman hier
para ver onde colocá-lo (provavelmente a/usr/local
árvore) e especifique-o ao executar./configure