Cara membuat paket rpm

Cara membuat paket rpm

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

Persyaratan Perangkat Lunak dan Konvensi Baris Perintah Linux
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, ketika
RPM 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 dimana RPM 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:
    1. Mengekstrak kode sumber program yang ingin kami kemas ke Builddir direktori
    2. Beralih ke direktori yang diekstraksi
    3. Menetapkan izin file yang sesuai di dalamnya
  • Itu %make_build Makro digunakan di %membangun bagian specfile, dan pada dasarnya menjalankan membuat 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 berjalan buat instal dengan Destdir 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