GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie man Open-Source-Anwendungen als RPMs verpackt

Kürzlich habe ich über das Packen Ihrer eigenen Software mit dem Red Hat Package Manager (RPM) geschrieben. Ein weiteres häufiges Szenario ist, dass Sie eine Software finden, die Sie verwenden möchten, für die es jedoch kein RPM gibt. Dieser Artikel zeigt Ihnen, wie Sie RPMs für Anwendungen von Drittanbietern erstellen.

Zu den Voraussetzungen gehören:

  • Sie haben grundlegende Kenntnisse darüber, wie Sie RPM verwenden, um Pakete abzufragen und Pakete zu installieren oder zu löschen. Wenn nicht, machen Sie sich zuerst mit diesen Konzepten vertraut und kommen Sie dann zum Spaß hierher zurück.
  • Sie haben Make, Git, GCC und Java installiert, da Sie diese benötigen, um die hier enthaltenen Übungen abzuschließen. Es ist nicht erforderlich, aber es wäre schön, wenn Sie üben, während ich mich bewege.

Um Make, GCC, Java 11 und Git mit dem DNF-Paketmanager zu installieren, führen Sie Folgendes aus:

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

Für dieses Beispiel verwende ich einen Java-Benchmark, den ich von der NASA mag:NAS Parallel Benchmarks (NPB3.0). Ich habe diesen Code genommen und einen Fork erstellt, wobei ich nur einen verbesserten Build mit Gradle hinzugefügt habe. Hier sind die Schritte.

Schritt 1:Schreiben Sie eine Skeleton-Spezifikationsdatei

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

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

Die resultierende Datei sieht folgendermaßen aus:

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

Entfernen Sie als Nächstes die folgenden Tags aus dieser Skelettdatei, da sie für diese Aufgabe nicht gelten:

  • %autosetup: Sie entpacken die Software selbst ohne Patches
  • %configure und %make_build: Sie verwenden stattdessen Gradle

Installieren Sie die Voraussetzungen, Java und 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

Jetzt können Sie die spec ändern Datei.

[ Holen Sie sich weitere Tipps, indem Sie den Spickzettel für Bash-Shell-Skripts herunterladen. ]

Schritt 2:Füllen Sie die Bausteine ​​für das Java-RPM aus

Nach mehreren Änderungen, wie dem Hinzufügen von Gradle als Teil des Builds, haben Sie:

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 

Die spec Datei ist stark kommentiert, und Sie können sehen, wie ich die ursprüngliche tar.gz verwendet habe unverändert und fügte ein neues Build-System hinzu, plus zwei Wrapper-Skripte (testAIIS und testAIIW), um den Java-Code nach der Installation auszuführen.

Als nächstes erstellen Sie das neue 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

Schritt 3:Installieren Sie Ihr benutzerdefiniertes RPM

Nachdem Sie Ihr RPM erstellt haben, können Sie es jetzt installieren:

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

Die Ausgabe zeigt den Erfolg an:

/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

Weitere Informationen

Das Paketieren von Software mit RPM – ob es sich um Ihre eigene oder die Open-Source-Anwendung eines anderen handelt – mag auf den ersten Blick einschüchternd aussehen, aber mit ein wenig Geduld werden Sie es im Handumdrehen schaffen. Wenn Sie auf Probleme stoßen, finden Sie auch geeignete Möglichkeiten, Ihren Code zu verbessern. Nachfolgend finden Sie einige Ressourcen und abschließende Empfehlungen:

  • Tun Sie sich selbst einen großen Gefallen und besorgen Sie sich ein Exemplar des RPM Packaging Guide, geschrieben von Adam Miller, Maxim Svistunov und Marie Doleželová. Es ist sehr vollständig und gut organisiert. Im Ernst, tun Sie es jetzt; es ist so gut.
  • Der offizielle RPM-Verpackungsleitfaden und der Fedora-RPM-Leitfaden sind ebenfalls voller Details; halten Sie sie ein Lesezeichen fern.
  • Verwenden Sie rpmlint. Sie werden überrascht sein, wie viele kleine Dinge Sie auffangen und reparieren können, bevor Sie Ihre RPM-Pakete versenden.
  • Nicht genug? Fedora hat eine Liste mit Tricks, die Sie beim Packen von Software anwenden können.
  • Durstig nach mehr? Sie sollten sich unbedingt die RPM-Paketierungsrichtlinien ansehen.

Linux
  1. Meine Linux-Geschichte:Wie ein einflussreicher Sicherheitsentwickler mit Open Source begann

  2. Wie eine Kommunalverwaltung zu Open Source migrierte

  3. So packen Sie Python-Anwendungen für Linux

  4. So öffnen Sie Appimage unter Linux

  5. So erstellen Sie Pakete aus der Quelle mit CheckInstall

So installieren Sie Open Source osTicket unter Ubuntu 20.04

So öffnen Sie ein Linux-Terminalfenster

So deinstallieren Sie WINE-Anwendungen

So öffnen Sie eine PDF-Datei im Linux-Terminal

So installieren Sie RStudio Server Open Source unter Ubuntu 20.04 LTS

So installieren Sie ein soziales Open-Source-Netzwerk unter Ubuntu 16.04