Table of Contents

Ajouter la Capacité Multilib à Slackware pour l'Architecture x86_64

transcription de la version française initiale écrite par <Patrick FONIO et Sébastien BALLET>

Cet article, qui est la traduction du travail réalisé par Alien BOB, contient les instructions nécessaires pour créer une vraie Slackware64 multilib.
Un système Linux multilib 64-bits peut faire tourner des applications 64-bits ainsi que celles encore fournies en 32-bits.

Le Filesystem Hierarchy Standard indiquant comment séparer clairement les programmes 64-bits et 32-bits sur un même système, avec la Slackware64 nous avons choisi d'adopter ce standard x86_64. Elle est donc prête pour utiliser les bibliothèques 64-bits dans les répertoires /lib64 et /usr/lib64. C'est pourquoi je la nomme Slackware64 'multilib-ready' (même si les bibliothèques 32-bits se trouvent dans /lib et /usr/lib, Slackware64 ne contient aucun programme 32-bits).
Il y a toutefois une étape supplémentaire à franchir (par vous, l'utilisateur) pour que Slackware64 puisse être dénommée 'multilib-capable'.
On procède de la façon suivante .

  1. Tout d'abord, nous avons besoin de :
    *glibc (c'est-à-dire : une glibc capable d'exécuter des binaires 32-bits et 64-bits)
    *gcc (c'est-à-dire : un gcc capable de générer des binaires 32-bits et 64-bits)
  2. Ensuite, on récupère les bibliothèques de la Slackware 32-bits qu'on installe dans la Slackware64 à côté de leurs versions 64-bits, ce qui constitue la couche de compatibilité 32-bits.

Dès sa sortie, Slackware64 avait un avantage par rapport aux 'forks' 64-bits qui existaient par ailleurs. Ces 'forks' ajoutaient une couche de compatibilité 32-bits en recompilant bon nombre de paquets en binaires 32-bits. Slackware64 est une distribution constituée des versions 32-bits et 64-bits développées parallèlement. Ce qui signifie que vous n'avez pas à compiler des paquets 32-bits, vous avez juste à prendre les paquets 32-bits depuis l'arborescence Slackware-32. Voilà pourquoi nous n'avons pas ajouté un système multilib complet, les conditions sont en place mais demandent à l'utilisateur de faire le nécessaire s'il veut le multilib.
Dans un prochain chapitre, j'expliquerai comment vous pouvez, à partir d'un paquet Slackware-32 (par exemple le paquet 'mesa') le réempaqueter en un paquet 'mesa-compat32' et l'installer tel quel sur la Slackware64.

Slackware pour les architectures x86_64 (ou “Slackware64” en abrégé) est un système 64-bits « pur », mais qu'il est facile de faire évoluer en un système multilib. Telle quelle, Slackware64 ne peut compiler et faire tourner que les binaires 64-bits.

Avantages d'un système multilib

Voici quelques exemples de programmes pour lesquels il faut un support multilib sur la Slackware64 car ils ne pourraient pas démarrer ni être être compilés sans la couche de compatibilité 32-bits :

Heureusement, les développements 64-bits deviennent de plus en plus courants. Adobe a longtemps posé problème mais ils ont finalement livré une version 64-bits de leur plugin Flash. De même Sun (société maintenant intégrée au groupe Oracle) a publié une version 64-bits de leur plugin Java pour navigateur. Ces deux événements nous ont fortement incités à nous mettre au travail sur la Slackware64.


Se procurer les paquets multilib

Vous pouvez télécharger un jeu complet de paquets et de scripts multilib depuis le site: http://slackware.com/~alien/multilib/

En plus de nombreux fichiers README (cet article de Wiki est fondamentalement une version augmentée de l'un de ces READMEs) vous trouverez un sous-répertoire pour chaque version de Slackware64 sous le chapitre « multilib ». Vous trouverez un autre répertoire nommé « source ». Celui-ci contient les sources (!!) et des scripts Slackbuilds.
Ce qui vous concerne vraiment -les paquets binaires- se trouve dans le répertoire « slackware_n° de version » en dessous du répertoire principal. Chacun de ces répertoires contient aussi un sous-répertoire « slackware64-compat32 » où vous trouverez un ensemble de base de paquets Slackware 32-bits prêts à être installés sur votre Slackware64.


Maintien de votre multilib à jour

Pour rester à jour, je vous conseille de surveiller le ChangeLog (flux RSS) que je maintiens pour mes paquets multilib. En principe je diffuserai les paquets updated glibc and gcc un jour ou deux après la mise à jour de gcc et glibc par Slackware.

Automatisation:

  1. Consultez compat32pkg de Sébastien Ballet, qui automatise ces opérations, comme le fait slackpkg.
  2. Si vous préférez slackpkg pour la gestion des paquets, alors cela vaut la peine de se pencher sur slackpkg+, une extension à slackpkg qui gère les paquets que vous avez installés depuis des dépôts tiers - y compris multilib. Quand slackpkg+ est correctement configuré, la maintenance de votre multilib se fait tout simplement ainsi:
    # slackpkg update
    # slackpkg upgrade multilib
    # slackpkg install multilib

    Cette dernière commande vous montrera si des paquets ont été ajoutés à la collection de ceux qui sont regroupés dans “compat32”, comme llvm-compat32 et orc-compat32 récemment.

    • Voici comment se présente une configuration typique - pour un ordinateur sur lequel tourne Slackware-current pointant vers le dépôt 'KDE testing' d'Alien BOB. L'option PKGS_PRIORITY garantit que les paquets multilib de gcc et glibc ont la priorité sur les originaux Slackware. Le mot-clé “multilib” qui désigne le dépôt doit être le même mot que celui employé dans les commandes “slackpkg” ci-dessus. Le choix du mot “multilib” est arbitraire, il aurait tout aussi bien pu être “compat32”, du moment que vous l'utilisez de façon cohérente.
      Voici ce qu'il peut y avoir dans un fichier exemple de “/etc/slackpkg/slackpkgplus.conf”:
      SLACKPKGPLUS=on
      VERBOSE=1
      ALLOW32BIT=off
      USEBL=1
      WGETOPTS="--timeout=5 --tries=1"
      GREYLIST=on
      PKGS_PRIORITY=( multilib restricted alienbob ktown )
      REPOPLUS=( slackpkgplus multilib restricted alienbob ktown )
      MIRRORPLUS['multilib']=http://bear.alienbase.nl/mirrors/people/alien/multilib/current/
      MIRRORPLUS['alienbob']=http://bear.alienbase.nl/mirrors/people/alien/sbrepos/current/x86_64/
      MIRRORPLUS['restricted']=http://bear.alienbase.nl/mirrors/people/alien/restricted_sbrepos/current/x86_64/
      MIRRORPLUS['ktown']=http://bear.alienbase.nl/mirrors/alien-kde/current/latest/x86_64/
      MIRRORPLUS['slackpkgplus']=http://slakfinder.org/slackpkg+/

Permettre le multilib sur Slackware64

Vite fait, bien fait :

Ce chapitre contient les instructions essentielles pour ajouter la possibilité du multilib à votre Slackware-64. Si vous voulez comprendre le processus plus en profondeur, ou si vous avez besoin d'infos pour compiler des programmes 32-bits dans la Slackware-64, consultez les chapitres suivants.
Notez que le “#” au début des commandes indique l' invite de root.

# SLACKVER=14.2
# mkdir multilib
# cd multilib
# lftp -c "open http://bear.alienbase.nl/mirrors/people/alien/multilib/ ; mirror -c -e ${SLACKVER}"
# cd ${SLACKVER}
Si vous utilisez un gestionnaire de paquets comme slackpkg vous devrez ajouter tous les noms de paquets concernantglibc et gcc à sa liste noire de paquets. Si vous ne preniez pas cette précaution, vous risqueriez de voir votre gestionnaire de paquets remplacer par accident vos versions multilib par les versions d'origine Slackware en 'pur' 64-bits!
Si vous utilisez Slackware 13.37 ou plus récente, alors slackpkg interprète bien les expressions régulières dans le fichier de la liste noire. Dans ce cas, une seule ligne suffit dans /etc/slackpkg/blacklist pour faire exclure tous mes paquets par la liste noire (y compris les paquets multilib gcc et glibc et tous les paquets compat32:
[0-9]+alien
[0-9]+compat32

Par contre, si vous employez l'extension de slackpkg nommée slackpkg+ alors vous ne devez surtout pas mettre en liste noire ces paquets, parce que cela empêcherait slackpkg+ de les gérer!

Si vous travaillez avec Slackware 13.1 ou plus récente, et si vous disposez du paquet compat32-tools pour cette édition, le script massconvert32.sh peut utiliser un serveur distant pour télécharger les paquets Slackware 32-bits, au lieu de nécessiter un serveur Slackware local ou un DVD. Employez le paramètre “-u” pour indiquer l'URL distante comme ceci:
# massconvert32.sh -u http://unserveur.org/chemin/vers/slackware-14.2/slackware

Instructions détaillées

Mise à niveau de glibc et gcc

Les paquets suivants remplacent (ne s'ajoutent pas aux…) les paquets standard de votre Slackware. Utilisez le programme 'upgradepkg' pour mettre à niveau vers la version multilib de gcc et glibc dont vous aurez besoin pour construire (gcc) et lancer (glibc), les programmes 32-bits utilisables sur votre ordinateur 64-bits avec Slackware64.

Slackware64 13.0

Slackware64 13.1

Slackware64 13.37

Slackware64 14.0

Slackware64 14.1

Slackware64 14.2

Slackware64 current

Depuis le passage à gcc 7, il n'y a plus de paquet gcc-java parce qu'il n'est plus développé.
Le paquet glibc-zoneinfo n'est pas un élément de multilib, puisqu'il ne contient pas de code. Il vous faut installer le paquet glibc-zoneinfo de la Slackware de base.

Pour toutes éditions de Slackware

Il y a un paquet supplémentaire que vous installerez en utilisant le programme “installpkg”. Le n° de version précis peut varier suivant l'édition de Slackware, mais on peut trouver le paquet dans le répertoire où se trouvent également les versions multilib de gcc et glibc:

Ajout des bibliothèques Slackware 32-bits

La mise à niveau de glibc et gcc telle que décrite précédemment fait passer votre système de «multilib-ready» à «multilib-enabled». Tout ce que vous devez faire maintenant c'est installer les bibliothèques Slackware 32-bits afin que les programmes 32-bits que vous installerez ou compilerez trouvent les bibliothèques dont ils ont besoin. Mais il ne suffit pas de prendre les paquets 32-bits et les installer tels quels dans la Slackware64 pour au moins 2 raisons:

Il faudra encore veiller à ce que les fichiers inutiles/proscrits des paquets 32-bits que vous installez soient retirés. Ce qu'il vous faut, c'est un paquet 32-bits qui n'entre pas en conflit avec quoi que ce soit déjà présent dans votre Slackware 64-bits. D'où le nom “paquet de compatibilité 32-bits”.

J'ai estimé que ce serait un gaspillage de bande passante si je créais moi-même les versions de compatibilité 32-bits des paquets Slackware. Après tout, vous avez probablement acheté le DVD Slackware 14.x et vous avez donc les deux versions de Slackware en 64-bits et 32-bits… ou bien l'arborescence 32-bits de Slackware est disponible en téléchargement libre, bien sûr ;-)

Au lieu de celà, j'ai écrit quelques scripts (certaines parties de ces scripts sont l’œuvre de Fred Emmott du célèbre projet Slamd64) et je les ai regroupés en un paquet“compat32-tools”. Ces scripts vous permettront d'utiliser le contenu de tout paquet 32-bits Slackware pour créer un nouveau paquet que vous pourrez installer en toute sécurité dans votre Slackware 64-bits.

Ce paquet “compat32-tools” a besoin de quelques explications.
Je vous invite à lire le 'README' détaillé, du répertoire /usr/doc/compat32-tools-*/, il vous apportera une aide précieuse. Voici les trois scripts que le paquet installe:

En installant les paquets compat32 vous remarquerez que quelques uns vont indiquer des erreurs dues à certains fichiers manquants dans /etc. C'est “pensé à la conception”, et on peut ignorer ces erreurs. Ces messages apparaissent parce que dans /etc des fichiers sont retirés d'un paquet “-compat32” pendant la conversion (sauf pour pango et gtk+2). Je considère que les fichiers dans /etc auront déjà été installés par les paquets 64-bits d'origine.
Un exemple de ces “erreurs” pour le paquet cups-compat32:
Executing install script for cups-compat32-1.3.11-x86_64-1.txz.
install/doinst.sh: line 5: [: too many arguments
cat: etc/cups/interfaces: Is a directory
cat: etc/cups/ppd: Is a directory
cat: etc/cups/ssl: Is a directory
cat: etc/cups/*.new: No such file or directory
cat: etc/dbus-1/system.d/cups.conf.new: No such file or directory
chmod: cannot access `etc/rc.d/rc.cups.new': No such file or directory
cat: etc/rc.d/rc.cups.new: No such file or directory
Package cups-compat32-1.3.11-x86_64-1.txz installed.
Si vous envisagiez d'utiliser le script convertpkg-compat32 pour convertir un paquet non-Slackware en un paquet -compat32, je dois fermement vous mettre en garde contre cette idée. Le script est écrit dans le seul but d'obtenir les versions 32-bits des binaires/bibliothèques Slackware64 disponibles dans une configuration multilib. De ce fait, le script va enlever plusieurs éléments qui font partie du paquet 32-bits original - éléments que l'on considère présents car installés par la version 64-bits du paquet.
Dans presque tous les cas où, après téléchargement d'un paquet non-Slackware 32-bits dans la Slackware64, le mieux est d'en trouver les sources pour construire une version 64-bits de ce paquet. Une autre solution est d'installer le paquet original 32-bits, au lieu d'essayer de “le convertir”, puis de l'activer à partir de la ligne de commande pour trouver les bibliothèques manquantes 32-bits qu'il vous faut encore extraire d'un paquet Slackware officiel.

Utiliser les programmes 32-bits

Une fois que votre système a été préparé comme indiqué ci-dessus, il est très facile de faire tourner un logiciel compilé pour architecture 32-bits. Il suffit de le télécharger, l'installer et le lancer!

Parfois, vous rencontrerez peut-être un programme nécessitant une bibliothèque Slackware 32-bits particulière de laquelle vous ne disposez pas à ce moment. Dans ce cas, trouvez dans quel paquet Slackware 32-bits il y a cette bibliothèque manquante. Utilisez le script “convertpkg-compat32” pour convertir ce paquet Slackware pour architecture 32-bits et installez le paquet résultant 32-bits doté de la “compatibilité” dans Slackware64.

Compiler des programmes 32-bits

Si vous devez compiler un programme 32-bits (wine et grub sont deux exemples de programmes open source livrés uniquement en version 32-bits) configurez d'abord l'environnement de votre shell pour root en lançant la commande:

# . /etc/profile.d/32dev.sh

Remarquez le point en début de ligne - il fait vraiment partie de la commande! L'emploi du point équivaut à la commande 'source'.
L'action de cette commande est de changer ou créer plusieurs variables d'environnement. Ce qui a pour effet de donner la priorité aux versions binaires 32-bits sur les binaires 64-bits quand vous compilez du code source - vous effectuerez ainsi une compilation 32-bits. L’effet de cette commande cessera au moment de votre déconnexion du shell 'root' -du super utilisateur-. Dans cet environnement modifié, vous pouvez employer les SlackBuilds standard pour construire des paquets 32-bits pour Slackware64. Il y a deux choses à ne pas perdre de vue:

  1. Vous devez renseigner la variable ARCH avec 'i486' parce que même sur votre ordinateur 'x86_64' vous êtes en train de compiler un programme pour architecture 32-bits!
    C'est à cause du triplet “$ARCH-slackware-linux” qui normalement est employé dans la commande “configure”.
    1. Il y a une exception pour la compilation du paquet “wine” pour lequel il faut 'ARCH=x86_64' parce que vous installerez ce paquet directement dans votre ordinateur multilib sans le convertir en un paquet 'compat32'.
  2. L'installation de paquets 32-bits que vous avez compilés comme vu au 1., sera possible sur votre Slackware64-multilib à condition de les convertir en paquets 'compat32':
    # convertpkg-compat32 -i /path/to/your/fresh/foo-VERSION-i486-BUILD.tgz
    # upgradepkg --install-new /tmp/foo-compat32-VERSION-x86_64-BUILDcompat32.txz

Mises en garde

Paquets convertis par massconvert32.sh

Voici la liste des paquets convertis en leur version “-compat32” par le script massconvert32.sh. Notez que plusieurs de ces paquets n'appartiennent pas à Slackware 13.0 ou 13.1, ils ont été ajoutés dans une version ultérieure de Slackware ce qui fait qu'ils provoquent un message d'erreur “* FAIL: package 'package_name' was not found!*” quand vous lancez le script dans une version plus ancienne. La situation complémentaire se manifeste également - certains paquets ont été retirés des versions plus récentes de Slackware, ce qui déclenche le message “* FAIL: package 'package_name' was not found!*”. Ne vous inquiétez pas pour ça.

# Les ensembles A/ :
 
aaa_elflibs
attr
bzip2
cups
cxxlibs
dbus
e2fsprogs
eudev
libgudev
openssl-solibs
udev
util-linux
xz
 
# Les ensembles AP/ :
 
cups
cups-filters
flac
mariadb
mpg123
mysql
sqlite
 
# Les ensembles D/ :
 
libtool
llvm
opencl-headers
 
# Les ensembles L/ :
 
SDL2
alsa-lib
alsa-oss
alsa-plugins
atk
audiofile
cairo
dbus-glib
elfutils
esound
expat
ffmpeg
fftw
freetype
fribidi
gamin
gc
gdk-pixbuf2
giflib
glib2
gmp
gnome-keyring
gtk+2
gst-plugins-base
gst-plugins-base0
gst-plugins-good
gst-plugins-good0
gst-plugins-libav
gstreamer
gstreamer0
hal
harfbuzz
icu4c
jasper
json-c
lame
lcms
lcms2
libaio
libart_lgpl
libasyncns
libclc
libedit
libelf
libexif
libffi
libglade
libgphoto2
libidn
libieee1284
libjpeg
libjpeg-turbo
libmng
libmpc
libnl3
libnotify
libogg
libpcap
libpng
libsamplerate
libsndfile
libtasn1
libtermcap
libtiff
libunistring
libusb
libvorbis
libxml2
libxslt
lzo
ncurses
ocl-icd
openjpeg
orc
pango
popt
pulseaudio
python-six
qt
readline
sbc
sdl
seamonkey-solibs
speexdsp
startup-notification
svgalib
v4l-utils
zlib
 
# Les ensembles N/ :
 
curl
cyrus-sasl
gnutls
libgcrypt
libgpg-error
libtirpc
nettle
openldap-client
openssl
p11-kit
samba
 
# Les ensembles X/ :
 
fontconfig
freeglut
glew
glu
libFS
libICE
libSM
libX11
libXScrnSaver
libXTrap
libXau
libXaw
libXcomposite
libXcursor
libXdamage
libXdmcp
libXevie
libXext
libXfixes
libXfont
libXfont2
libXfontcache
libXft
libXi
libXinerama
libXmu
libXp
libXpm
libXprintUtil
libXrandr
libXrender
libXres
libXt
libXtst
libXv
libXvMC
libXxf86dga
libXxf86misc
libXxf86vm
libdmx
libdrm
libepoxy
libfontenc
libinput
libfontenc
libpciaccess
libva
libva-intel-driver
libvdpau
libxcb
libxshmfence
mesa
pixman
vulkan-sdk
xcb-util
 
# Les ensembles XAP/ :
 
sane

Miroirs de téléchargement du système multilib

Vous pouvez télécharger les paquets multilib depuis (au moins) ces adresses:

Outils compatibles venant d'autres contributeurs

Traductions

Remerciements

Régalez vous!

Eric

Sources