GNU/Linux >> Tutoriels Linux >  >> Linux

7 étapes pour créer un package RPM à partir de la source sur CentOS / RedHat

Parfois, vous pouvez avoir accès au code source d'une application open source mais ne pas disposer du fichier RPM pour l'installer sur votre système.

Dans ce cas, vous pouvez soit compiler le code source et installer l'application à partir du code source, soit créer vous-même un fichier RPM à partir du code source et utiliser le fichier RPM pour installer l'application.

Il peut également arriver que vous souhaitiez créer un package RPM personnalisé pour l'application que vous avez développée.

Ce didacticiel explique comment créer un package RPM à partir du code source.

Afin de créer des RPM, vous aurez besoin du code source, ce qui signifie généralement un fichier tar compressé qui inclut également le fichier SPEC.

Le fichier SPEC contient généralement des instructions sur la façon de construire RPM, quels fichiers font partie du paquet et où il doit être installé.

Le RPM effectue les tâches suivantes pendant le processus de construction.

  1. Exécute les commandes et les macros mentionnées dans la section de préparation du fichier de spécification.
  2. Vérifie le contenu de la liste de fichiers
  3. Exécute les commandes et les macros dans la section build du fichier spec. Les macros de la liste de fichiers sont également exécutées à cette étape.
  4. Crée le fichier de package binaire
  5. Crée le fichier de package source

Une fois que le RPM a exécuté les étapes ci-dessus, il crée le fichier de package binaire et le fichier de package source.

Le fichier de package binaire se compose de tous les fichiers source ainsi que de toute information supplémentaire pour installer ou désinstaller le package.

Il est généralement activé avec toutes les options d'installation du package spécifiques à la plate-forme. Le fichier de package binaire contient des applications complètes ou des bibliothèques de fonctions compilées pour une architecture particulière. Le paquet source se compose généralement du fichier tar compressé d'origine, du fichier de spécification et des correctifs nécessaires pour créer le fichier de paquet binaire.

Voyons comment créer une source simple et des packages RPM BIN à l'aide d'un fichier tar.

Si vous débutez avec le package rpm, vous voudrez peut-être d'abord comprendre comment utiliser la commande rpm pour installer, mettre à niveau et supprimer des packages sur CentOS ou RedHat.

1. Installer le package rpm-build

Pour créer un fichier rpm basé sur le fichier de spécifications que nous venons de créer, nous devons utiliser la commande rpmbuild.

La commande rpmbuild fait partie du package rpm-build. Installez-le comme indiqué ci-dessous.

# yum install rpm-build

rpm-build dépend du package suivant. Si vous ne les avez pas déjà installés, yum installera automatiquement ces dépendances pour vous.

elfutils-libelf
rpm
rpm-libs
rpm-python

2. Répertoires de compilation RPM

rpm-build créera automatiquement les structures de répertoires suivantes qui seront utilisées lors de la construction du RPM.

# ls -lF /root/rpmbuild/
drwxr-xr-x. 2 root root 4096 Feb  4 12:21 BUILD/
drwxr-xr-x. 2 root root 4096 Feb  4 12:21 BUILDROOT/
drwxr-xr-x. 2 root root 4096 Feb  4 12:21 RPMS/
drwxr-xr-x. 2 root root 4096 Feb  4 12:21 SOURCES/
drwxr-xr-x. 2 root root 4096 Feb  4 12:21 SPECS/
drwxr-xr-x. 2 root root 4096 Feb  4 12:21 SRPMS/

Remarque :La structure de répertoires ci-dessus concerne à la fois CentOS et RedHat lors de l'utilisation du package rpmbuild. Vous pouvez également utiliser le répertoire /usr/src/redhat, mais vous devez modifier le paramètre topdir en conséquence lors de la construction rpm. Si vous faites cela sur SuSE Enterprise Linux, utilisez le répertoire /usr/src/packages.

Si vous souhaitez utiliser votre propre structure de répertoires au lieu de /root/rpmbuild, vous pouvez utiliser l'une des options suivantes :

  • Utilisez l'option –buildroot et spécifiez le répertoire personnalisé pendant le rpmbuild
  • Spécifiez le paramètre topdir dans le fichier rpmrc ou le fichier rpmmacros.

3. Télécharger le fichier tar source

Ensuite, téléchargez le fichier tar source du package que vous souhaitez créer et enregistrez-le dans le répertoire SOURCES.

Pour cet exemple, j'ai utilisé le code source de l'application open source icecase, qui est un logiciel serveur pour le streaming multimédia. Mais, les étapes sont exactement les mêmes pour la construction de RPM pour toute autre application. Il vous suffit de télécharger le code source correspondant au RPM que vous essayez de construire.

# cd /root/rpmbuild/SOURCES/

# wget http://downloads.xiph.org/releases/icecast/icecast-2.3.3.tar.gz

# ls -l
-rw-r--r--. 1 root root 1161774 Jun 11  2012 icecast-2.3.3.tar.gz

4. Créer le fichier SPEC

Dans cette étape, nous dirigeons RPM dans le processus de construction en créant un fichier de spécification. Le fichier de spécifications se compose généralement des huit sections différentes suivantes :

  1. Préambule - La section préambule contient des informations sur le paquet en cours de construction et définit toutes les dépendances au paquet. En général, le préambule se compose d'entrées, une par ligne, qui commencent par une balise suivie de deux-points, puis de quelques informations.
  2. %prep - Dans cette section, nous préparons le logiciel pour le processus de construction. Toutes les versions précédentes sont supprimées au cours de ce processus et le fichier source (.tar) est développé, etc.
  3. Une autre chose essentielle est de comprendre qu'il existe des macros prédéfinies disponibles pour effectuer diverses options de raccourci pour créer des rpm. Vous pouvez utiliser ces macros lorsque vous essayez de créer des packages complexes. Dans l'exemple ci-dessous, j'ai utilisé une macro appelée %setup qui supprime toutes les versions précédentes, décompresse les fichiers source et modifie la propriété des fichiers. Vous pouvez également utiliser des scripts sh sous la section %prep pour effectuer cette action, mais la macro %setup simplifie le processus en utilisant des scripts sh prédéfinis.
  4. %description – la section de description contient généralement une description du paquet.
  5. %build - Il s'agit de la section responsable de l'exécution de la construction. Habituellement, la section %build est un script sh.
  6. %install - la section % install est également exécutée en tant que script sh, tout comme %prep et %build. C'est l'étape qui est utilisée pour l'installation.
  7. %files – Cette section contient la liste des fichiers qui font partie du package. Si les fichiers ne font pas partie de la section %files, ils ne seront pas disponibles dans le package. Des chemins d'accès complets sont requis et vous pouvez définir les attributs et la propriété des fichiers dans cette section.
  8. %clean - Cette section demande au RPM de nettoyer tous les fichiers qui ne font pas partie de la zone de construction normale de l'application. Disons par exemple, si l'application crée une structure de répertoire temporaire dans /tmp/ dans le cadre de sa construction, elle ne sera pas supprimée. En ajoutant un script sh dans la section %clean, le répertoire peut être supprimé une fois le processus de construction terminé.

Voici le fichier SPEC que j'ai créé pour l'application icecast afin de créer un fichier RPM.

# cat /root/rpmbuild/SPECS/icecast.spec
Name:           icecast
Version:        2.3.3
Release:        0
Summary:        Xiph Streaming media server that supports multiple formats.
Group:          Applications/Multimedia
License:        GPL
URL:            http://www.icecast.org/
Vendor:         Xiph.org Foundation [email protected]
Source:         http://downloads.us.xiph.org/releases/icecast/%{name}-%{version}.tar.gz
Prefix:         %{_prefix}
Packager: 	Karthik
BuildRoot:      %{_tmppath}/%{name}-root

%description
Icecast is a streaming media server which currently supports Ogg Vorbis
and MP3 audio streams. It can be used to create an Internet radio
station or a privately running jukebox and many things in between.
It is very versatile in that new formats can be added relatively
easily and supports open standards for commuincation and interaction.

%prep
%setup -q -n %{name}-%{version}

%build
CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix} --mandir=%{_mandir} --sysconfdir=/etc

make

%install
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT

make DESTDIR=$RPM_BUILD_ROOT install
rm -rf $RPM_BUILD_ROOT%{_datadir}/doc/%{name}

%clean
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT

%files
%defattr(-,root,root)
%doc README AUTHORS COPYING NEWS TODO ChangeLog
%doc doc/*.html
%doc doc/*.jpg
%doc doc/*.css
%config(noreplace) /etc/%{name}.xml
%{_bindir}/icecast
%{_prefix}/share/icecast/*

%changelog

In this file, under % prep section you may noticed the macro “%setup -q -n %{name}-%{version}”. This macro executes the following command in the background.

cd /usr/src/redhat/BUILD
rm -rf icecast
gzip -dc /usr/src/redhat/SOURCES/icecast-2.3.3.tar.gz | tar -xvvf -
if [ $? -ne 0 ]; then
  exit $?
fi
cd icecast
cd /usr/src/redhat/BUILD/icecast
chown -R root.root .
chmod -R a+rX,g-w,o-w .

Dans la section %build, vous verrez le CFLAGS avec les options de configuration qui définissent les options pouvant être utilisées lors de l'installation de RPM et l'option de préfixe , le répertoire obligatoire devant être présent pour l'installation et le répertoire sysconfig sous lequel les fichiers système doivent être copiés .

Sous cette ligne, vous verrez l'utilitaire make qui détermine la liste des fichiers à compiler et les compile de manière appropriée.

Dans la section % install, la ligne sous %install qui dit "make install" est utilisée pour prendre les binaires compilés à l'étape précédente et les installe ou les copie aux emplacements appropriés afin qu'ils soient accessibles.

5. Créez le fichier RPM à l'aide de rpmbuild

Une fois le fichier SPEC prêt, vous pouvez commencer à créer votre rpm avec la commande rpm –b. L'option –b est utilisée pour effectuer toutes les phases du processus de construction. Si vous voyez des erreurs au cours de cette phase, vous devez les résoudre avant de réessayer. Les erreurs seront généralement des dépendances de la bibliothèque et vous pouvez la télécharger et l'installer si nécessaire.

# cd /root/rpmbuild/SPECS

# rpmbuild -ba icecast.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.Kohe4t
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd /root/rpmbuild/BUILD
+ rm -rf icecast-2.3.3
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/icecast-2.3.3.tar.gz
+ /bin/tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd icecast-2.3.3
+ /bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.ynm7H7
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd icecast-2.3.3
+ CFLAGS='-O2 -g'
+ ./configure --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether to enable maintainer-specific portions of Makefiles... no
checking for gcc... gcc
..
..
..
Wrote: /root/rpmbuild/SRPMS/icecast-2.3.3-0.src.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/icecast-2.3.3-0.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.dzahrv
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd icecast-2.3.3
+ '[' /root/rpmbuild/BUILDROOT/icecast-2.3.3-0.x86_64 '!=' / ']'
+ rm -rf /root/rpmbuild/BUILDROOT/icecast-2.3.3-0.x86_64
+ exit 0

Remarque :Si vous utilisez SuSE Linux, si rpmbuild n'est pas disponible, essayez d'utiliser "rpm -ba" pour créer le package rpm.

Lors de l'installation de rpmbuild ci-dessus, vous remarquerez peut-être les messages d'erreur suivants :

Erreur 1 :la configuration XSLT est introuvable

checking for xslt-config... no
configure: error: XSLT configuration could not be found
error: Bad exit status from /var/tmp/rpm-tmp.8J0ynG (%build)
RPM build errors:
    Bad exit status from /var/tmp/rpm-tmp.8J0ynG (%build)

Solution 1 :Installer libxstl-devel

Pour xslt-config, vous devez installer le package libxstl-devel comme indiqué ci-dessous.

yum install libxstl-devel

Cela installera également les dépendances suivantes :

  • libgcrypt
  • libgcrypt-devel
  • libgpg-error-devel

Erreur 2 :erreur libvorbis

checking for libvorbis... configure: error: must have Ogg Vorbis v1.0 or above installed
error: Bad exit status from /var/tmp/rpm-tmp.m4Gk3f (%build)

Solution 2 :installez libvorbis-devel

Pour Ogg Vorbis v1.0, installez le package libvorbis-devel comme indiqué ci-dessous :

yum install libvorbis-devel

Cela installera également les dépendances suivantes :

  • libog
  • libogg-devel
  • libvorbis

6. Vérifier les fichiers RPM source et binaire

Une fois le rpmbuild terminé, vous pouvez vérifier que le rpm source et le rpm binaire sont créés dans les répertoires ci-dessous.

# ls -l /root/rpmbuild/SRPMS/
-rw-r--r-- 1 root root 1162483 Aug 25 15:46 icecast-2.3.3-0.src.rpm

# ls -l /root/rpmbuild/RPMS/x86_64/
-rw-r--r--. 1 root root 349181 Feb  4 12:54 icecast-2.3.3-0.x86_64.rpm

7. Installez le fichier RPM pour vérifier

Enfin, vous pouvez installer le rpm binaire pour vérifier qu'il s'installe correctement et que toutes les dépendances sont résolues.

# rpm -ivvh /root/rpmbuild/RPMS/x86_64/icecast-2.3.3-0.x86_64.rpm
D: ============== /root/rpmbuild/RPMS/x86_64/icecast-2.3.3-0.x86_64.rpm
D: loading keyring from pubkeys in /var/lib/rpm/pubkeys/*.key
D: couldn't find any keys in /var/lib/rpm/pubkeys/*.key
D: loading keyring from rpmdb
D: opening  db environment /var/lib/rpm cdb:mpool:joinenv
D: opening  db index       /var/lib/rpm/Packages rdonly mode=0x0
D:  read h#     210 Header sanity check: OK
D: added key gpg-pubkey-c105b9de-4e0fd3a3 to keyring
D: Using legacy gpg-pubkey(s) from rpmdb
D: Expected size:       349181 = lead(96)+sigs(180)+pad(4)+data(348901)
D:   Actual size:       349181
D: ========== relocations
D:      added binary package [0]
D: found 0 source and 1 binary packages
D: ========== +++ icecast-2.3.3-0 x86_64/linux 0x2
..
..

Après l'installation ci-dessus, vous pouvez vérifier que votre fichier RPM personnalisé a été installé avec succès, comme indiqué ci-dessous.

# rpm -qa icecast
icecast-2.3.3-0.x86_64

Linux
  1. Comment répertorier les fichiers installés à partir d'un package RPM ou DEB sous Linux

  2. Comment compiler Brotli à partir de la source sur CentOS 7

  3. Comment créer des packages à partir de la source à l'aide de CheckInstall

  4. 4 étapes pour créer des utilisateurs Linux à partir d'un fichier csv avec Ansible

  5. Quand doit-on compiler et installer à partir de la source ?

Comment construire Nginx à partir de la source sur CentOS 7

Comment installer RPM sur CentOS

Comment construire des paquets Debian à partir de la source

Comment installer les packages RPM sur CentOS 8

Comment créer un package RPM à partir d'une archive tar

Comment compiler le noyau Linux à partir de la source pour créer un noyau personnalisé