Cómo empaquetar aplicaciones de código abierto como RPM

Recientemente escribí sobre empaquetar su propio software con Red Hat Package Manager (RPM). Otro escenario común es que encuentra el software que desea usar, pero no hay RPM para él. Este artículo le muestra cómo crear RPM para aplicaciones de terceros.

Los requisitos previos incluyen:

  • Tiene conocimientos básicos sobre el uso de RPM para solicitar paquetes y instalar o quitar paquetes Si no es así, primero familiarícese con estos conceptos y luego vuelva aquí para divertirse.
  • Tiene instalados Make, Git, GCC y Java, ya que los necesitará para completar los ejercicios que se incluyen aquí. No es obligatorio, pero sería bueno que practicaras a medida que avanzo.

Para instalar Make, GCC, Java 11 y Git usando el DNF administrador de paquetes, ejecute:

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

Para este ejemplo, usaré un punto de referencia de Java que me gusta de la NASA: Puntos de referencia paralelos de NAS (NPB3.0). Tomé este código y lo bifurqué, solo agregué una versión mejorada usando gradle. Aquí están los pasos.

Paso 1: escriba un archivo de especificación de esqueleto

$  rpmdev-newspec --output ~/rpmbuild/SPECS/NPB.spec 
--type minimal

/home/josevnz/rpmbuild/SPECS/npb.spec created;
type minimal, rpm version >= 4.16.

El archivo resultante se ve así:

Name:           npb
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 Oct 05 2021 Jose Vicente Nunez <[email protected]>
-  

Luego elimine las siguientes etiquetas de este archivo de esqueleto, ya que no se aplican a esta tarea:

  • % configuración automática: Usted mismo desempaquetará el software sin parches.
  • % configurar y % hacer_construir: Usarás Gradle en su lugar

Instale los requisitos previos, Java y Gradle:

$ sudo dnf install java-11-openjdk
$ sudo -i mkdir -p /opt/gradle
$ sudo -i curl --silent --location --fail 
--output /opt/gradle/gradle.zip 
https://services.gradle.org/distributions/gradle-7.2-bin.zip
$ cd /opt/gradle
$ sudo unzip gradle.zip
$ sudo /bin/rm -f /opt/gradle/gradle.zip

Ahora está listo para modificar el spec archivar.

[ Get more tips by downloading the Bash shell scripting cheat sheet. ]

Paso 2: complete los componentes básicos para Java RPM

Después varios cambios, como agregar Gradle como parte de la compilación, tiene:

Name:           NPB
Version:        3.0
Release:        1%{?dist}
Summary:        Small set of programs designed to help evaluate the performance of parallel supercomputers

License:        NOSA
URL:            https://www.nas.nasa.gov/software/npb.html
Source0:        https://www.nas.nasa.gov/assets/npb/%{name}%{version}.tar.gz

BuildRequires:  java-11-openjdk-headless,tar,gzip,rpmdevtools,rpmlint
Requires:       java-11-openjdk-headless

# Custom macros (https://rpm-software-management.github.io/rpm/manual/macros.html)
# If you want to see the value of many of these macros, just run this: /usr/bin/rpm --showrc
%global debug_package %{nil}
%global gradle /opt/gradle/gradle-7.2/bin/gradle
%global curl /bin/curl --location --fail --silent --output
%global JAVA_DIR NPB3_0_JAV

%description

The NAS Parallel Benchmarks (NPB) are a small set of programs designed to help evaluate the performance
of parallel supercomputers. The benchmarks are derived from computational fluid dynamics (CFD)
applications and consist of five kernels and three pseudo-applications in the original "pencil-and-paper"
specification (NPB 1). The benchmark suite has been extended to include new benchmarks for unstructured
adaptive meshes, parallel I/O, multi-zone applications, and computational grids. Problem sizes in NPB are
predefined and indicated as different classes. Reference implementations of NPB are available in
commonly-used programming models like MPI and OpenMP (NPB 2 and NPB 3).

%prep
test ! -x %{gradle} && echo "ERROR: Gradle not installed!" && exit 100
# On a production environment you MOST LIKELY point to your private copy of the build artifacts
/bin/curl --location --fail --silent --output %{_sourcedir}/%{name}%{version}.tar.gz  https://www.nas.nasa.gov/assets/npb/%{name}%{version}.tar.gz
%setup -q -n %{name}%{version}

%build
cd %{name}%{version}-JAV
# If you are not familiar with Gradle, you should read the following:
# https://docs.gradle.org/current/userguide/building_java_projects.html#sec:custom_java_source_set_paths
/bin/cat<<GRADLE>build.gradle.kts
// Gradle build file dynamically created for %{name}%{version}
plugins {
    `java-library`
}

java {
    toolchain {
        languageVersion.set(JavaLanguageVersion.of(11))
    }   
}

sourceSets {
    main {
        java {
            setSrcDirs(listOf("%{JAVA_DIR}"))
        }
    }   

    test {
        java {
            setSrcDirs(listOf("test"))
        }
    }   
}
GRADLE
%{gradle} clean java jar

%install
/bin/rm -rf %{buildroot}
/bin/mkdir -v -p %{buildroot}/%{_bindir}
/bin/mkdir -v -p %{buildroot}/%{_libdir}
/bin/mkdir -v -p %{buildroot}/%{_pkgdocdir}
/bin/cp -p -v %{_builddir}/%{name}%{version}/%{name}%{version}-JAV/build/libs/%{name}%{version}-JAV.jar %{buildroot}/%{_libdir}

# On a production environment you MOST LIKELY point to your private copy of the build artifacts
%{curl} %{buildroot}/%{_pkgdocdir}/LICENSE https://raw.githubusercontent.com/josevnz/%{name}%{version}-JAV-FORK/main/LICENSE
%{curl} %{buildroot}/%{_pkgdocdir}/README.md https://github.com/josevnz/%{name}%{version}-JAV-FORK/blob/main/%{name}%{version}-JAV/README.md
%{curl} %{buildroot}/%{_bindir}/testAllS https://raw.githubusercontent.com/josevnz/tutorials/main/testAllS
%{curl} %{buildroot}/%{_bindir}/testAllW https://raw.githubusercontent.com/josevnz/tutorials/main/testAllW
/bin/chmod a+xr %{buildroot}/%{_bindir}/{testAllS,testAllW}

%clean
/bin/rm -rf %{buildroot}

%files
%license %{_pkgdocdir}/LICENSE
%doc %{_pkgdocdir}/README.md
%{_libdir}/%{name}%{version}-JAV.jar
%{_bindir}/testAllS
%{_bindir}/testAllW

%changelog
* Tue Oct 05 2021 Jose Vicente Nunez <[email protected]>
- First RPM 

el spec el archivo está muy comentado, y puedes ver cómo usé el original tar.gz archivo sin ninguna modificación y agregó un nuevo sistema de compilación además de eso, así como dos scripts de envoltura (prueba y pruebaAIIW) para ejecutar el código Java después de instalarlo.

Luego crea el nuevo RPM:

$ rpmbuild -ba ~/rpmbuild/SPECS/npb.spec
Requires: /usr/bin/bash
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/josevnz/rpmbuild/BUILDROOT/NPB-3.0-1.fc33.x86_64
Wrote: /home/josevnz/rpmbuild/SRPMS/NPB-3.0-1.fc33.src.rpm
Wrote: /home/josevnz/rpmbuild/RPMS/x86_64/NPB-3.0-1.fc33.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.JGJ4Ky

Paso 3: Instale su RPM personalizado

Con su RPM construido, ahora puede instalarlo:

$ sudo rpm -ihv ~/rpmbuild/RPMS/x86_64/NPB-3.0-1.fc33.x86_64.rpm
[sudo] password for josevnz: 
Verifying...              ################## [100%]
Preparing...              ################## [100%]
Updating / installing...
   1:NPB-3.0-1.fc33       ################## [100%]

La salida indica éxito:

/usr/bin/testAllS
+ /usr/lib/jvm/java-11-openjdk-11.0.12.0.7-4.fc33.x86_64/bin/java -classpath
[...]rpmbuild/BUILD/NPB3.0/NPB3.0-JAV/build/libs/NPB3.0-JAV.jar NPB3_0_JAV.BT
-np2 CLASS=S
 NAS Parallel Benchmarks Java version (NPB3_0_JAV)
 Multithreaded Version BT.S np=2
No input file inputbt.data, Using compiled defaults
Size: 12 X 12 X 12
Iterations: 60 dt: 0.01
Time step 1
Time step 20
Time step 40
Time step 60
Verification being performed for class S
accuracy setting for epsilon = 1.0000000000000005E-8
Comparison of RMS-norms of residual
[...]
BT.S: Verification Successful
Índice
  • Aprende más
  • Aprende más

    Empaquetado de software con RPM, ya sea su propia aplicación de código abierto o la de otra persona-puede Parece intimidante al principio, pero con un poco de paciencia lo lograrás en poco tiempo. A medida que encuentre problemas, también encontrará formas adecuadas de mejorar su código. Aquí hay algunos recursos y recomendaciones finales:

    • Hágase un gran favor y obtenga una copia del Guía de empaque RPM escrito por Adam Miller, Maxim Svistunov y Marie Doleželová. Es muy completo y bien organizado. En serio, hazlo ahora; es tan bueno
    • el Guía oficial de embalaje de RPM y el RPM de Fedora guía también están llenos de detalles; manténgalos alejados de un marcador.
    • Usar RPMlint. Se sorprenderá de la cantidad de pequeñas cosas que puede agarrar y arreglar antes de enviar sus paquetes RPM.
    • ¿No demasiado? Fedora tiene un lista de consejos puede utilizar al empaquetar el software.
    • ¿Quieren más? Definitivamente deberías echar un vistazo a Pautas de empaque RPM.


    Si quieres conocer otros artículos similares a Cómo empaquetar aplicaciones de código abierto como RPM puedes visitar la categoría Linux.

    Artículos de interés

    Subir

    Si continuas utilizando este sitio aceptas el uso de cookies. Más información