GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana mengemas aplikasi open source sebagai RPM

Baru-baru ini, saya menulis tentang mengemas perangkat lunak Anda sendiri dengan Red Hat Package Manager (RPM). Skenario umum lainnya adalah Anda menemukan perangkat lunak yang ingin Anda gunakan, tetapi tidak ada RPM untuk itu. Artikel ini menunjukkan cara membuat RPM untuk aplikasi pihak ketiga.

Prasyarat meliputi:

  • Anda memiliki pengetahuan dasar tentang cara menggunakan RPM untuk menanyakan paket dan menginstal atau menghapus paket. Jika belum, kenali dulu konsep-konsep ini, lalu kembali ke sini untuk bersenang-senang.
  • Anda telah menginstal Make, Git, GCC, dan Java, karena Anda memerlukannya untuk menyelesaikan latihan yang disertakan di sini. Itu tidak wajib, tapi alangkah baiknya jika kamu berlatih saat aku bergerak.

Untuk menginstal Make, GCC, Java 11, dan Git menggunakan pengelola paket DNF, jalankan:

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

Untuk contoh ini, saya akan menggunakan benchmark Java yang saya suka dari NASA:NAS Parallel Benchmarks (NPB3.0). Saya mengambil kode ini dan membuat garpu, hanya menambahkan build yang ditingkatkan menggunakan Gradle. Berikut langkah-langkahnya.

Langkah 1:Tulis file spesifikasi kerangka

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

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

File yang dihasilkan terlihat seperti ini:

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

Selanjutnya, hapus tag berikut dari file kerangka ini, karena tidak berlaku untuk tugas ini:

  • %penyetelan otomatis: Anda akan membongkar sendiri perangkat lunak tanpa tambalan
  • %konfigurasi dan %make_build: Anda akan menggunakan Gradle sebagai gantinya

Instal prasyaratnya, Java dan 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 

Sekarang Anda siap untuk mengubah spec berkas.

[ Dapatkan kiat lainnya dengan mengunduh lembar contekan skrip shell Bash. ]

Langkah 2:Isi blok pembangun untuk RPM Java

Setelah beberapa perubahan, seperti menambahkan Gradle sebagai bagian dari build, Anda memiliki:

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 file banyak dikomentari, dan Anda dapat melihat bagaimana saya menggunakan tar.gz original asli file tanpa perubahan apa pun dan menambahkan sistem build baru di atasnya, ditambah dua skrip pembungkus (testAIIS dan testAIIW) untuk menjalankan kode Java setelah diinstal.

Selanjutnya, buat RPM baru:

$ 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 

Langkah 3:Instal RPM khusus Anda

Dengan RPM yang Anda buat, sekarang Anda dapat menginstalnya:

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

Output menunjukkan keberhasilan:

/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 

Pelajari lebih lanjut

Mengemas perangkat lunak dengan RPM—apakah itu milik Anda sendiri atau aplikasi open source milik orang lain—mungkin terlihat menakutkan pada awalnya, tetapi dengan sedikit kesabaran, Anda akan segera sampai di sana. Saat Anda mengalami masalah, Anda juga akan menemukan cara yang tepat untuk meningkatkan kode Anda. Berikut adalah beberapa sumber dan rekomendasi akhir:

  • Tolong bantu diri Anda sendiri dan dapatkan salinan Panduan Pengemasan RPM yang ditulis oleh Adam Miller, Maxim Svistunov, dan Marie Doleželová. Ini sangat lengkap dan terorganisir dengan baik. Serius, lakukan sekarang; itu bagus.
  • Panduan Pengemasan RPM resmi dan panduan RPM Fedora juga lengkap dengan detailnya; jauhkan mereka dari bookmark.
  • Gunakan rpmlint. Anda akan terkejut betapa banyak hal kecil yang dapat Anda tangkap dan perbaiki sebelum mengirimkan paket RPM Anda.
  • Tidak cukup? Fedora memiliki daftar trik yang dapat Anda gunakan saat mengemas perangkat lunak.
  • Haus ingin lebih? Anda harus melihat pedoman Pengemasan RPM.

Linux
  1. My Linux Story:Bagaimana pengembang keamanan yang berpengaruh memulai di open source

  2. Cara membuka Appimage di Linux

  3. Cara membuat paket RPM Linux

  1. Bagaimana pemerintah daerah bermigrasi ke open source

  2. Cara mengemas aplikasi Python untuk Linux

  3. Cara Membangun Paket Dari Sumber Menggunakan CheckInstall

  1. Bagaimana saya menggunakan Stream Deck di Linux dengan alat sumber terbuka

  2. Cara menggunakan pkgsrc di Linux

  3. Debian – Bagaimana Mengetahui Repositori Sumber Paket Di Debian?