Di recente, ho scritto di come impacchettare il tuo software con Red Hat Package Manager (RPM). Un altro scenario comune è che trovi un pezzo di software che desideri utilizzare, ma non c'è RPM per esso. Questo articolo mostra come creare RPM per applicazioni di terze parti.
I prerequisiti includono:
- Hai una conoscenza di base su come utilizzare RPM per interrogare i pacchetti e installare o eliminare i pacchetti. In caso contrario, prima familiarizza con questi concetti e poi torna qui per divertirti.
- Hai installato Make, Git, GCC e Java, poiché ti serviranno per completare gli esercizi qui inclusi. Non è obbligatorio, ma sarebbe bello se ti eserciti mentre vado avanti.
Per installare Make, GCC, Java 11 e Git utilizzando il gestore di pacchetti DNF, esegui:
$ sudo dnf install \
make git gcc-10 \
java-11-openjdk-headless
Per questo esempio, utilizzerò un benchmark Java che mi piace della NASA:NAS Parallel Benchmarks (NPB3.0). Ho preso questo codice e ho creato un fork, aggiungendo solo una build migliorata usando Gradle. Ecco i passaggi.
Passaggio 1:scrivi un file delle specifiche dello scheletro
$ rpmdev-newspec --output ~/rpmbuild/SPECS/NPB.spec \
--type minimal
/home/josevnz/rpmbuild/SPECS/npb.spec created;
type minimal, rpm version >= 4.16.
Il file risultante è simile al seguente:
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]>
-
Quindi, rimuovi i seguenti tag da questo file di scheletro, poiché non si applicano a questa attività:
- %autoconfigurazione: Decomprimerai il software da solo senza patch
- %configura e %make_build: Utilizzerai invece Gradle
Installa i prerequisiti, Java e 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
Ora sei pronto per modificare le spec
file.
[ Ottieni altri suggerimenti scaricando il foglio cheat per gli script della shell di Bash. ]
Fase 2:compila i blocchi di costruzione per l'RPM Java
Dopo diverse modifiche, come l'aggiunta di Gradle come parte della build, hai:
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
Le spec
il file è pesantemente commentato e puoi vedere come ho usato il tar.gz
originale file senza alcuna modifica e aggiunto un nuovo sistema di compilazione, oltre a due script wrapper (testAIIS e testAIIW) per eseguire il codice Java dopo l'installazione.
Quindi, crea il nuovo 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
Fase 3:installa il tuo RPM personalizzato
Con il tuo RPM creato, ora puoi installarlo:
$ 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%]
L'output indica il successo:
/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
Ulteriori informazioni
Il pacchetto di software con RPM, che sia il tuo o l'applicazione open source di qualcun altro, può sembrare all'inizio intimidatorio, ma con un po' di pazienza ci arriverai in men che non si dica. Quando riscontri problemi, troverai anche i modi adeguati per migliorare il tuo codice. Di seguito sono riportate alcune risorse e consigli finali:
- Fatti un grande favore e ricevi una copia della Guida all'imballaggio RPM scritta da Adam Miller, Maxim Svistunov e Marie Doleželová. È molto completo e ben organizzato. Seriamente, fallo ora; è così buono.
- Anche la guida ufficiale all'imballaggio RPM e la guida RPM Fedora sono piene di dettagli; tienili un segnalibro lontano.
- Usa rpmlint. Rimarrai sorpreso da quante piccole cose puoi prendere e riparare prima di spedire i tuoi pacchi RPM.
- Non abbastanza? Fedora ha un elenco di trucchi che puoi usare per creare pacchetti di software.
- Sete di più? Dovresti assolutamente dare un'occhiata alle linee guida per l'imballaggio RPM.