GNU/Linux >> Tutoriels Linux >  >> Linux

Comment empaqueter des applications open source en tant que RPM

Récemment, j'ai écrit sur l'empaquetage de votre propre logiciel avec Red Hat Package Manager (RPM). Un autre scénario courant est que vous trouvez un logiciel que vous souhaitez utiliser, mais qu'il n'y a pas de RPM pour celui-ci. Cet article vous montre comment créer des RPM pour des applications tierces.

Les prérequis incluent :

  • Vous avez des connaissances de base sur l'utilisation de RPM pour interroger des packages et installer ou supprimer des packages. Si ce n'est pas le cas, familiarisez-vous d'abord avec ces concepts, puis revenez ici pour vous amuser.
  • Make, Git, GCC et Java sont installés, car vous en aurez besoin pour effectuer les exercices inclus ici. Ce n'est pas obligatoire, mais ce serait bien si vous vous entraîniez pendant que j'avance.

Pour installer Make, GCC, Java 11 et Git à l'aide du gestionnaire de packages DNF, exécutez :

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

Pour cet exemple, j'utiliserai un benchmark Java que j'aime de la NASA :NAS Parallel Benchmarks (NPB3.0). J'ai pris ce code et créé un fork, en ajoutant uniquement une version améliorée à l'aide de Gradle. Voici les étapes.

Étape 1 :Écrire un fichier de spécifications squelette

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

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

Le fichier résultant ressemble à ceci :

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]>
-  

Ensuite, supprimez les balises suivantes de ce fichier squelette, car elles ne s'appliquent pas à cette tâche :

  • %autosetup : Vous décompresserez le logiciel vous-même sans correctifs
  • %configure et %make_build : Vous utiliserez Gradle à la place

Installez les prérequis, Java et 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

Vous êtes maintenant prêt à modifier la spec fichier.

[ Obtenez plus de conseils en téléchargeant l'aide-mémoire pour les scripts shell bash. ]

Étape 2 :Remplissez les blocs de construction pour le RPM Java

Après plusieurs modifications, comme l'ajout de Gradle dans le cadre de la construction, vous avez :

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 le fichier est fortement commenté, et vous pouvez voir comment j'ai utilisé le tar.gz d'origine fichier sans aucune modification et ajouté un nouveau système de construction en plus de cela, ainsi que deux scripts wrapper (testAIIS et testAIIW) pour exécuter le code Java après son installation.

Créez ensuite le nouveau 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

Étape 3 :Installez votre RPM personnalisé

Avec votre RPM construit, vous pouvez maintenant l'installer :

$ 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 sortie indique le succès :

/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

En savoir plus

Empaqueter un logiciel avec RPM, qu'il s'agisse de votre propre application open source ou de celle de quelqu'un d'autre, peut sembler intimidant au début, mais avec un peu de patience, vous y arriverez en un rien de temps. Lorsque vous rencontrez des problèmes, vous trouverez également des moyens appropriés d'améliorer votre code. Vous trouverez ci-dessous quelques ressources et recommandations finales :

  • Faites-vous plaisir et procurez-vous un exemplaire du RPM Packaging Guide écrit par Adam Miller, Maxim Svistunov et Marie Doleželová. Il est très complet et bien organisé. Sérieusement, faites-le maintenant; c'est si bon.
  • Le guide officiel d'empaquetage RPM et le guide Fedora RPM sont également pleins de détails ; gardez-les dans un signet.
  • Utilisez rpmlint. Vous serez surpris du nombre de petites choses que vous pouvez détecter et corriger avant d'expédier vos packages RPM.
  • Pas assez ? Fedora propose une liste d'astuces que vous pouvez utiliser lors de l'empaquetage de logiciels.
  • Envie de plus ? Vous devriez certainement jeter un coup d'œil aux directives d'empaquetage RPM.

Linux
  1. Comment un gouvernement local a migré vers l'open source

  2. Comment empaqueter des applications Python pour Linux

  3. Comment ouvrir Appimage sous Linux

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

  5. Debian - Comment connaître le référentiel source d'un paquet dans Debian ?

Comment installer osTicket Open Source sur Ubuntu 20.04

Comment ouvrir une fenêtre de terminal Linux

Comment désinstaller les applications WINE

Comment ouvrir un PDF dans un terminal Linux

Comment installer RStudio Server open source sur Ubuntu 20.04 LTS

Comment installer un réseau social open source sur Ubuntu 16.04