Alternatives

Les alternatives permettent l’installation simultanée de plusieurs paquets fournissant les mêmes fonctionnalités en maintenant des ensembles de liens symboliques (un par paquet) pointant vers des fichiers alternativisés comme : /chemin/fichier-original -> /etc/alternatives/nompaquet-fichier-original -> /chemin/fichier-original.suffixe Pour plus d’informations, consultez la page man update-alternatives(8).

Utilisation dans Fedora

Les alternatives PEUVENT être utilisées pour permettre l’installation simultanée de logiciels lorsque :

  • le logiciel peut être utilisé comme un remplaçant direct et fonctionne de manière suffisamment similaire que les utilisateur·rices et les autres programmes n’auraient pas besoin, dans la limite du raisonnable, de connaître la variante installée actuellement ;

ET

  • la sélection du logiciel n’est effectuée qu’au niveau du système par l’administrateur·rice du système et les utilisateur·rices finales·aux n’ont pas besoin de changer de variante.

À l’inverse, les alternatives NE DOIVENT PAS être utilisées lorsque :

  • le logiciel n’est pas un remplaçant direct. Par exemple, si les arguments en ligne de commande utilisés fréquemment diffèrent entre les deux variantes, les alternatives NE DOIVENT PAS être utilisées ;

OU

  • la variante utilisée importera aux utilisateur·rices finales·aux. Si le fait de passer d’une variante à l’autre peut être bénéfique pour les utilisateur·rices non root, alors les alternatives NE DOIVENT PAS être utilisées.

Les MTA sont un bon exemple d’utilisation des alternatives. Ils fournissent tous /usr/bin/sendmail avec des arguments en ligne de commande similaires.

Quelques mauvais exemples d’utilisation des alternatives :

  • les environnements MPI où l’environnement MPI de compilation et celui d’exécution importe aux utilisateur·rices ;

  • le choix de l’éditeur lorsque l’utilisateur·rice invoque « vi », car les fonctionnalités disponibles, la compatibilité avec les plugins, etc. lui importe.

Lorsque l’installation simultanée est désirable mais que les alternatives ne sont pas adaptées, il peut être intéressant d’utiliser les Modules d’environnement. MPI et python-sphynx (jusqu’à Fedora 31) sont des paquets utilisant les modules d’environnement à ces fins.

Comment utiliser les alternatives

Si un paquet utilise les alternatives, les fichiers qui entreraient en conflit DOIVENT être installés avec un suffixe approprié (par exemple : %{_bindir}/sendmail.postfix au lieu de %{_bindir}/sendmail), touch DOIT être utilisé sur les emplacements originaux (par exemple : touch %{_bindir}/sendmail), les liens mis en place par les alternatives DOIVENT être listés en tant que %ghost dans la liste de fichiers et les Requires: appropriés DOIVENT être ajoutés, comme dans les exemples ci-dessous.

Ajouter les fichiers alternativisés à la liste des fichiers a pour effet de garantir qu’ils appartiendront à leurs paquets respectifs. Cela permet de garantir le bon fonctionnement des commandes telles que :

  • rpm -qf /usr/bin/foo

  • dnf install /usr/bin/foo

  • repoquery --whatprovides /usr/bin/foo

Utiliser %ghost à ces fins permet l’utilisation des globs et des listes de fichiers générées.

Exemples

Exemple provenant de antlr.spec :

Requires(post): %{_bindir}/update-alternatives
Requires(postun): %{_bindir}/update-alternatives
...
%install
...
touch %{buildroot}%{_bindir}/antlr

%post
update-alternatives --install %{_bindir}/antlr \
  %{name} %{_bindir}/antlr-java 10

%postun
if [ $1 -eq 0 ] ; then
  update-alternatives --remove %{name} %{_bindir}/antlr-java
fi
...
%files
...
%ghost %{_bindir}/antlr
%{_bindir}/antlr-java

Et un exemple plus complexe d’invocation d’alternatives provenant de sendmail.spec, légèrement modifié :

Requires(post): %{_bindir}/update-alternatives
Requires(postun): %{_bindir}/update-alternatives
Requires(preun): %{_bindir}/update-alternatives
...
%install
...
# rename files for alternative usage
mv %{buildroot}%{_bindir}/sendmail %{buildroot}%{_bindir}/sendmail.sendmail
touch %{buildroot}%{_bindir}/sendmail
for i in mailq newaliases rmail; do
    mv %{buildroot}%{_bindir}/$i %{buildroot}%{_bindir}/$i.sendmail
    touch %{buildroot}%{_bindir}/$i
done
mv %{buildroot}%{_mandir}/man1/mailq.1 %{buildroot}%{_mandir}/man1/mailq.sendmail.1
touch %{buildroot}%{_mandir}/man1/mailq.1
mv %{buildroot}%{_mandir}/man1/newaliases.1 %{buildroot}%{_mandir}/man1/newaliases.sendmail.1
touch %{buildroot}%{_mandir}/man1/newaliases.1
mv %{buildroot}%{_mandir}/man5/aliases.5 %{buildroot}%{_mandir}/man5/aliases.sendmail.5
touch %{buildroot}%{_mandir}/man5/aliases.5
mv %{buildroot}%{_mandir}/man8/sendmail.8 %{buildroot}%{_mandir}/man8/sendmail.sendmail.8
touch %{buildroot}%{_mandir}/man8/sendmail.8

%postun
if [ "$1" -ge "1" ]; then
    if [ "`+readlink %{_sysconfdir}/alternatives/mta+`" == "%{_bindir}/sendmail.sendmail" ]; then
        %{_bindir}/alternatives --set mta %{_bindir}/sendmail.sendmail
    fi
fi

%post
# Set up the alternatives files for MTAs.
update-alternatives --install %{_bindir}/sendmail mta %{_bindir}/sendmail.sendmail 90 \
    --slave %{_bindir}/mailq mta-mailq %{_bindir}/mailq.sendmail \
    --slave %{_bindir}/newaliases mta-newaliases %{_bindir}/newaliases.sendmail \
    --slave %{_bindir}/rmail mta-rmail %{_bindir}/rmail.sendmail \
    --slave /usr/lib/sendmail mta-sendmail /usr/lib/sendmail.sendmail \
    --slave %{_sysconfdir}/pam.d/smtp mta-pam %{_sysconfdir}/pam.d/smtp.sendmail \
    --slave %{_mandir}/man8/sendmail.8.gz mta-sendmailman %{_mandir}/man8/sendmail.sendmail.8.gz \
    --slave %{_mandir}/man1/mailq.1.gz mta-mailqman %{_mandir}/man1/mailq.sendmail.1.gz \
    --slave %{_mandir}/man1/newaliases.1.gz mta-newaliasesman %{_mandir}/man1/newaliases.sendmail.1.gz \
    --slave %{_mandir}/man5/aliases.5.gz mta-aliasesman %{_mandir}/man5/aliases.sendmail.5.gz \
    --initscript sendmail
...

%preun
if [ $1 = 0 ]; then
    update-alternatives --remove mta %{_bindir}/sendmail.sendmail
fi
...

%files
...
%ghost %{_bindir}/sendmail
%ghost %{_bindir}/mailq
%ghost %{_bindir}/newaliases
%ghost %{_bindir}/rmail
%ghost /usr/lib/sendmail
%ghost %{_sysconfdir}/pam.d/smtp
%ghost %{_mandir}/man8/sendmail.8.gz
%ghost %{_mandir}/man1/mailq.1.gz
%ghost %{_mandir}/man1/newaliases.1.gz
%ghost %{_mandir}/man5/aliases.5.gz

%{_bindir}/sendmail.sendmail
%{_bindir}/mailq.sendmail
%{_bindir}/newaliases.sendmail
%{_bindir}/rmail.sendmail
/usr/lib/sendmail.sendmail
%config(noreplace) %{_sysconfdir}/pam.d/smtp.sendmail
%{_mandir}/man8/sendmail.sendmail.8.gz
%{_mandir}/man1/mailq.sendmail.1.gz
%{_mandir}/man1/newaliases.sendmail.1.gz
%{_mandir}/man5/aliases.sendmail.5.gz

%attr(0755,root,root) %{_initrddir}/sendmail