Terkadang Anda mungkin memiliki akses ke kode sumber aplikasi open source tetapi mungkin tidak memiliki file RPM untuk menginstalnya di sistem Anda.
Dalam situasi tersebut, Anda dapat mengkompilasi kode sumber dan menginstal aplikasi dari kode sumber, atau membuat file RPM dari kode sumber sendiri, dan menggunakan file RPM untuk menginstal aplikasi.
Mungkin juga ada situasi di mana Anda ingin membuat paket RPM khusus untuk aplikasi yang Anda kembangkan.
Tutorial ini menjelaskan cara membuat paket RPM dari kode sumber.
Untuk membuat RPM, Anda memerlukan kode sumber, yang biasanya berarti file tar terkompresi yang juga menyertakan file SPEC.
File SPEC biasanya berisi instruksi tentang cara membuat RPM, file apa yang merupakan bagian dari paket, dan di mana harus diinstal.
RPM melakukan tugas berikut selama proses pembuatan.
- Mengeksekusi perintah dan makro yang disebutkan di bagian persiapan file spesifikasi.
- Memeriksa isi daftar file
- Mengeksekusi perintah dan makro di bagian build dari file spesifikasi. Makro dari daftar file juga dijalankan pada langkah ini.
- Membuat file paket biner
- Membuat file paket sumber
Setelah RPM menjalankan langkah-langkah di atas, RPM akan membuat file paket biner dan file paket sumber.
File paket biner terdiri dari semua file sumber bersama dengan informasi tambahan untuk menginstal atau menghapus paket.
Biasanya diaktifkan dengan semua opsi untuk menginstal paket yang spesifik untuk platform. File paket biner berisi aplikasi lengkap atau pustaka fungsi yang dikompilasi untuk arsitektur tertentu. Paket sumber biasanya terdiri dari file tar terkompresi asli, file spesifikasi dan patch yang diperlukan untuk membuat file paket biner.
Mari kita lihat cara membuat paket source dan BIN RPM sederhana menggunakan file tar.
Jika Anda baru mengenal paket rpm, pertama-tama Anda mungkin ingin memahami cara menggunakan perintah rpm untuk menginstal, meningkatkan, dan menghapus paket di CentOS atau RedHat.
1. Instal Paket rpm-build
Untuk membuat file rpm berdasarkan spesifikasi file yang baru saja kita buat, kita perlu menggunakan perintah rpmbuild.
perintah rpmbuild adalah bagian dari paket rpm-build. Instal seperti yang ditunjukkan di bawah ini.
# yum install rpm-build
rpm-build tergantung pada paket berikut. Jika Anda belum menginstalnya, yum akan secara otomatis menginstal dependensi ini untuk Anda.
elfutils-libelf rpm rpm-libs rpm-python
2. Direktori Pembuatan RPM
rpm-build akan secara otomatis membuat struktur direktori berikut yang akan digunakan selama RPM build.
# ls -lF /root/rpmbuild/ drwxr-xr-x. 2 root root 4096 Feb 4 12:21 BUILD/ drwxr-xr-x. 2 root root 4096 Feb 4 12:21 BUILDROOT/ drwxr-xr-x. 2 root root 4096 Feb 4 12:21 RPMS/ drwxr-xr-x. 2 root root 4096 Feb 4 12:21 SOURCES/ drwxr-xr-x. 2 root root 4096 Feb 4 12:21 SPECS/ drwxr-xr-x. 2 root root 4096 Feb 4 12:21 SRPMS/
Catatan:Struktur direktori di atas adalah untuk CentOS dan RedHat saat menggunakan paket rpmbuild. Anda juga dapat menggunakan direktori /usr/src/redhat, tetapi Anda perlu mengubah parameter topdir yang sesuai selama pembuatan rpm. Jika Anda melakukan ini di SuSE Enterprise Linux, gunakan direktori /usr/src/packages.
Jika Anda ingin menggunakan struktur direktori Anda sendiri alih-alih /root/rpmbuild, Anda dapat menggunakan salah satu opsi berikut:
- Gunakan opsi –buildroot dan tentukan direktori kustom selama rpmbuild
- Tentukan parameter topdir dalam file rpmrc atau file rpmmacros.
3. Unduh File Tar Sumber
Selanjutnya, unduh file tar sumber untuk paket yang ingin Anda buat dan simpan di bawah direktori SOURCES.
Untuk contoh ini, saya telah menggunakan kode sumber aplikasi open source icecase, yang merupakan perangkat lunak server untuk streaming multi-media. Namun, langkah-langkahnya sama persis untuk membangun RPM untuk aplikasi lain. Anda hanya perlu mengunduh kode sumber yang sesuai untuk RPM yang Anda coba buat.
# cd /root/rpmbuild/SOURCES/ # wget http://downloads.xiph.org/releases/icecast/icecast-2.3.3.tar.gz # ls -l -rw-r--r--. 1 root root 1161774 Jun 11 2012 icecast-2.3.3.tar.gz
4. Buat File SPEC
Pada langkah ini, kita mengarahkan RPM dalam proses build dengan membuat file spec. File spesifikasi biasanya terdiri dari delapan bagian berbeda berikut:
- Pembukaan – Bagian pembukaan berisi informasi tentang paket yang sedang dibangun dan mendefinisikan dependensi apa pun pada paket tersebut. Secara umum, pembukaan terdiri dari entri, satu entri per baris, yang dimulai dengan tag diikuti oleh titik dua, dan kemudian beberapa informasi.
- %prep – Di bagian ini, kami menyiapkan perangkat lunak untuk proses pembangunan. Semua build sebelumnya dihapus selama proses ini dan file sumber (.tar) diperluas, dll.
- Satu hal penting lainnya adalah memahami bahwa ada makro yang telah ditentukan sebelumnya yang tersedia untuk melakukan berbagai opsi pintasan untuk membangun rpm. Anda mungkin menggunakan makro ini saat mencoba membangun paket kompleks apa pun. Dalam contoh di bawah ini, saya telah menggunakan makro bernama %setup yang menghapus semua build sebelumnya, membuka tar file sumber, dan mengubah kepemilikan file. Anda juga dapat menggunakan skrip sh di bawah bagian %prep untuk melakukan tindakan ini tetapi makro %setup menyederhanakan proses dengan menggunakan skrip sh yang telah ditentukan sebelumnya.
- %description – bagian deskripsi biasanya berisi deskripsi tentang paket.
- %build – Ini adalah bagian yang bertanggung jawab untuk melakukan build. Biasanya bagian %build adalah skrip sh.
- %install – bagian % install juga dijalankan sebagai skrip sh seperti %prep dan %build. Ini adalah langkah yang digunakan untuk instalasi.
- %files – Bagian ini berisi daftar file yang merupakan bagian dari paket. Jika file-file tersebut bukan bagian dari bagian %files maka file tersebut tidak akan tersedia dalam paket. Jalur lengkap diperlukan dan Anda dapat mengatur atribut dan kepemilikan file di bagian ini.
- %clean – Bagian ini menginstruksikan RPM untuk membersihkan file apa pun yang bukan bagian dari area build normal aplikasi. Katakanlah sebagai contoh, Jika aplikasi membuat struktur direktori sementara di /tmp/ sebagai bagian dari build-nya, itu tidak akan dihapus. Dengan menambahkan skrip sh di bagian %clean, direktori dapat dihapus setelah proses pembuatan selesai.
Berikut adalah file SPEC yang saya buat untuk aplikasi icecast untuk membangun file RPM.
# cat /root/rpmbuild/SPECS/icecast.spec Name: icecast Version: 2.3.3 Release: 0 Summary: Xiph Streaming media server that supports multiple formats. Group: Applications/Multimedia License: GPL URL: http://www.icecast.org/ Vendor: Xiph.org Foundation [email protected] Source: http://downloads.us.xiph.org/releases/icecast/%{name}-%{version}.tar.gz Prefix: %{_prefix} Packager: Karthik BuildRoot: %{_tmppath}/%{name}-root %description Icecast is a streaming media server which currently supports Ogg Vorbis and MP3 audio streams. It can be used to create an Internet radio station or a privately running jukebox and many things in between. It is very versatile in that new formats can be added relatively easily and supports open standards for commuincation and interaction. %prep %setup -q -n %{name}-%{version} %build CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix} --mandir=%{_mandir} --sysconfdir=/etc make %install [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT make DESTDIR=$RPM_BUILD_ROOT install rm -rf $RPM_BUILD_ROOT%{_datadir}/doc/%{name} %clean [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %doc README AUTHORS COPYING NEWS TODO ChangeLog %doc doc/*.html %doc doc/*.jpg %doc doc/*.css %config(noreplace) /etc/%{name}.xml %{_bindir}/icecast %{_prefix}/share/icecast/* %changelog In this file, under % prep section you may noticed the macro “%setup -q -n %{name}-%{version}”. This macro executes the following command in the background. cd /usr/src/redhat/BUILD rm -rf icecast gzip -dc /usr/src/redhat/SOURCES/icecast-2.3.3.tar.gz | tar -xvvf - if [ $? -ne 0 ]; then exit $? fi cd icecast cd /usr/src/redhat/BUILD/icecast chown -R root.root . chmod -R a+rX,g-w,o-w .
Di bagian %build, Anda akan melihat CFLAGS dengan opsi konfigurasi yang menentukan opsi yang dapat digunakan selama instalasi RPM dan opsi awalan , direktori wajib yang ada untuk instalasi dan direktori sysconfig di mana file sistem perlu disalin .
Di bawah baris tersebut, Anda akan melihat utilitas make yang menentukan daftar file yang perlu dikompilasi dan dikompilasi dengan tepat.
Di bagian % install, baris di bawah %install yang mengatakan "make install" digunakan untuk mengambil binari yang dikompilasi dari langkah sebelumnya dan menginstal atau menyalinnya ke lokasi yang sesuai sehingga dapat diakses.
5. Buat File RPM menggunakan rpmbuild
Setelah file SPEC siap, Anda dapat mulai membangun rpm Anda dengan perintah rpm –b. Opsi –b digunakan untuk melakukan semua fase proses build. Jika Anda melihat kesalahan selama fase ini, maka Anda harus menyelesaikannya sebelum mencoba lagi. Kesalahan biasanya berupa dependensi perpustakaan dan Anda dapat mengunduh dan menginstalnya jika diperlukan.
# cd /root/rpmbuild/SPECS # rpmbuild -ba icecast.spec Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.Kohe4t + umask 022 + cd /root/rpmbuild/BUILD + cd /root/rpmbuild/BUILD + rm -rf icecast-2.3.3 + /usr/bin/gzip -dc /root/rpmbuild/SOURCES/icecast-2.3.3.tar.gz + /bin/tar -xf - + STATUS=0 + '[' 0 -ne 0 ']' + cd icecast-2.3.3 + /bin/chmod -Rf a+rX,u+w,g-w,o-w . + exit 0 Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.ynm7H7 + umask 022 + cd /root/rpmbuild/BUILD + cd icecast-2.3.3 + CFLAGS='-O2 -g' + ./configure --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for a thread-safe mkdir -p... /bin/mkdir -p checking for gawk... gawk checking whether make sets $(MAKE)... yes checking whether to enable maintainer-specific portions of Makefiles... no checking for gcc... gcc .. .. .. Wrote: /root/rpmbuild/SRPMS/icecast-2.3.3-0.src.rpm Wrote: /root/rpmbuild/RPMS/x86_64/icecast-2.3.3-0.x86_64.rpm Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.dzahrv + umask 022 + cd /root/rpmbuild/BUILD + cd icecast-2.3.3 + '[' /root/rpmbuild/BUILDROOT/icecast-2.3.3-0.x86_64 '!=' / ']' + rm -rf /root/rpmbuild/BUILDROOT/icecast-2.3.3-0.x86_64 + exit 0
Catatan:Jika Anda menggunakan SuSE Linux, jika rpmbuild tidak tersedia, coba gunakan “rpm -ba” untuk membangun paket rpm.
Selama pemasangan rpmbuild di atas, Anda mungkin melihat pesan kesalahan berikut:
Kesalahan 1:Konfigurasi XSLT tidak dapat ditemukan
checking for xslt-config... no configure: error: XSLT configuration could not be found error: Bad exit status from /var/tmp/rpm-tmp.8J0ynG (%build) RPM build errors: Bad exit status from /var/tmp/rpm-tmp.8J0ynG (%build)
Solusi 1:Instal libxstl-devel
Untuk xslt-config, Anda perlu menginstal paket libxstl-devel seperti yang ditunjukkan di bawah ini.
yum install libxstl-devel
Ini juga akan menginstal dependensi berikut:
- libgcrypt
- libgcrypt-devel
- libgpg-error-devel
Kesalahan 2:Kesalahan libvorbis
checking for libvorbis... configure: error: must have Ogg Vorbis v1.0 or above installed error: Bad exit status from /var/tmp/rpm-tmp.m4Gk3f (%build)
Solusi 2:Instal libvorbis-devel
Untuk Ogg Vorbis v1.0, instal paket libvorbis-devel seperti yang ditunjukkan di bawah ini:
yum install libvorbis-devel
Ini juga akan menginstal dependensi berikut:
- libogg
- libogg-devel
- libvorbis
6. Verifikasi File Sumber dan RPM Biner
Setelah rpmbuild selesai, Anda dapat memverifikasi rpm sumber dan rpm biner dibuat di direktori di bawah ini.
# ls -l /root/rpmbuild/SRPMS/ -rw-r--r-- 1 root root 1162483 Aug 25 15:46 icecast-2.3.3-0.src.rpm # ls -l /root/rpmbuild/RPMS/x86_64/ -rw-r--r--. 1 root root 349181 Feb 4 12:54 icecast-2.3.3-0.x86_64.rpm
7. Instal File RPM untuk Verifikasi
Sebagai langkah terakhir, Anda dapat menginstal rpm biner untuk memverifikasi bahwa penginstalan berhasil dan semua dependensi telah diselesaikan.
# rpm -ivvh /root/rpmbuild/RPMS/x86_64/icecast-2.3.3-0.x86_64.rpm D: ============== /root/rpmbuild/RPMS/x86_64/icecast-2.3.3-0.x86_64.rpm D: loading keyring from pubkeys in /var/lib/rpm/pubkeys/*.key D: couldn't find any keys in /var/lib/rpm/pubkeys/*.key D: loading keyring from rpmdb D: opening db environment /var/lib/rpm cdb:mpool:joinenv D: opening db index /var/lib/rpm/Packages rdonly mode=0x0 D: read h# 210 Header sanity check: OK D: added key gpg-pubkey-c105b9de-4e0fd3a3 to keyring D: Using legacy gpg-pubkey(s) from rpmdb D: Expected size: 349181 = lead(96)+sigs(180)+pad(4)+data(348901) D: Actual size: 349181 D: ========== relocations D: added binary package [0] D: found 0 source and 1 binary packages D: ========== +++ icecast-2.3.3-0 x86_64/linux 0x2 .. ..
Setelah instalasi di atas, Anda dapat memverifikasi bahwa file rpm yang dibuat khusus telah berhasil diinstal seperti yang ditunjukkan di bawah ini.
# rpm -qa icecast icecast-2.3.3-0.x86_64