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.