GNU/Linux >> Tutoriales Linux >  >> Linux

7 pasos para crear un paquete RPM desde el origen en CentOS/RedHat

A veces, es posible que tenga acceso al código fuente de una aplicación de código abierto, pero es posible que no tenga el archivo RPM para instalarlo en su sistema.

En esa situación, puede compilar el código fuente e instalar la aplicación desde el código fuente, o crear un archivo RPM a partir del código fuente usted mismo y usar el archivo RPM para instalar la aplicación.

También puede haber una situación en la que desee crear un paquete RPM personalizado para la aplicación que desarrolló.

Este tutorial explica cómo crear un paquete RPM a partir del código fuente.

Para crear RPM, necesitará el código fuente, lo que normalmente significa un archivo tar comprimido que también incluye el archivo SPEC.

El archivo SPEC generalmente contiene instrucciones sobre cómo compilar RPM, qué archivos forman parte del paquete y dónde debe instalarse.

El RPM realiza las siguientes tareas durante el proceso de construcción.

  1. Ejecuta los comandos y macros mencionados en la sección de preparación del archivo de especificaciones.
  2. Comprueba el contenido de la lista de archivos
  3. Ejecuta los comandos y macros en la sección de compilación del archivo de especificaciones. Las macros de la lista de archivos también se ejecutan en este paso.
  4. Crea el archivo del paquete binario
  5. Crea el archivo del paquete fuente

Una vez que el RPM ejecuta los pasos anteriores, crea el archivo del paquete binario y el archivo del paquete fuente.

El archivo del paquete binario consta de todos los archivos de origen junto con cualquier información adicional para instalar o desinstalar el paquete.

Por lo general, está habilitado con todas las opciones para instalar el paquete que son específicas de la plataforma. El archivo de paquete binario contiene aplicaciones completas o bibliotecas de funciones compiladas para una arquitectura particular. El paquete fuente generalmente consta del archivo tar comprimido original, el archivo de especificaciones y los parches que se requieren para crear el archivo del paquete binario.

Veamos cómo crear una fuente simple y paquetes BIN RPM utilizando un archivo tar.

Si es nuevo en el paquete rpm, es posible que primero desee comprender cómo usar el comando rpm para instalar, actualizar y eliminar paquetes en CentOS o RedHat.

1. Instale el paquete rpm-build

Para crear un archivo rpm basado en el archivo de especificaciones que acabamos de crear, necesitamos usar el comando rpmbuild.

El comando rpmbuild es parte del paquete rpm-build. Instálelo como se muestra a continuación.

# yum install rpm-build

rpm-build depende del siguiente paquete. Si aún no los tiene instalados, yum instalará automáticamente estas dependencias por usted.

elfutils-libelf
rpm
rpm-libs
rpm-python

2. Directorios de compilación de RPM

rpm-build creará automáticamente las siguientes estructuras de directorios que se utilizarán durante la compilación de 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/

Nota:La estructura de directorios anterior es tanto para CentOS como para RedHat cuando se usa el paquete rpmbuild. También puede usar el directorio /usr/src/redhat, pero debe cambiar el parámetro topdir en consecuencia durante la compilación de rpm. Si está haciendo esto en SuSE Enterprise Linux, use el directorio /usr/src/packages.

Si desea utilizar su propia estructura de directorios en lugar de /root/rpmbuild, puede utilizar una de las siguientes opciones:

  • Use la opción –buildroot y especifique el directorio personalizado durante el rpmbuild
  • Especifique el parámetro topdir en el archivo rpmrc o en el archivo rpmmacros.

3. Descargar archivo tar de origen

A continuación, descargue el archivo tar de origen para el paquete que desea compilar y guárdelo en el directorio SOURCES.

Para este ejemplo, he usado el código fuente de la aplicación de código abierto icecase, que es un software de servidor para transmisión multimedia. Pero, los pasos son exactamente los mismos para construir RPM para cualquier otra aplicación. Solo tiene que descargar el código fuente correspondiente para el RPM que está tratando de construir.

# 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. Crear el archivo SPEC

En este paso, dirigimos RPM en el proceso de compilación mediante la creación de un archivo de especificaciones. El archivo de especificaciones generalmente consta de las siguientes ocho secciones diferentes:

  1. Preámbulo:la sección del preámbulo contiene información sobre el paquete que se está creando y define las dependencias del paquete. En general, el preámbulo consta de entradas, una por línea, que comienzan con una etiqueta seguida de dos puntos y luego algo de información.
  2. %prep:en esta sección, preparamos el software para el proceso de creación. Cualquier compilación anterior se elimina durante este proceso y el archivo de origen (.tar) se expande, etc.
  3. Una cosa más clave es entender que hay macros predefinidas disponibles para realizar varias opciones de acceso directo para construir rpm. Es posible que esté utilizando estas macros cuando intente crear paquetes complejos. En el siguiente ejemplo, he usado una macro llamada %setup que elimina cualquier compilación anterior, descompone los archivos de origen y cambia la propiedad de los archivos. También puede usar secuencias de comandos sh en la sección %prep para realizar esta acción, pero la macro %setup simplifica el proceso mediante el uso de secuencias de comandos sh predefinidas.
  4. %description:la sección de descripción generalmente contiene una descripción sobre el paquete.
  5. %build:esta es la sección responsable de realizar la compilación. Por lo general, la sección %build es un script sh.
  6. %install:la sección %install también se ejecuta como secuencia de comandos sh, al igual que %prep y %build. Este es el paso que se usa para la instalación.
  7. %files:esta sección contiene la lista de archivos que forman parte del paquete. Si los archivos no forman parte de la sección %files, no estarán disponibles en el paquete. Se requieren rutas completas y puede establecer los atributos y la propiedad de los archivos en esta sección.
  8. %clean:esta sección le indica al RPM que limpie cualquier archivo que no forme parte del área de compilación normal de la aplicación. Digamos, por ejemplo, si la aplicación crea una estructura de directorio temporal en /tmp/ como parte de su compilación, no se eliminará. Al agregar un script sh en la sección %clean, el directorio se puede eliminar una vez que se completa el proceso de compilación.

Aquí está el archivo SPEC que creé para la aplicación icecast para crear un archivo 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 .

En la sección %build, verá el CFLAGS con opciones de configuración que define las opciones que se pueden usar durante la instalación de RPM y la opción de prefijo, el directorio obligatorio que debe estar presente para la instalación y el directorio sysconfig en el que se deben copiar los archivos del sistema. .

Debajo de esa línea, verá la utilidad make que determina la lista de archivos que se deben compilar y los compila adecuadamente.

En la sección % de instalación, la línea debajo de % de instalación que dice "hacer instalación" se usa para tomar los archivos binarios compilados del paso anterior e instalarlos o copiarlos en las ubicaciones adecuadas para poder acceder a ellos.

5. Cree el archivo RPM usando rpmbuild

Una vez que el archivo SPEC esté listo, puede comenzar a construir su rpm con el comando rpm –b. La opción –b se utiliza para realizar todas las fases del proceso de construcción. Si ve algún error durante esta fase, debe resolverlo antes de volver a intentarlo. Los errores serán generalmente de dependencias de la biblioteca y puede descargarlo e instalarlo según sea necesario.

# 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

Nota:si está usando SuSE Linux, si rpmbuild no está disponible, intente usar "rpm -ba" para compilar el paquete rpm.

Durante la instalación de rpmbuild anterior, es posible que observe los siguientes mensajes de error:

Error 1:no se pudo encontrar la configuración XSLT

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)

Solución 1:instalar libxstl-devel

Para xslt-config, debe instalar el paquete libxstl-devel como se muestra a continuación.

yum install libxstl-devel

Esto también instalará las siguientes dependencias:

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

Error 2:Error de 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)

Solución 2:instalar libvorbis-devel

Para Ogg Vorbis v1.0, instale el paquete libvorbis-devel como se muestra a continuación:

yum install libvorbis-devel

Esto también instalará las siguientes dependencias:

  • libogg
  • libogg-devel
  • libvorbis

6. Verifique los archivos RPM binarios y de origen

Una vez que se completa la compilación de rpm, puede verificar que se crea el rpm de origen y el rpm binario en los directorios a continuación.

# 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. Instale el archivo RPM para verificar

Como paso final, puede instalar el rpm binario para verificar que se instala correctamente y se resuelven todas las dependencias.

# 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
..
..

Después de la instalación anterior, puede verificar que su archivo rpm personalizado creado se instaló correctamente como se muestra a continuación.

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

Linux
  1. Cómo enumerar los archivos instalados desde un paquete RPM o DEB en Linux

  2. Cómo compilar Brotli desde la fuente en CentOS 7

  3. Cómo crear paquetes desde el origen mediante CheckInstall

  4. 4 pasos para crear usuarios de Linux desde un archivo csv con Ansible

  5. Comandos RPM

Cómo compilar Nginx desde la fuente en CentOS 7

Cómo instalar RPM en CentOS

Cómo compilar paquetes Debian desde el código fuente

Cómo instalar paquetes RPM en CentOS 8

Cómo crear un paquete RPM a partir de un Tarball

Cómo compilar el kernel de Linux desde el origen para crear un kernel personalizado