GNU/Linux >> Tutoriels Linux >  >> Linux

Plus de conseils pour empaqueter votre logiciel Linux avec RPM

Si vous utilisez Red Hat Enterprise Linux (RHEL) ou Fedora, vous vous retrouverez bientôt à utiliser dnf (ou miam ) pour installer des packages logiciels. Red Hat Package Manager (RPM) est l'outil de gestion de logiciels le plus important sur ces distributions Linux. Cet article montre comment vous pouvez tirer parti de ce framework pour distribuer vos propres applications.

J'espère que vous avez eu la chance de lire l'article de Valentin Bajrami sur le même sujet. Je vais répéter certains des mêmes concepts ici et illustrer quelques problèmes que vous pourriez rencontrer en cours de route. Je vais également utiliser deux exemples plus complexes et identifier quelques problèmes que vous pouvez rencontrer lors de l'empaquetage d'applications natives.

Cet article vous montre comment déterminer comment compiler et empaqueter votre propre application native pour la distribution. Dans un article de suivi, j'expliquerai comment empaqueter des applications tierces qui n'ont pas de package RPM, ou si elles en ont, vous souhaitez le personnaliser.

Les prérequis incluent :

  • Vous avez des connaissances de base sur l'utilisation de RPM pour interroger des packages et installer ou supprimer des packages. Si ce n'est pas le cas, familiarisez-vous d'abord avec ces concepts, puis revenez ici pour vous amuser.
  • Make, Git, GCC et Java sont installés, car vous en aurez besoin pour effectuer les exercices inclus ici. Ce n'est pas obligatoire, mais ce serait bien si vous vous entraîniez pendant que j'avance.

Pour installer Make, GCC, Java 11 et Git à l'aide du gestionnaire de packages DNF, exécutez :

$ sudo dnf install \make gcc-10 java-11-openjdk-headless git 

Empaquetez votre propre logiciel à l'aide de RPM

Cet article utilise un petit projet open source appelé jdumpertools pour cette étape.

Sur votre terminal Linux, clonez jdumpertools puis compilez-le (vous avez installé Make et le compilateur GCC, n'est-ce pas ?) :

$ git clone [email protected]:josevnz/jdumpertools.git$ cd jdumpertools$ make all$ ls -l jdu jutmp *.so-rwxrwxr-x 1 josevnz josevnz 32728 Oct  3 16:40 jdu- rwxrwxr-x 1 josevnz josevnz 32752 3 octobre 16:40 jutmp-rwxrwxr-x 1 josevnz josevnz 29024 3 octobre 16:40 libjdumpertools.so 

Ensuite, vous pouvez exécuter n'importe lequel des programmes générés. Par exemple, essayez jdu (une version simplifiée du du commande qui imprime les résultats au format JSON) :

$ LD_LIBRARY_PATH=$PWD $PWD/jdu /[{"partition":"/", "free_space":462140129280.000000, "total_space":510405902336.000000}] 

Jusqu'ici, tout va bien.

Le fichier jdumpertools.spec de ce répertoire est le fichier de spécification RPM qui contrôle la façon de compiler et de conditionner jdumpertools en utilisant RPM.

Ensuite, installez quelques outils de support avant de passer à la création du fichier RPM.

Installer les blocs de construction RPM

Obtenez les rpmdevtools nécessaires utilitaires en exécutant :

$ sudo dnf install rpm-build rpmdevtools 

Préparez ensuite le bac à sable pour créer des RPM à l'aide de rpmdevtools . N'utilisez jamais root pour cette étape mais plutôt votre compte Linux personnel ou développeur (il passera le -d drapeau de débogage):

$ rpmdev-setuptree -djosevnz       /home/josevnz    /home/josevnz/.rpmmacros/home/josevnz/rpmbuild/RPMS    /home/josevnz/rpmbuild/SOURCES     /home/josevnz/rpmbuild/SPECS/home/ josevnz/rpmbuild/SRPMS   /home/josevnz/rpmbuild/BUILD 

Voici une vue plus agréable :

$ tree ~/rpmbuild/home/josevnz/rpmbuild├── BUILD├── RPMS├── SOURCES├── SPECS└── Répertoires SRPMS5, 0 fichiers 

Pour le moment, vous devez faire attention à seulement deux répertoires :SOURCES et SPECS . J'expliquerai les autres plus tard.

Il y a aussi un nouveau fichier appelé ~/.rpmmacros . Vous pouvez y placer ou remplacer certaines macros spéciales pour éviter les tâches répétitives lors de la création de packages RPM. Ce fichier est important car il ancre le rpmbuild environnement avec votre répertoire personnel.

Packagez votre application

Tout d'abord, créez un tar fichier du code source dans le ~/rpmbuild/SOURCES répertoire :

VERSION=v0.1NAME=jdumpertoolsTARFILE=$(NAME)-$(VERSION).tar.gz/usr/bin/tar --exclude-vcs --directory ../ --create --verbose --gzip --file $(HOME)/rpmbuild/SOURCES/$(TARFILE) $(NAME) 

Normalement le tar Le fichier contient des scripts et du code source que vous compilerez dans le cadre du processus d'empaquetage.

Ensuite, créez un RPM spécification dossier. Encore une fois, rpmdevtools fournit une longueur d'avance, comme ceci :

$ rpmdev-newspec ~/rpmbuild/jose-package.spec/home/josevnz/rpmbuild/jose-package.spec créé ; Type Minimal, RPM Version> =4.16. $ Cat ~ / RPMBUILD / JOSE-PACKAGE.Specname:Jose-PackageVersion:Release:1% {? Dist} Résumé:Licence:URL:Source0:BuildRequires:Exige:% Description% Prep% autosetup%build%configure%make_build%installrm -rf $RPM_BUILD_ROOT%make_install%files%license add-license-file-here%doc add-docs-here%changelog* Sun Oct 03 2021 Jose Vicente Nunez  

Ne vous inquiétez pas si vous n'arrivez pas à donner un sens à ce fichier maintenant. Copiez le jdumpertools.spec dans le fichier ~/rpmbuild/SPECS répertoire :

$ cp -pv jdumpertools.spec ~/rpmbuild/SPECS 

Et créez une source et un fichier RPM binaire :

$ rpmbuild -ba rpmbuild/SPECS/jdumpertools.specsetting SOURCE_DATE_EPOCH=1609718400Exécution(%prep) :/bin/sh -e /var/tmp/rpm-tmp.kBlIwO+ umask 022+ cd /home/josevnz/ rpmbuild/BUILD+ cd /home/josevnz/rpmbuild/BUILD+ rm -rf jdumpertools+ /usr/bin/gzip -dc /home/josevnz/rpmbuild/SOURCES/jdumpertools-v0.1.tar.gz+ /usr/bin/tar -xof -+ STATUS=0+ '[' 0 -ne 0 ']'+ cd jdumpertools+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .+ RPM_EC=0[...]Vérification de fichier(s) décompressé(s) :/usr/lib/rpm/check-files /home/josevnz/rpmbuild/BUILDROOT/jdumpertools-v0.1-1.fc33.x86_64Écrit :/home/josevnz/rpmbuild/SRPMS/jdumpertools-v0. 1-1.fc33.src.rpmÉcrit :/home/josevnz/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1.fc33.x86_64.rpmExécution (%clean) :/bin/sh -e /var/tmp/ rpm-tmp.uEyCyL+ umask 022+ cd /home/josevnz/rpmbuild/BUILD+ cd jdumpertools+ rm -rf /home/josevnz/rpmbuild/BUILDROOT/jdumpertools-v0.1-1.fc33.x86_64+ RPM_EC=0++ travaux -p+ sortie 0 

Le résultat final est deux fichiers :un RPM source et un RPM binaire.

Écrit :/home/josevnz/rpmbuild/SRPMS/jdumpertools-v0.1-1.fc33.src.rpmÉcrit :/home/josevnz/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1. fc33.x86_64.rpm 

Que se passe-t-il lors d'une installation RPM

Que se passe-t-il lorsque vous installez chacun de vos RPM personnalisés ?

  1. L'installation du RPM source crée le tar fichier et la spécification fichier dans votre rpmbuild annuaire. Cela vous permet de recompiler l'application, d'apporter des correctifs au RPM spec fichier, etc.
    $ ls rpmbuild/{SPECS,SOURCES}rpmbuild/SOURCES:jdumpertools-v0.1.tar.gzrpmbuild/SPECS:jdumpertools.spec 
  2. Si vous installez le RPM binaire, vous installez en fait l'application :
    $ sudo rpm -ihv ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1.fc33.x86_64.rpmVerifying ... ################ [100 %]Préparation... ################ [100 %]Mise à jour / installation ...   1:jdumpertools-v0.1-1.fc33 ################ [100 %] 
  3.  :Apache License 2.0Signature   :(none)Source RPM  :jdumpertools-v0.1-1.fc33.src.rpmBuild Date :Sun 03 Oct 2021 06:27:11 PM EDTBuild Host  :dmaf5.homeURL         :https://github. com/josevnz/jdumpertoolsSummary     :programmes pouvant être utilisés pour vider les données d'utilisation de Linux au format JSON. Commande 'du'.* jutmp :dumper de la base de données UTMP

Remarque :Les lecteurs curieux ont probablement ouvert le Makefile et j'ai vu une cible appelée rpm :

rpm :tous    test -x /usr/bin/rpmdev-setuptree &&/usr/bin/rpmdev-setuptree|| /bin/mkdir -p -v ${HOME}/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}    /usr/bin/tar --exclude-vcs --directory ../ --create --verbose - -gzip --file $(HOME)/rpmbuild/SOURCES/$(TARFILE) $(NAME)    /usr/bin/rpmbuild -ba jdumpertools.spec 

C'est un raccourci pratique pour préparer un rpmbuild bac à sable, tar fichiers après leur compilation avec make , et empaquetez-les en utilisant le rpmbuild commande. N'hésitez pas à appeler make rpm et voyez ce qui se passe.

[ Obtenez plus de conseils en téléchargeant l'aide-mémoire pour les scripts shell bash. ]

Je vous ai montré les commandes et les outils utilisés pour générer les fichiers RPM, mais maintenant il est temps d'écrire le RPM spécification fichier.

Créer un fichier de spécification pour les outils jdumper

Travailler avec des fichiers de spécification nécessite de remplir plusieurs balises de métadonnées ainsi que de décrire comment vous allez compiler ou empaqueter l'application. Jdumpertools est une simple application ANSI C, donc décompressez les sources, compilez-les, copiez-les dans une zone intermédiaire (~/rpmbuild/BUILDROOT ), puis conditionnez-les pour la distribution.

Tout d'abord, jetez un œil au fichier de spécification RPM :

Nom :          jdumpertools# À FAIRE :Trouvez un meilleur moyen de mettre à jour la version ici et sur MakefileVersion :       v0.1        Version :       1 %{?dist}Résumé :       Programmes pouvant être utilisés pour vider les données d'utilisation de Linux dans JSON format. Licence :       Licence Apache 2.0URL :           https://github.com/josevnz/jdumpertoolsSource0 :       %{name}-%{version}.tar.gzBuildRequires : bash,tar,gzip,rpmdevtools,rpmlint,make,gcc>=10.2. 1Nécessite :      bash%global debug_package %{nil}%descriptionJdumpertools est un ensemble de programmes que vous pouvez utiliser pour vider les données d'utilisation de Linux au format JSON afin qu'elles soient ingérées par d'autres outils.* jdu :similaire à la commande UNIX 'du'.* jutmp :UTMP dumper de base de données%prep%setup -q -n jdumpertools%buildmake all%installrm -rf %{buildroot}/usr/bin/mkdir -p %{buildroot}/%{_bindir}/usr/bin/cp -v -p jdu jutmp %{buildroot}/%{_bindir}/usr/bin/mkdir -p %{buildroot}/%{_libdir}/usr/bin/cp -v -p libjdumpertools.so %{buildroot}/%{_libdir}% cleanrm -rf %{buildroot}%files%{_bindir}/jdu%{_bindir}/jutmp%{_libdir}/libjdumpertools.so%license LICENSE%doc README.md%changelog* Lundi 4 janvier 2021 Jose Vicente Nunez  - 0.1- Première version en cours de package 

Passez en revue ce qui est important ici :

  • Les métadonnées, y compris la version, le nom et Source0 ; vous pouvez utiliser des variables ou des macros
  • Décompressez les sources dans le %prep section en utilisant la %setup macro (le guide RPM contient de nombreux détails sur les drapeaux)
  • BuildRequires :Vous devez lister les dépendances dont vous avez besoin pour construire le package. Ceux-ci ne peuvent pas être détectés dynamiquement.
  • %build section :Compiler avec make
  • %installer section :Copiez ce dont vous avez besoin pour que le programme fonctionne (programme, bibliothèques, etc.)
  • %fichiers section :où vous pouvez spécifier si un fichier est un document (%doc ), fichier de licence (% licence ), ou un fichier normal

Important également :

  • J'ai désactivé la création de code de débogage lors de l'empaquetage avec %global debug_package %{nil} .
  • Le journal des modifications documente ce qui a changé avec cette nouvelle version du package.

Vérifiez les erreurs dans le fichier de spécification avec rpmlint

Vous ne voulez pas découvrir à vos dépens que votre RPM n'est pas parfait. Par conséquent, il est bon de vérifier les erreurs évidentes ou les moyens d'améliorer vos RPM :

$ sudo dnf install rpmlint 

Vérifiez maintenant le RPM spécification fichier :

$ rpmlint /home/josevnz/rpmbuild/SPECS/jdumpertools.spec /home/josevnz/rpmbuild/SPECS/jdumpertools.spec :W :URL invalide Source0 :packages jdumpertools-v0.1.tar.gz0 et 1 specfiles vérifiés ; 0 erreurs, 1 avertissements. 

La documentation rpmlint indique que Source0 doit être une URL bien définie (la valeur doit être une URL HTTP, HTTPS ou FTP publique valide). Ne vous inquiétez pas de cet avertissement.

Qu'en est-il du RPM lui-même ?

$ make rpm...$ rpmlint --info ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpmjdumpertools.x86_64:W:summary-ended-with-dot C Programmes pouvant être utilisés pour vider les données d'utilisation de Linux au format JSON.jdumpertools.x86_64 :W :orthographe-erreur %description -l en_US du -> dew, doe, Dujdumpertools.x86_64 :E :description-line-too-long C Jdumpertools est une collection de programmes qui peuvent être utilisés pour vider les données d'utilisation de Linux au format JSON, afin qu'elles puissent être ingérées par d'autres outils. fc33', 'v0.1-1']jdumpertools.x86_64 :W :licence non valide Apache License 2.0jdumpertools.x86_64 :W :binaire non dépouillé ou objet /usr/bin/jdujdumpertools.x86_64 :W :binaire non dépouillé -or-object /usr/bin/jutmpjdumpertools.x86_64 : W :unstripped-binary-or-object /usr/lib64/libjdumpertools.sojdumpertools.x86_64 : W :no-soname /usr/lib64/libjdumpertools.sojdumpertools.x86_64 : W :no-manual-page-for-binary jdujdumpertools.x86_64:W:no-manual-page-for-binary packages jutmp1 et 0 specfiles vérifiés ; 1 erreurs, 10 avertissements. 

Dix avertissements et une erreur. Certains sont faciles à corriger :

  • La licence doit être d'un format spécifique
  • Les pages de manuel sont nécessaires pour les programmes, j'en ai donc écrit une très simple avec troff
  • Inclure le soname dans la bibliothèque

Après les correctifs, il ne reste qu'un seul avertissement :

$ make rpm...$ rpmlint --info ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm jdumpertools.x86_64 :W :erreur d'orthographe %description - l en_US du -> dew, doe, DuLa valeur de cette balise semble être mal orthographiée. Veuillez revérifier. 

Cet avertissement vous avertit que le mot du semble mal orthographié. Il s'agit simplement d'une référence à une commande valide, vous pouvez donc ignorer l'avertissement.

Maintenant, mettez à niveau le RPM avec la version améliorée :

$ sudo rpm -Uhv ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm 

J'utilise le rpm commande pour rendre plus évident que j'ai mis à niveau le package à partir d'une version de disque local au lieu d'une nouvelle version à partir d'un référentiel. Si vous préférez, vous pouvez faire la même chose avec dnf :

$ sudo dnf install --upgrade \~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm 

Ce que vous avez appris et la suite

Un logiciel d'empaquetage avec RPM semble intimidant au premier abord, mais avec un peu de patience, vous y arriverez en un rien de temps. Lorsque vous rencontrez des problèmes, vous trouverez également des moyens appropriés d'améliorer votre code. Vous trouverez ci-dessous quelques ressources et recommandations finales :

  • Faites-vous plaisir et procurez-vous un exemplaire du RPM Packaging Guide écrit par Adam Miller, Maxim Svistunov et Marie Doleželová. Il est très complet et bien organisé. Sérieusement, faites-le maintenant; c'est si bon.
  • Le guide officiel d'empaquetage RPM et le guide Fedora RPM sont également pleins de détails ; gardez-les dans un signet.
  • Utilisez rpmlint. Vous serez surpris du nombre de petites choses que vous pouvez détecter et corriger avant d'expédier vos packages RPM.
  • Pas assez ? Fedora propose une liste d'astuces que vous pouvez utiliser lors de l'empaquetage de logiciels.
  • Toujours curieux ? Vous devriez certainement jeter un coup d'œil aux directives d'empaquetage RPM.

Linux
  1. 3 conseils pour imprimer avec Linux

  2. Trucs et astuces pour utiliser CUPS pour imprimer avec Linux

  3. 4 conseils pour mettre un parent plus âgé en ligne avec Linux

  4. Configurez le DNS avec une commande Linux, créez un laboratoire en cinq minutes et plus de conseils pour les administrateurs système

  5. Meilleur logiciel de peinture pour Linux

Tirez le meilleur parti de votre Kindle sous Linux avec ces conseils simples

Les 15 meilleurs Linux pour les enfants | Laissez vos enfants apprendre Linux en s'amusant

Le logiciel de pare-feu Linux 15+ pour protéger votre système Linux

Linux pour les entreprises :développez votre entreprise avec ces applications

20 meilleures distributions et logiciels de serveur multimédia Linux pour votre PC de cinéma maison

10 meilleurs logiciels de didacticiel de dactylographie pour Linux | Augmentez vos compétences de frappe