Utilisation d'ABI_X86 dans Gentoo


24

Cela fait des mois que je n'ai pas mis à jour mon système Gentoo. Et, comme vous pouvez l'imaginer, cela signifie qu'il y a beaucoup de packages (et de modifications USE) que je dois parcourir. Mon système est "amd64" (multilib), mais j'ai beaucoup de packages manuellement saisis par mot de passe de "~ amd64".

Quoi qu'il en soit, dans cette mise à jour, je vois toujours des drapeaux USE "ABI_X86". Qu'est-ce que c'est? C'est nouveau. Il n'y a rien dans la "liste des nouvelles eselect" à ce sujet.

J'ai trouvé ce sujet: http://forums.gentoo.org/viewtopic-t-953900-start-0.html . Cela semblait montrer comment l'utiliser, mais y a-t-il de "vrais" documents pour cela? Qu'est ce que ça fait? Que suis - je censé pour régler « ABI_X86 » à? J'ai un système multilib. Je suppose que je veux "64", mais qu'est-ce que "32" et "x32"? Je suis confus quant à ce que je dois faire ici.

Emerge crie beaucoup sur les conflits de slot, et ils semblent être liés à "ABI_X86" (j'oublie les erreurs exactement, mais je me souviens que c'était zlib).

Alors, y a-t-il des documents "officiels" sur ce qu'est ABI_X86et comment l'utiliser?

À partir du fil que j'ai lié, j'ai trouvé cette page: http://kicherer.org/joomla/index.php/en/blog/liste/29-transition-of-emul-packages-to-true-multilib , mais je veux pour savoir ce que je fais avant de créer des mots clés pour un tas de choses et de les modifier make.conf.

PS J'ai la plupart des packages "app-emulation / emul-linux-x86" (ceux dont je semblais avoir besoin à l'époque) dans mon fichier "package.keywords".

Réponses:


32

Je dois révéler que j'ai peu d'expérience en utilisant multilib-build.eclass-style multilib dans Gentoo.

ABI_X86est une USE_EXPANDvariable; réglage ABI_X86="32 64"ou USE="abi_x86_32 abi_x86_64"sont équivalentes. Le paramètre par défaut de ABI_X86, au moment de la rédaction de ce document (2013-09-09), pour le default/linux/amd64/13.0profil semble être juste ABI_X86=64.

Cette variable contrôle la prise en charge explicite de multilib dans les ebuilds qui utilisent multilib-build.eclassune méthode plus gentoo-like de faire multilib que la méthode originale.

La méthode d'origine selon laquelle les bibliothèques 32 bits seraient installées dans Gentoo est via les instantanés binaires nommés app-emulation/emul-linux-*. Chacun de ces paquets binaires d'émulation contient un ensemble complet de bibliothèques 32 bits compilées par un développeur Gentoo pour vous. Étant donné que chacun installe un ensemble de bibliothèques qui doivent être coordonnées ensemble, le suivi des dépendances des ebuilds 32 bits uniquement est plus difficile. Par exemple, si vous avez besoin d'un 32 bits media-libs/alsa-libsur un système 32 bits, vous venez d'installer media-libs/alsa-lib, mais sur un système multilib 64 bits, vous devez découvrir qui app-emulation/emul-linux-soundlibsinstalle, entre autres bibliothèques, la version 32 bits de media-libs/alsa-lib. De plus, le développeur Gentoo qui construit un de ces packages binaires doit faire le travail pour déterminer les bizarreries multilib et buildsystem de chaquedes bibliothèques incluses dans le package d'instantanés, ce qui rend la maintenance plus difficile. Et, plus important encore, fournir des packages binaires comme seule option officielle pour utiliser multilib dans Gentoo va à l'encontre de l'esprit de Gentoo. Vous devriez avoir le droit de tout compiler vous-même!

Il multilib-build.eclasss'éloigne de ce comportement en aidant les ebuilds individuels à installer les versions 32 bits et 64 bits. Cela devrait permettre, par exemple, wined'avoir uniquement besoin de spécifier les dépendances directement par rapport aux packages dont il a besoin au lieu d'avoir à extraire les app-emulation/emul-linux-*packages. Comme le mentionne ssuominen dans le fil de discussion auquel vous avez fait référence :

= app-emulation / emul-linux-x86-xlibs-20130224-r1 qui est un paquet vide qui n'a pas de fichiers car les fichiers proviennent maintenant directement des x11-libs /

(Notez qu'il -r1a depuis été renommé -r2) Finalement, app-emulation/emul-linux-x86-xlibslui - même devrait pouvoir être supprimé car les packages 32 bits uniquement dépendent directement des packages corrects dans la mesure x11-libsoù, avec multilib-build.eclassl'aide de, fournissent les bibliothèques 32 bits nécessaires. C'est là ABI_X86qu'entre en jeu. Tout multilib-build.eclasspackage activé gagne au moins les nouveaux drapeaux USE abi_x86_32et abi_x86_64et probablement abi_x86_x32. En utilisant les EAPI=2dépendances -style USE , les packages peuvent dépendre des versions 32 bits d'autres packages. Si x11-libs/libX11est émergé alors ABI_X86="32 64", il doit être installé avec l'ensemble USE-flags abi_x86_32et abi_x86_64USE-flags. Si un package graphique particulier a besoin d'une version 32 bits de libX11, il peut spécifierx11-libs/libX11[abi_x86_32]dans ses dépendances. De cette façon, si vous essayez d'émerger ce package graphique et que vous n'avez libX11pas installé de bibliothèques 32 bits, portage refusera. multilib-build.eclassest également universel et est compatible avec les systèmes 32 bits: l'installation de ce même package graphique sur un système 32 bits fonctionnera toujours car il est impossible d'installer libX11sans que son abi_x86_32indicateur d'utilisation soit défini. Cela résout le problème de devoir dépendre de app-emulation/emul-linux-x86-xlibsquand sur un système multilib et directement x11-libs/libX11sur un système 32 bits uniquement. Nous ouvrons la voie à des dépendances inter-packages plus propres et plus sensibles sur les systèmes multilib. =app-emulation/emul-linux-x86-xlibs-20130224-r2existe en tant qu'intermédiaire qui permet à tous les anciens paquets qui dépendaient de app-emulation/emul-linux-x86-xlibsqui ne savent pas dépendre directement, par exemple x11-libs/libX11[abi_x86_32], de continuer à fonctionner.=app-emulation/emul-linux-x86-xlibs-20130224-r2s'assure que les mêmes bibliothèques 32 bits existent /usr/lib32comme si elles =app-emulation/emul-linux-x86-xlibs-20130224avaient été installées, mais le fait de la manière Gentoo en construisant ces bibliothèques 32 bits via ses dépendances plutôt qu'en fournissant un paquet binaire. Il se comporte de la même manière que les packages de la virtualcatégorie: il n'installe rien, juste "transmet" les dépendances pour les ebuilds existants.

Nous avons vu comment multilib-build.eclassouvre la voie à des dépendances plus propres sur les systèmes multilib. Tout paquet qui a des ABI_X86options (c'est la même chose que de dire qu'il a abi_x86_*useflags) a installé une version 32 bits de lui-même si vous avez spécifié USE=abi_x86_32/ ABI_X86=32. Comment cela fonctionne-t-il (à un niveau conceptuel élevé)? Vous pouvez lire l'ebuild lui-même. Fondamentalement, l'idée est la même que les ebuilds python ou ruby ​​qui ont la possibilité de s'installer pour plusieurs versions de python et ruby ​​simultanément. Lorsqu'un ebuild hérite multilib-build.eclass, il boucle sur ABI_X86 et effectue chaque étape du processus de décompression, de compilation et d'installation pour chaque entrée dans ABI_X86. Étant donné que portage passe par toutes les phases de ebuild comme src_unpack(), src_compile()et src_install()(et d'autres) dans l'ordre et une seule fois,multilib-build.eclass(actuellement, avec l'aide de multibuild.eclass) uses crée un répertoire pour chaque valeur différente de ABI_X86. Il décompressera une copie des sources dans chacun de ces répertoires. À partir de là, chacun de ces répertoires commence à diverger car chacun cible un ABI particulier. Le répertoire pour ABI_X86=32aura ./configure --libdir=/usr/lib32fonctionné avec FLAGS ciblant 32 bits (par exemple, CFLAGS=-m32provient de l'envvar CFLAGS_x86 du profil multilib (remarque: les profils de portage se réfèrent principalement à ABI_X86 = 32 comme ABI = x86 et ABI_X86 = 64 comme ABI = amd64)). Pendant lesrc_install()phase, tous les différents ABI compilés sont installés les uns sur les autres de sorte que lorsque tous les fichiers ont à la fois des versions 32 bits et 64 bits, l'ABI natif gagne (par exemple, un ebuild installant les deux bibliothèques et un exécutable dans PATH n'installerait qu'un 64 -bit exécutable dans PATH mais inclut les bibliothèques 32 bits et 64 bits). Pour résumer: lorsque vous définissez ABI_X86="32 64"dans make.conf, tous les paquets qui supports multilib-build.eclassprendra le montant à peu près deux fois plus de travail (je ne dis pas le temps ;-)) pour compiler car il est construit une fois pour chaque ABI et les résultats dans les bibliothèques 32 bits dans /usr/lib32.

Je ne sais pas s'il existe encore une documentation officielle ABI_X86ou son statut détaillé. Les ebuilds utilisant multilib-build.eclasssemblent pour la plupart instables pour le moment. Vous pouvez suivre les instructions sur le blog auquel vous avez lié pour commencer à expérimenter et à tester ABI_X86si vous comprenez la distinction entre app-emulation/emul-linux-x86-xlibs-20130224le multilib et le nouveau style app-emulation/emul-linux-x86-xlibs-20130224-r2. Mais, si vous êtes d'accord avec le paquet binaire à l'ancienne, je pense que cela app-emulation/emul-linux-x86-xlibs-20130224devrait rester fonctionnel. Vous n'auriez besoin de passer à que -r2si vous utilisez un package qui dépend directement du abi_x86_32drapeau d' utilisation d'un autre package (par exemple, app-emulation/emul-linux-x86-xlibs-20130224et x1-libs/libX11[abi_x86_32]ne peut pas coexister car ils installent probablement tous les deux la même bibliothèque /usr/lib32, à savoir /usr/lib32/libX11.so.6). Un rapideregarder wine-1.7.0.ebuildme suggère qu'il n'a pas besoin -r2.


2
Je sais que c'est 3 mois plus tard, mais je tiens à vous remercier pour cette merveilleuse réponse. Avoir un mélange de packages "amd64" et "~ amd64" signifiait que certains dépendaient app-emulation/emul-linux-x86et d'autres dépendaient de leurs homologues directs . Il a fallu beaucoup de mots clés et de changements de drapeau UTILISATION, mais j'ai tout compilé et exécuté avec bonheur ensemble! :-D
Rocket Hazmat

2

Il existe également un indicateur d'utilisation abi_x86_x32 (ce n'est pas la même chose qu'abi_x86_32). Celui-ci est expérimental et destiné à construire des applications semi-64 bits. La seule différence est qu'ils ont des pointeurs de 4 octets. Cela limite l'utilisation de la mémoire à 4 Go et réduit les frais généraux dans la plupart des cas, tout en permettant d'utiliser toutes les instructions 64 bits.


J'ai cherché ça. Avez-vous un lien vers la documentation sur le drapeau x32?
ikrabbe

0

Actuellement, la situation est un véritable enfer. Le problème semble être que de nombreux packages sont en quelque sorte "à demi masqués" ... Je ne connais pas la terminologie exacte, mais il semble que certains packages soient mot-clés "~ amd64" avec "abi_x86_32" use flag et "amd64" sans qui utilisent le drapeau ... Le résultat est, lors de ma mise à jour, j'active "abi_x86_32" mais emerge installe toujours des packages avec ABI_X86 = "(64) (-32)" sauf si j'ajoute "~ amd64" pour chacun de ces packages. Et si elle est extraite comme une dépendance au lieu d'émerger directement, il n'y a pas d'offre pour écrire automatiquement ce changement - emerge vous indique simplement qu'il ne peut pas satisfaire la dépendance pour ce paquet avec l'indicateur d'utilisation "abi_x86_32" nécessaire. Je dois donc ajouter chaque paquet un par un à package.keywords avec "~ amd64". Ça fait beaucoup de travail manuel ... Et pour quelle version de package dois-je le faire? Je ne peux pas lui dire ce que je veux réellement, à savoir "pour les versions où il est marqué" amd64 "sans cet indicateur d'utilisation". Je peux soit mettre la dernière version spécifique que je vois maintenant et ainsi compliquer ses futures mises à jour, soit mettre toutes les versions et éventuellement installer des versions qui ne sont pas marquées stables même pour 64 bits ...


2
Je pense que votre réponse pourrait bénéficier d'une réécriture et / ou d'une refonte. En l'état, il n'ajoute rien aux réponses déjà publiées.
Sami Laine

En ce qui concerne « Je peux soit mettre la dernière version spécifique que je vois et donc compliquer ses mises à jour futures, ou mettre dans toutes les versions et peut - être installer des versions qui ne sont pas stables marqué même pour 64bit .. », si vous venez de mettre my-category/packageen package.keywords, Portage interpréter automatiquement cela comme acceptant tout ~amd64(en supposant le vôtre ARCH=amd64). Vous obtenez seulement le comportement que vous décrivez (versions correspondant sans un ~amd64drapeau) si vous dites quelque chose comme my-category/package **.
binki

Sami, cela aurait été un commentaire et non une réponse, si seulement la politique d'échange de pile avait du sens. (Franky, je suis surpris que cela me permette de commenter cette fois-ci ...)
user73010

binki, relu ... Je ne veux pas de toutes les versions ~ amd64. Je veux ces versions qui seraient "amd64" (stables) si elles étaient sans drapeau d'utilisation "abi_x86_32".
user73010

-1

Informations indirectement liées: À partir d'aujourd'hui, le système de bureau complet de KDE sur systemd peut être compilé de manière multilib pure (pas de paquets d'émulation). Le seul problème est désormais le paquetage nvidia-drivers propriétaire, mais cela peut être résolu en optant pour celui open-source pour l'instant.

Comment démarrer (d'autres liens y sont inclus): https://forums.gentoo.org/viewtopic-t-985380-highlight-.html

Statut du portage de Gentoo Multilib https://wiki.gentoo.org/wiki/Multilib_porting_status


Ceci est juste un commentaire, pas de réponse.
Jonas Stein

Jonas, ce n'est pas un problème avec la réponse, mais la question si vous l'obtenez :-), c'est si général, que la taille du contenu de la réponse explicite n'est pas du point de vue simplement mis ici, donc je préfère fournir des liens pour aller et étudier ... êtes-vous d'accord? Donc je dis que ce n'est pas le bon endroit pour poser ici ce genre de question, mais allez sur le forum gentoo .... est-ce logique?
kensai
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.