5 votes

Comment puis-je utiliser une version ultérieure de GCC que celle prise en charge par les runtimes du système? Le logiciel construit avec peut-il s'exécuter sur un système avec seulement des paquets no

Je n'utilise pas Ubuntu très souvent, étant ingénieur plates-formes et builds dans une organisation principalement axée sur Red Hat Enterprise et ses équivalents.

Le problème avec simplement construire et utiliser un GCC à jour est la bibliothèque d'exécution du langage. Je devrais soit les distribuer, compliquant les envois et rendant les avocats nerveux à propos du GPL, soit exiger que mes clients construisent et installent le même GCC.

Je produis des logiciels commerciaux à code source fermé, principalement des modèles mathématiques, compilés à partir de sources en C et C++ et expédiés en tant que bibliothèques partagées. Cela signifie que je souhaite vivement parvenir à une compatibilité binaire entre distributions. Cela est pratique car tout ce dont mes bibliothèques ont besoin est disponible dans glibc et les exécutions des langages GCC (libgcc_s.so.1 et libstdc++.so.6). Ces ensembles de bibliothèques offrent une très forte compatibilité ascendante, grâce à tous leurs symboles étant versionnés, et de nouvelles versions étant créées à chaque fois qu'il y a un changement de comportement.

Actuellement, je réalise mes constructions sur RHEL 8.x. Cela dispose d'un GCC (8.x) et d'un glibc (2.28) assez anciens, donc si je construisais mes bibliothèques en l'utilisant de manière naïve, j'aurais une compatibilité ascendante avec les Linux disposant de versions égales ou ultérieures de ces bibliothèques. Cependant, ce vieux GCC ne gère pas la norme de langage C++20, que les développeurs souhaitent vivement utiliser, et encore moins la nouvelle norme C++23. RHEL propose une solution pour cela, mais je n'ai rien trouvé de similaire pour Ubuntu.

La solution de Red Hat est un "GCC Toolset". Il existe toute une gamme de ces outils, mais ils fonctionnent tous de la même façon. Ils fournissent une version plus récente de GCC, construite pour s'exécuter sur les exécutions de RHEL 8.x, les en-têtes standard, et quelques scripts spéciaux pour GNU ld. Ces scripts indiquent au lieur d'utiliser les bibliothèques système pour les exécutions des langages GCC lorsqu'elles sont disponibles, et pour les fonctions qui ne sont pas dans les bibliothèques système, lient de manière statique le code requis dans la bibliothèque partagée (ou l'exécutable) en cours de liaison. Cela peut sembler effrayant, mais cela fonctionne extrêmement bien. C'est probablement parce que Red Hat est un contributeur majeur à GCC et veille à ce qu'il continue de fonctionner.

Ubuntu a-t-il quelque chose de similaire? J'aimerais avoir une alternative à Red Hat, au cas où leur exploitation des failles du GPL parviendrait à éliminer les équivalents de travail pour leur OS, qui est trop cher à exécuter sur chaque machine de test.

Mes connaissances actuelles sur la compilation et les exécutions Ubuntu sont expliquées dans ma réponse à une question connexe ici.

Pour le cas du C++20, passer à Ubuntu LTS 22.04 remplirait le besoin. Cependant, le C++23 commence à apparaître. Nous pouvons nous attendre à Ubuntu LTS 24.04 assez prochainement, mais il sera probablement trop tôt pour le support du C++23 dans GCC 14, censé être publié en avril ou mai 2024. Je pars du principe que les clients "Enterprise" d'Ubuntu n'installeront que les versions LTS sur leurs serveurs principaux, plutôt que les versions intermédiaires.

Si Ubuntu ne le fait pas, ce n'est pas grave. Étant donné que c'est un Linux Enterprise, je pensais peut-être passer à côté de quelque chose.

5voto

zwets Points 11050

Je ne suis pas au courant de quelque chose de similaire dans Ubuntu aux "bibliothèques shim" que vous décrivez - et qui sont effectivement une solution élégante à un problème. Cependant, je pense que le problème n'est pas aussi proéminent dans Ubuntu.

Les versions d'Ubuntu incluent généralement (et sont construites avec, voir le PPA de la chaîne d'outils et la page Wiki associée) la dernière version upstream de GCC.

Par exemple, la LTS 22.04 avait GCC 11.2, qui était la dernière version de la FSF à l'époque, et Ubuntu 23.10 a GCC 13.2, la version actuelle de la FSF (Juillet '23). Avec des versions d'Ubuntu sortant tous les six mois, en pratique vous aurez toujours la dernière version de GCC.

(Il y a même le paquet gcc-snapshot avec la dernière version de développement upstream de GCC, mais ce n'est pas destiné aux constructions distribuables.)

Le problème n'existerait donc que pour les développeurs travaillant avec, disons, la LTS 20.04 (la plus ancienne version d'Ubuntu supportée), qui ont besoin d'un compilateur plus récent que GCC 9.3. Je ne pense pas qu'il y ait une solution plus simple à ce problème que de simplement passer à la LTS 22.04 ou 23.10, et d'obtenir gratuitement la dernière version de GCC avec.

De plus, s'ils ont besoin de fonctionnalités de la dernière version de GCC (et ciblent Ubuntu), alors cela serait presque certainement pour construire des logiciels pour la prochaine version. Pourquoi le feraient-ils depuis 20.04 LTS ?

Alors que s'il s'agit de la maintenance de logiciels sur une version supportée (actuellement 20.04, 22.04 et 23.10), il serait peu probable que cela nécessite une mise à niveau majeure de GCC. Cela pourrait cependant poser un problème pour Canonical, avec le programme de maintenance étendue (ESM).

3voto

waltinator Points 32821

Oui. Allez sur https://gnu.org, téléchargez les sources de GCC et l'environnement de construction, installez le paquet build-essential. Lisez tous les fichiers README* et autres documents qui l'accompagnent. Lisez man hier pour savoir où le mettre (probablement dans l'arborescence /usr/local) et spécifiez-le lorsque vous exécutez ./configure

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X