Cara membuat paket rpm
- 3713
- 88
- Ian Parker
RPM adalah manajer paket dan format paket yang digunakan oleh banyak distribusi Linux seperti Fedora, Red Hat dan Centos, untuk mengelola dan mendistribusikan perangkat lunak dalam bentuk biner. Dalam tutorial ini kita akan melihat cara membangun dan mengemas aplikasi sederhana.
Dalam tutorial ini Anda akan belajar:
- Apa konsep dasar di balik proses pembangunan rpm.
- Apa lingkungan pembangunannya.
- Apa itu Specfile.
- Cara menggunakan makro di dalam specfile.
- Cara menginstal dependensi build.
- Cara membuat specfile.
- Cara membangun paket rpm.
Persyaratan dan konvensi perangkat lunak yang digunakan
Kategori | Persyaratan, konvensi atau versi perangkat lunak yang digunakan |
---|---|
Sistem | Fedora 29 |
Perangkat lunak | N/a |
Lainnya | Akses istimewa ke sistem Linux Anda sebagai root atau melalui sudo Perintah untuk menginstal paket yang diperlukan. |
Konvensi | # - mensyaratkan perintah linux yang diberikan untuk dieksekusi dengan hak istimewa root baik secara langsung sebagai pengguna root atau dengan menggunakan sudo memerintah$ - mensyaratkan perintah Linux yang diberikan untuk dieksekusi sebagai pengguna biasa |
Konsep Dasar RPM
Menginstal, menghapus, memperbarui, (dalam satu kata, mengelola) perangkat lunak adalah tugas penting untuk setiap sistem operasi. Ketika manajer paket tidak ada, satu -satunya cara untuk menginstal program adalah menyusun kode sumbernya, dan menempatkan file yang dihasilkan di tempat yang sesuai pada sistem file. Melacak dependensi dari setiap bagian kode benar -benar sulit dan memakan waktu. Kemudian manajer paket diperkenalkan, dan semuanya menjadi lebih mudah.
Setiap distribusi Linux modern memiliki, saat ini, manajer paketnya: Debian dan penggunaan turunannya dpkg
, ketikaRPM
digunakan dalam keluarga distribusi Red Hat. Perangkat lunak disediakan pra-kompilasi dalam bentuk paket
, yang pada dasarnya adalah arsip terkompresi yang mengandung metadata tentang versi perangkat lunak, ketergantungannya dan kemungkinan konflik dengan paket lain.
Dalam tutorial ini kita akan melihat cara membuat paket RPM mulai dari kode sumber aplikasi. Aplikasi yang akan kami kemas feh
, Penampil Gambar Baris Perintah Sederhana: Cukup kecil dan memiliki sedikit ketergantungan. Sebelum mulai membangun paket pertama kami, ada beberapa konsep penting yang harus kami pahami.
Lingkungan pembangunan
Akar pohon lingkungan rpm membangun adalah rpmBuild
direktori, yang berisi 6 subdirektori: MEMBANGUN
, Buildroot
, Rpms
, Sumber
, SPESIFIKASI
Dan SRPMS
. Kita akan melihat bagaimana mungkin untuk menghasilkan lingkungan ini dengan meluncurkan perintah sederhana; Untuk saat ini, mari kita sebutkan peran direktori ini. Berikut adalah representasi dari pohon yang bekerja:
RPMBuild |- Build |- Buildroot |- RPMS |- Sumber |- Spesifikasi |- SRPMS
Masing -masing direktori ini, memiliki peran khusus dalam proses pembangunan:
- Itu
MEMBANGUN
Direktori adalah tempat kode sumber program yang ingin kami kemas dibangun - Itu
Buildroot
Direktori adalah tempat file yang dihasilkan dari kompilasi perangkat lunak di dalam direktori build disalin, mencerminkan struktur sistem target di dalam subdirektori dengan paket mame:
Dalam kasus kami, biner "feh" yang akan dipasang di/usr/bin
akan dilaporkan sebagai buildroot/feh-3.0-1.FC29.x86_64/usr/bin. - Itu
Rpms
direktori, adalah dimanaRPM
Paket dihasilkan: Setiap rpm akan ditempatkan di subdirektori
dinamai arsitekturnya, atau,Noarch
Jika tidak spesifik arsitektur. - Itu
Sumber
Direktori meng -host kode sumber terkompresi dari perangkat lunak yang ingin kami kemas, seringkali di bawah bentuk tarball dari file zip. - Itu
SPESIFIKASI
direktori, adalah tempat kami meletakkan.spec
file dengan instruksi untuk membangun paket kami: kami akan menganalisis struktur file ini sebentar lagi. - Itu
SRPMS
Direktori adalah setara dengan RPM, tetapi untuk sumber RPM. Paket khusus ini berisi kode sumber asli aplikasi, tambalan akhirnya, dan specfile yang digunakan untuk membangun paket.
File spesifikasi
File di mana semua instruksi dan informasi yang diperlukan untuk membangun paket rpm ditentukan adalah .spec
mengajukan. Specfile berisi, di antara yang lain, membangun dependensi
(Perangkat lunak yang diperlukan untuk mengkompilasi program yang ingin kami kemas), Ketergantungan runtime
(Perpustakaan yang diperlukan agar program berjalan dengan benar) dan Ommands yang harus dieksekusi untuk mengkompilasi perangkat lunak.
File ini disusun oleh dua bagian makro: a pembukaan
dan tubuh
. Di masing -masing bagian ini, instruksi yang berbeda dapat ditentukan. Mari kita lihat beberapa dari mereka. Itu pembukaan
Bagian dapat berisi instruksi berikut:
-
- Nama: Basename dari paket (ini harus sesuai dengan nama file spesifikasi)
- Versi: kapan: Versi hulu dari perangkat lunak yang dikemas
- Melepaskan: Nomor rilis paket
- Lisensi: Lisensi yang digunakan untuk perangkat lunak yang ingin kami kemas
- Url: URL hulu dari perangkat lunak
- Sumber0: URL langsung atau jalur kode sumber terkompresi perangkat lunak (Tarball atau File Zip)
- Buildarch: Arsitektur paket: Jika tidak ada arsitektur yang ditentukan, salah satu dari sistem host akan digunakan
- Buildrequires: Ketergantungan yang diperlukan untuk membangun perangkat lunak
- Memerlukan: Ketergantungan yang diperlukan untuk menjalankan perangkat lunak
Itu tubuh
Bagian Specfile, biasanya berisi bagian berikut:
- %keterangan: Deskripsi multi-line opsional dari perangkat lunak yang dikemas
- %persiapan: Perintah yang diperlukan untuk menyiapkan kode sumber (misalnya, perintah yang diperlukan untuk mengekstrak tarball)
- %membangun: Perintah yang diperlukan untuk membangun perangkat lunak
- %Install: Perintah yang diperlukan untuk menyalin file yang dihasilkan dari proses build ke
Buildroot
direktori - %file: Daftar file yang disediakan oleh paket, yang akan diinstal pada sistem
Makro
Untuk memudahkan pekerjaan kami, di dalam specfile, kami dapat menggunakan beberapa makro yang memungkinkan kami merujuk banyak hal yang berguna dan secara otomatis melakukan tugas -tugas tertentu. Pertama -tama kami memiliki RPM Directory Macro
yang membiarkan referensi menggunakan direktori lingkungan build kita; Kita harus selalu menggunakannya alih -alih jalur langsung:
- %_ topdir: Referensi makro ini
rpmBuild
direktori - %_ builddir: Referensi
MEMBANGUN
direktori di dalam pohon build kami - %_ rpmdir: Referensi jalan dari
Rpms
direktori - %_ Sourcedir: Makro ini dievaluasi ke jalur
Sumber
direktori - %_ specdir: Makro yang mewakili jalur
SPESIFIKASI
direktori - %_ srcrpmdir: Referensi jalan
SRPMS
direktori - %_ buildrootdir: Referensi jalan dari
Buildroot
direktori
Makro lain mari kita merujuk direktori terpenting dalam sistem file mesin kami, misalnya:
- %_ sysconfigdir: The
/dll
direktori - %_awalan: The
/usr
direktori - %_ bindir: The
/usr/bin
direktori - %_ mandir: Jalan menuju
/usr/share/man
direktori
Yang di atas, bukan daftar lengkap, tetapi memberi Anda ide. Selain itu kami juga dapat menggunakan satu set makro yang melakukan tugas tertentu. Untuk memperluas definisi makro, dan untuk melihat isinya, kita dapat menggunakan RPM -Eval
perintah, yang mengambil makro sebagai argumennya. Berikut adalah beberapa contoh makro yang sering digunakan:
- Itu
%mempersiapkan
makro, digunakan di%konfigurasi
Bagian Specfile, dan pada dasarnya melakukan tindakan berikut:- Mengekstrak kode sumber program yang ingin kami kemas ke
Builddir
direktori - Beralih ke direktori yang diekstraksi
- Menetapkan izin file yang sesuai di dalamnya
- Mengekstrak kode sumber program yang ingin kami kemas ke
- Itu
%make_build
Makro digunakan di%membangun
bagian specfile, dan pada dasarnya menjalankanmembuat
Perintah dengan serangkaian opsi yang telah ditentukan, untuk mengkompilasi kode sumber perangkat lunak. Jika kami memperluasnya, kami dapat memeriksa perintah yang dijalankannya:$ rpm --eval "%make_build"/usr/bin/make -o -j4
- Itu
%make_install
Makro, sebaliknya, digunakan di%Install
bagian dari file dan berjalanbuat instal
denganDestdir
parameter, digunakan untuk menginstruksikan perintah untuk menginstal file yang dikompilasi relatif ke direktori yang diberikan alih -alih sistem nyata/
:$ rpm --eval "%make_install"/usr/bin/make install destdir =/home/egdoc/rpmbuild/buildroot/%name-%versi-%rilis.x86_64 instal = "/usr/bin/install -p"
Cara membuat paket rpm langkah demi langkah instruksi
Sekarang kami mempelajari konsep dasar proses pembangunan paket, kami dapat melihat cara membuat lingkungan build kami dan paket RPM pertama kami. Mari Buat Paket Kita.
Pasang dependensi build
Sebagai hal pertama, kita perlu menginstal RPMDevTools
, ditambah dependensi yang diperlukan untuk membangun feh
:
$ sudo dnf menginstal rpmdevtools gcc membuat imlib2-devel libjpeg-devel-libpng-devel-devel-devel-devel libxinerama-devel libexif-devel \ perl-test-command perl-test-harness libcurl-devel
Setelah paket diinstal, kami dapat menghasilkan lingkungan build kami. Yang harus kita lakukan adalah meluncurkan perintah berikut:
$ rpmdev-setuptree
Pada titik ini rpmBuild
direktori, dan semua subdirektori yang kita lihat sebelumnya, harus dibuat. Langkah selanjutnya adalah menulis specfile kami.
Buat Specfile
Kami membuat specfile dengan editor teks favorit kami, dan menyimpannya di SPESIFIKASI
direktori dengan nama paket yang sama. Berikut adalah bagaimana specfile minimal seharusnya:
Nama: Feh Versi: 3.0 Rilis: 1%?Dist Ringkasan: Penampil Gambar Baris Perintah Cepat Menggunakan Imlib2 Lisensi: MIT URL: http: // feh.FinalRewind.org Source0: http: // feh.FinalRewind.org/feh-%versi.ter.bz2 BuildRequires: gcc BuildRequires: imlib2-devel BuildRequires: libcurl-devel BuildRequires: libjpeg-devel BuildRequires: libpng-devel BuildRequires: libXt-devel BuildRequires: libXinerama-devel BuildRequires: libexif-devel BuildRequires: perl-Test-Command BuildRequires: perl- Test -Harness %Deskripsi Penampil Gambar Baris Perintah Cepat Menggunakan IMLIB2 %Prep %Setup -Q %Build %Make_Build %Instal %Make_install prefix = %_ prefix %file/usr/bin/feh/usr/lib/debug /usr/bin/feh-3.0-1.FC29.x86_64.DEBUG/USR/SHARE/APLIKASI/FEH.desktop/usr/share/doc/feh/penulis/usr/share/doc/feh/changelog/usr/share/doc/feh/readme.md/usr/share/doc/feh/todo/usr/share/doc/feh/contoh/tombol/usr/share/doc/feh/contoh/find-lowres/usr/share/doc/feh/contoh/kunci/ usr/share/doc/feh/contoh/tema/usr/share/feh/font/hitam.Gaya/usr/share/feh/font/menu.style/usr/share/feh/font/yudit.ttf/usr/share/feh/gambar/feh.png/usr/share/feh/gambar/feh.svg/usr/share/feh/gambar/menubg_default.png/usr/share/icons/hicolor/48x48/apps/feh.png/usr/share/icons/hicolor/scalable/apps/feh.svg/usr/share/man/man1/feh.1.GZ
Ayo menganalisisnya. Pertama, kami menentukan beberapa informasi dasar tentang perangkat lunak yang ingin kami kemas: namanya dan versi hulu, lisensi, lokasi halaman utama proyek, dan tautan langsung ke tarball kode sumber, lalu kami menyatakan membangun dependensi
menggunakan Buildrequires
. Daftar dependensi dapat direpresentasikan sebagai ruang atau daftar inline terpisah koma, tetapi demi keterbacaan kami menyatakan satu ketergantungan per baris, mengulangi Buildrequires
petunjuk.
Setelah mendeklarasikan ketergantungan yang diperlukan untuk membangun perangkat lunak, kami memberikan deskripsi singkat di %keterangan
bagian, dan lebih dari itu melanjutkan ke bagian terpenting dari specfile: instruksi untuk menyiapkan, membangun dan menginstal perangkat lunak, masing -masing di %persiapan
, %membangun
Dan %Install
bagian.
Dalam %persiapan
bagian, menyediakan Pengaturan %-Q
Makro sudah cukup: seperti yang dikatakan sebelumnya, makro ini akan menjalankan perintah yang diperlukan untuk membongkar sumber tarball dan menempatkan direktori yang diekstraksi ke dalam MEMBANGUN
map.
Itu %membangun
Bagian adalah tempat kami menentukan perintah yang harus dijalankan untuk membangun kode sumber. Bahkan di sini, yang harus kami gunakan hanyalah %make_build
makro, yang menjalankan membuat
Perintah dengan opsi yang kita lihat sebelumnya, ke direktori hosting kode sumber yang tidak dibongkar dari aplikasi yang ingin kita kemas.
Dalam %Install
bagian, kami menggunakan makro lain, %make_install
, memberikan juga AWALAN
parameter, mengaturnya ke %_awalan
, yang akan diperluas ke /usr
. Perintah yang dihasilkan akan menyebabkan file yang dihasilkan oleh kompilasi kode sumber, ditempatkan di "root palsu", diatur dengan Destdir
parameter yang terkandung dalam makro. Karena di %make_install
makro, "destdir" diatur ke /home/egdoc/rpmbuild/buildroot/%name-%Versi-%rilis.x86_64
, File akan diinstal di bawah: /home/egdoc/rpmbuild/buildroot/%name-%Versi-%rilis.x86_64/usr
.
Akhirnya, kami menyediakan, di %file
bagian, daftar file yang akan diinstal oleh paket kami. Daftar ini kemudian dapat diperiksa dengan menjalankan rpm -qlp/path/to/the/rpm
perintah atau, jika paket sudah diinstal, hanya dengan berjalan RPM -QL PackageName
.
Dapatkan sumber dan bangun paket RPM
Sekarang file spesifikasi kami akhirnya siap, kami dapat membangun kami RPM
. Anda mungkin memperhatikan bahwa kami belum mengunduh sumber tarball "feh": tidak perlu melakukan ini secara manual, karena kami dapat menggunakan Spectool
memerintah:
$ spectool -g -r ~/rpmbuild/specs/feh.Spec Mendapatkan http: // feh.FinalRewind.org/feh-3.0.ter.BZ2 TO/HOME/EGDOC/RPMBUILD/SUMBER/FEH-3.0.ter.bz2 % total % menerima % xferd kecepatan rata-rata waktu waktu saat ini unggah dload total menghabiskan kecepatan kiri 100 185 100 185 0 0 898 0-:-:--:----:-:-- -898 100 2057K 100 2057K 0 0 1988K 0 0:00:01 0:00:01-:-:-4191K
Perintah ini akan mengunduh sumber yang kami rujuk dengan URL di dalam specfile, di direktori yang sesuai dari pohon kerja kami: ~/rpmBuild/sumber
. Dengan sumber -sumber yang ada, kita dapat membangun rpm kita: yang harus kita lakukan adalah meluncurkan rpmBuild
perintah, dan berikan jalur ke specfile. Saat diluncurkan dengan -bb
Opsi, RPMBuild hanya akan membangun a Paket biner
: Jika kita ingin menghasilkan juga a Sumber RPM
, kita harus menggunakan -ba
Sebaliknya (Konsultasikan dengan RPMBuild Manpage untuk gambaran umum opsi yang memungkinkan).
Satu hal yang sangat penting untuk diingat adalah bahwa perintah RPMBuild tidak boleh diluncurkan dengan izin root: saat melakukannya, bahkan kesalahan sederhana dalam specfile dapat menghasilkan efek yang tidak diinginkan pada sistem kami. Mari Jalankan RPMBuild:
$ rpmbuild -bb ~/rpmbuild/specs/feh.spec
Output dari operasi yang dilakukan akan dicetak di layar, dan, jika semuanya berjalan seperti yang diharapkan, paket RPM akan dihasilkan di dalam Rpms
direktori.
Kesimpulan
Dalam tutorial ini kami mempelajari konsep -konsep mendasar yang terlibat dalam penciptaan paket RPM. Kami belajar beberapa makro, dan cara membangun a .spec
file, yang berisi semua instruksi yang diperlukan untuk proses pembangunan. Kami juga memberikan contoh, bangunan, dan kemasan yang sebenarnya feh
, Penampil Gambar Baris Perintah Sederhana. Saya menyarankan Anda untuk berkonsultasi dengan panduan pengemasan Red Hat resmi untuk memperluas konsep lebih lanjut yang disebutkan dalam tutorial ini.
Tutorial Linux Terkait:
- Pengantar Otomatisasi Linux, Alat dan Teknik
- Hal -hal yang harus diinstal pada ubuntu 20.04
- Menguasai loop skrip bash
- Mint 20: Lebih baik dari Ubuntu dan Microsoft Windows?
- Hal -hal yang harus dilakukan setelah menginstal ubuntu 20.04 FOSSA FOSSA Linux
- Cara memperbarui centos
- Unduh Linux
- Ubuntu 20.04 Panduan
- Cara bermigrasi dari centos ke almalinux
- File Konfigurasi Linux: 30 Teratas Paling Penting
- « Bagaimana cara unrar di ubuntu
- Cara meluncurkan proses eksternal dengan python dan modul subproses »