GNU/Linux >> Znalost Linux >  >> Linux

Jak zabalit aplikace s otevřeným zdrojovým kódem jako RPM

Nedávno jsem psal o balení vašeho vlastního softwaru pomocí Red Hat Package Manager (RPM). Dalším běžným scénářem je, že najdete software, který chcete použít, ale není pro něj RPM. Tento článek ukazuje, jak vytvořit RPM pro aplikace třetích stran.

Předpoklady zahrnují:

  • Máte základní znalosti o tom, jak používat RPM k dotazování na balíčky a instalaci nebo mazání balíčků. Pokud ne, seznamte se nejprve s těmito koncepty a pak se sem vraťte a pobavte se.
  • Máte nainstalované Make, Git, GCC a Java, protože je budete potřebovat k dokončení zde uvedených cvičení. Není to povinné, ale bylo by hezké, kdybyste cvičili, když se pohybuji.

Chcete-li nainstalovat Make, GCC, Java 11 a Git pomocí správce balíčků DNF, spusťte:

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

Pro tento příklad použiji benchmark Java, který se mi líbí od NASA:NAS Parallel Benchmarks (NPB3.0). Vzal jsem tento kód a vytvořil vidličku a přidal pouze vylepšené sestavení pomocí Gradle. Zde jsou kroky.

Krok 1:Napište soubor specifikace kostry

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

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

Výsledný soubor vypadá takto:

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

Dále z tohoto souboru kostry odeberte následující značky, protože se na tuto úlohu nevztahují:

  • %autosetup: Software si rozbalíte sami bez záplat
  • %configure a %make_build: Místo toho použijete Gradle

Nainstalujte předpoklady, Java a 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 

Nyní jste připraveni změnit spec soubor.

[ Získejte další tipy stažením cheatu pro skriptování prostředí Bash. ]

Krok 2:Vyplňte stavební bloky pro Java RPM

Po několika změnách, jako je přidání Gradle jako součásti sestavení, máte:

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  

spec soubor je silně komentovaný a můžete vidět, jak jsem použil původní tar.gz soubor bez jakýchkoliv změn a přidali k tomu nový systém sestavení plus dva obalové skripty (testAIIS a testAIIW) pro spuštění kódu Java po jeho instalaci.

Dále vytvořte nové 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 

Krok 3:Nainstalujte si vlastní RPM

Po vytvoření RPM jej nyní můžete nainstalovat:

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

Výstup označuje úspěch:

/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 

Další informace

Balení softwaru pomocí RPM – ať už se jedná o vaši vlastní nebo cizí aplikaci s otevřeným zdrojovým kódem – může zpočátku vypadat děsivě, ale s trochou trpělivosti se k tomu dostanete během chvilky. Když narazíte na problémy, najdete také správné způsoby, jak zlepšit svůj kód. Níže jsou uvedeny některé zdroje a závěrečná doporučení:

  • Udělejte si velkou laskavost a získejte výtisk RPM Packaging Guide od Adama Millera, Maxima Svistunova a Marie Doleželové. Je velmi kompletní a dobře organizovaná. Vážně, udělej to hned; je to tak dobré.
  • Oficiální příručka RPM Packaging Guide a příručka Fedora RPM jsou také plné podrobností; mějte je jako záložku.
  • Použijte rpmlint. Budete překvapeni, kolik drobností dokážete zachytit a opravit před odesláním svých RPM balíčků.
  • Nestačí? Fedora má seznam triků, které můžete použít při balení softwaru.
  • Žízníte víc? Určitě byste se měli podívat na pokyny pro balení RPM.

Linux
  1. Můj příběh o Linuxu:Jak vlivný vývojář zabezpečení začal s open source

  2. Jak sestavit balíčky ze zdroje pomocí CheckInstall

  3. Debian – Jak poznat zdrojové úložiště balíčku v Debianu?

  1. Jak místní vláda migrovala na open source

  2. Jak zabalit aplikace Python pro Linux

  3. Jak vytvořit balíček RPM pro Linux

  1. Jak používám Stream Deck na Linuxu s open source nástroji

  2. Jak používat pkgsrc na Linuxu

  3. Jak otevřít Appimage v Linuxu