GNU/Linux >> Tutoriales Linux >  >> Linux

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 una pieza de software que desea usar, pero no hay RPM para ello. Este artículo le muestra cómo crear RPM para aplicaciones de terceros.

Los requisitos previos incluyen:

  • Tiene conocimientos básicos sobre cómo usar RPM para consultar paquetes e instalar o eliminar paquetes. Si no, primero familiarícese con estos conceptos y luego regrese 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 estaría bien que practicaras mientras avanzo.

Para instalar Make, GCC, Java 11 y Git con el administrador de paquetes DNF, 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:NAS Parallel Benchmarks (NPB3.0). Tomé este código e hice una bifurcación, agregando solo una compilación mejorada usando Gradle. Estos son los pasos.

Paso 1:escriba un archivo de especificaciones 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]>
-  

A continuación, elimine las siguientes etiquetas de este archivo de esqueleto, ya que no se aplican a esta tarea:

  • % de configuración automática: Usted mismo desempaquetará el software sin parches
  • %configure y %make_build: En su lugar, usará Gradle

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 cambiar las spec archivo.

[ Para obtener más consejos, descargue la hoja de trucos de secuencias de comandos de Bash Shell. ]

Paso 2:Complete los componentes básicos para el RPM de Java

Después de 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 

La spec El archivo está muy comentado, y puedes ver cómo usé el tar.gz original archivo sin ningún cambio y agregó un nuevo sistema de compilación además de eso, además de dos scripts de contenedor (testAIIS y testAIIW) para ejecutar el código Java después de instalarlo.

A continuación, cree 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 creado, 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%]

El resultado 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

Más información

Empaquetar software con RPM, ya sea una aplicación de código abierto propia o de otra persona, puede parecer intimidante al principio, pero con un poco de paciencia, lo logrará en poco tiempo. A medida que encuentre problemas, también encontrará formas adecuadas de mejorar su código. A continuación se presentan algunos recursos y recomendaciones finales:

  • Hágase un gran favor y obtenga una copia de la Guía de empaque RPM escrita por Adam Miller, Maxim Svistunov y Marie Doleželová. Es muy completo y bien organizado. En serio, hazlo ahora; es así de bueno.
  • La guía RPM Packaging oficial y la guía RPM de Fedora también están llenas de detalles; manténgalos a un marcador de distancia.
  • Utilice rpmlint. Se sorprenderá de la cantidad de pequeñas cosas que puede detectar y corregir antes de enviar sus paquetes RPM.
  • ¿No es suficiente? Fedora tiene una lista de trucos que puede usar al empaquetar software.
  • ¿Tienes sed de más? Definitivamente debería echar un vistazo a las pautas de RPM Packaging.

Linux
  1. Mi historia de Linux:cómo un influyente desarrollador de seguridad se inició en el código abierto

  2. Cómo un gobierno local migró al código abierto

  3. Cómo empaquetar aplicaciones de Python para Linux

  4. Cómo abrir Appimage en Linux

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

Cómo instalar osTicket de código abierto en Ubuntu 20.04

Cómo abrir una ventana de terminal de Linux

Cómo desinstalar aplicaciones WINE

Cómo abrir un PDF en la terminal de Linux

Cómo instalar RStudio Server de código abierto en Ubuntu 20.04 LTS

Cómo instalar una red social de código abierto en Ubuntu 16.04