Cómo crear un paquete GNU Hello World RPM en Fedora


RPM (un acrónimo recursivo de RPM Package Manager) es un sistema de administración de paquetes de código abierto y gratuito para Linux. Aunque originalmente se creó para su uso en Red Hat Linux, ahora se usa en muchas distribuciones de Linux como CentOS, Fedora y OpenSuse. Es importante destacar que el nombre RPM se refiere al programa administrador de paquetes y .rpm es un formato de archivo.

En este artículo, explicaremos cómo escribir archivos RPM, mostrando cómo crear fácilmente una fuente simple y paquetes de software binarios, por ejemplo, el paquete RPM GNU “Hello World” en la distribución de Fedora Linux. Suponemos que tiene un conocimiento básico de los paquetes RPM prefabricados y del proceso de creación de software de código abierto gratuito.

Instalar herramientas de desarrollo en Fedora

Comencemos configurando el entorno de desarrollo en Fedora Linux ejecutando el siguiente comando para instalar las herramientas necesarias para construir RPM.

$ sudo dnf install fedora-packager @development-tools

A continuación, agregue su cuenta sin privilegios al grupo "simulacro" de la siguiente manera (reemplace tecmint con su nombre de usuario real). Esto le permitirá probar el procedimiento de construcción en un chroot limpio.

$ sudo usermod -a -G mock tecmint

Ahora, cree una compilación RPM en su directorio ~/rpmbuild y verifique la compilación usando los siguientes comandos. Mostrará una lista de subdirectorios, que contiene el código fuente del proyecto, archivos de configuración RPM y paquetes binarios.

$ rpmdev-setuptree
$ tree ~/rpmbuild/

Esto es para lo que está destinado cada directorio:

  1. BUILD – stores various %buildroot directories when packages are built.
  2. RPMS – will contain binary RPMs in sub-directories of Architecture.
  3. SOURCES – stores compressed source archives and any patches, this is where the rpmbuild command will look for them.
  4. SPECS – stores the SPEC files.
  5. SRPMS – stores the Source RPM instead of a Binary RPM.

Creación de un RPM de "Hola mundo"

En este paso, necesita descargar el código fuente (también conocido como la fuente "ascendente") del proyecto Hello World que estamos empaquetando, en el directorio ~/rpmbuild/SOURCE con el siguiente comando wget.

$ cd ~/rpmbuild/SOURCES
$ wget http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz -P ~/rpmbuild/SOURCES

A continuación, configuremos el paquete RPM usando un archivo .spec (llamémoslo hello.spec en este caso) en el directorio ~/rpmbuild/SPECS, usando rpmdev- programa newspec.

$ cd ~/rpmbuild/SPECS
$ rpmdev-newspec hello
$ ls

Luego abra el archivo hello.spec con su editor favorito.

$ vim hello.spec

La plantilla predeterminada debería verse así:

Name:           hello
Version:
Release:        1%{?dist}
Summary:

License:
URL:
Source0:

BuildRequires:
Requires:

%description

%prep
%autosetup

%build
%configure
%make_build

%install
rm -rf $RPM_BUILD_ROOT
%make_install

%files
%license add-license-file-here
%doc add-docs-here

%changelog
* Tue May 28 2019 Aaron Kili

Expliquemos brevemente los parámetros predeterminados en un archivo .spec :

  • Name – used to set a name for the package.
  • Version – should mirror upstream.
  • Release – numbers you work within Fedora.
  • Summary – is a brief one-line description of the package, the first letter should be uppercase to avoid rpmlint complaints.
  • License – check the License status of the software by inspecting the source files and/or their LICENSE files, and/or by talking to the authors.
  • URL – specifies the home page of the software package.
  • Source0 – specifies the source files. It can be a direct URL or a path of the software’s compressed source code.
  • BuildRequires – specifies the dependencies needed to build the software.
  • Requires – specifies the dependencies needed to run the software.
  • %prep – is used to create the environment for building the rpm package.
  • %build – is used to compile and to build the source codes.
  • %install – this is used to install the programs. It lists command(s) to needed to copy the resultant file from the build process to the BUILDROOT directory.
  • %files – this section lists the files provided by the package, which will be installed on the system.
  • %changelog – should stores the work on preparing the RPM, especially if there are security and bug patches included on top of the base upstream source. It’s automatically generated while creating the hello.spec file. The changelog data is usually displayed by rpm --changelog -q <packagename>.

Ahora edite su archivo .spec y realice los cambios como se muestra.

Name:           hello
Version:        2.10
Release:        1%{?dist}
Summary:        The "Hello World" program from GNU

License:        GPLv3+
URL:            http://ftp.gnu.org/gnu/%{name}
Source0:        http://ftp.gnu.org/gnu/%{name}/%{name}-%{version}.tar.gz

BuildRequires: gettext
      
Requires(post): info
Requires(preun): info

%description 
The "Hello World" program package 

%prep
%autosetup

%build
%configure
make %{make_build}

%install
%make_install
%find_lang %{name}
rm -f %{buildroot}/%{_infodir}/dir

%post
/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || :

%preun
if [ $1 = 0 ] ; then
/sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || :
fi

%files -f %{name}.lang
%{_mandir}/man1/hello.1.*
%{_infodir}/hello.info.*
%{_bindir}/hello

%doc AUTHORS ChangeLog NEWS README THANKS TODO
%license COPYING

%changelog
* Tue May 28 2019 Aaron Kili

Notará que hemos utilizado algunos parámetros nuevos en el archivo anterior que no se han explicado. Se denominan macros, y se utilizan para crear invocaciones del sistema definidas por RPM para establecer rutas de instalación de paquetes. Por lo tanto, generalmente es preferible no codificar estas rutas en archivos de especificaciones, sino usar las mismas macros para mantener la coherencia.

Las siguientes son macros de directorio y compilación de RPM junto con sus definiciones y valores predeterminados:

  • %{make_build} – is used in the %build section of the spec file, it runs the make command.
  • %{name} – defines package or directory name.
  • %{buildroot} – %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}, same as $BUILDROOT
  • %{_infodir} – %{_datarootdir}/info, default: /usr/share/info
  • %{_mandir} – %{_datarootdir}/man, default: /usr/share/man
  • %{_bindir} – %{_exec_prefix}/bin, default: /usr/bin

Tenga en cuenta que puede encontrar los valores para estas macros en/usr/lib/rpm/platform/*/macros o consulte Pautas de empaquetado: Macros RPM.

Construyendo el paquete RPM

Para compilar los paquetes fuente, binarios y de depuración, ejecute el siguiente comando rpmbuild.

$ rpmbuild -ba hello.spec

Después del proceso de compilación, los RPM de origen y los RPM binarios se crearán en los directorios ../SRPMS/ y ../RPMS/ respectivamente. Puede usar el programa rpmlint para verificar y asegurarse de que el archivo de especificaciones y los archivos RPM creados cumplen con las reglas de diseño de RPM:

$ rpmlint hello.spec ../SRPMS/hello* ../RPMS/*/hello*

Si hay algún error como se muestra en la captura de pantalla anterior, corríjalo antes de continuar.

Por último, pero no menos importante, use un programa simulado para verificar que la compilación del paquete sea exitosa en el entorno de compilación restringido de Fedora.

$ mock --verbose ../SRPMS/hello-2.10-1.fc29.src.rpm

Para obtener más información, consulte la documentación de Fedora: Creación de paquetes RPM.

¡Eso es todo! En este artículo, hemos explicado cómo mejorar su sistema Fedora para crear una fuente simple y un paquete de software binario. También mostramos cómo crear un paquete GUN Hello Word RPM. Utilice el formulario de comentarios a continuación para comunicarse con nosotros si tiene preguntas o comentarios.