sas.lantip.info

Membuat Paket RPM

by salman

RPM LogoBanyak program baru belum berbentuk RPM, tapi masih berupa kode sumber. Di lain pihak, banyak pengguna GNU/Linux menginginkan paket binari dalam format RPM. Anda dapat berjasa dengan membuatkan RPM-nya.

Setelah merasakan kemudahan-kemudahan yang ditawarkan oleh manajemen paket RPM, mungkin Anda bertanya-tanya apakah sulit membuat paket software dalam format RPM? Jawaban untuk pertanyaan pendek ini bisa bervariasi, tergantung pada seberapa kompleks software yang akan kita paket.

Apa yang perlu kita siapkan untuk membuat paket dengan RPM? Cek daftar berikut:

  • Sumber program yang akan kita paket, biasanya dalam format terkompresi nama_file.tar.gz.
    Program RPM, secara default program ini sudah terinstalasi di distribusi berbasis RPM semacam RedHat, CentOS, Mandrake, dan SuSE.
  • Paket-paket development yang diperlukan untuk proses kompilasi, ini tergantung keperluan software yang akan dipaket. Misalnya gcc, make, install, dan file-file library yang diperlukan untuk melakukan kompilasi program yang akan kita paket.
  • File spec yang diperlukan untuk proses pembuatan paket RPM. Akan kita bahas bagaimana cara membuat file ini dalam tulisan ini.

Pembahasan kita akan berkisar pada cara membuat file spec, karena di file inilah tersedia informasi yang diperlukan untuk proses kompilasi, instalasi paket, dan pembuatan paket.

Saya menggunakan distribusi CentOS 5.1 dalam pembahasan ini.

Paket Pendukung

Sebelum kita membuat file spec, harus kita yakinkan terlebih dahulu bahwa paket-paket pendukung sudah terinstalasi. Yang pertama adalah program RPM. Jalankan perintah ini.

$ rpm -qa|grep rpm

Jika keluar tanggapan kurang lebih seperti di bawah ini berarti sudah ada program RPM.

redhat-rpm-config-8.0.45-22.el5.centos
rpm-devel-4.4.2-47.el5
rpm-libs-4.4.2-47.el5
rpm-build-4.4.2-47.el5
rpm-4.4.2-47.el5
rpm-python-4.4.2-47.el5

Lihat nama paket rpm-4.4.2-47.el5 dan rpm-build-4.4.2-47.el5. Jika anda memakai distribusi RedHat, CentOS, Mandrake, atau SuSe, pasti sudah terinstalasi, hanya versinya yang mungkin berbeda.

Paket-paket pengembangan software juga harus sudah terinstalasi di sistem. Komponen utama biasanya adalah kompiler, misalnya gcc. Seperti cara di atas, kita bisa memeriksa apakah kompiler bahasa C kita sudah terinstalasi.

$ rpm -qa|grep cc

Tanggapan yang diharapkan kurang lebih begini:

gcc-4.1.2-14.el5
gcc-c++-4.1.2-14.el5
byacc-1.9-29.2.2
libgcc-4.1.2-14.el5
compat-gcc-34-c++-3.4.6-4
gcc-java-4.1.2-14.el5
psacct-6.3.2-41.1
compat-gcc-34-g77-3.4.6-4
compat-gcc-34-3.4.6-4
gcc-gfortran-4.1.2-14.el5
pam_ccreds-3-5
ccid-1.0.1-6.el5

Paket-paket pengembangan software yang harus terinstalasi tergantung pada software yang akan dipaket. Untuk mengetahui paket apa saja yang diperlukan, cara paling mudah adalah kita kompilasi sesuai dengan petunjuk kompilasi dari dokumentasi kode sumber yang akan kita paket. Jika proses kompilasi secara manual berjalan lancar, satu langkah sudah pasti tidak bermasalah.

Membuat File Spec

Sebagai contoh, kita akan memaket sofware kompiler bahasa assembler untuk keluarga microcontroller 8051. Dapatkan paket source code-nya dari Internet. Nama paket source code dalam contoh ini adalah as31_beta3.tar.gz.

Untuk membuat file spec kita harus mengetahui file-file apa saja yang akan diinstalasi oleh software yang bersangkutan. Informasi ini bisa kita dapatkan dengan beberapa cara, yaitu:

  • Dari file dokumentasi paket source code.
  • Dari file Makefile paket source code, bisa kita lihat file-file yang akan diinstalasi.
  • Dengan cara mengompilasi secara manual dan melihat perbedaan setelah dan sebelum instalasi.

Kita kembali dengan contoh kita, kita coba lihat isi dari file as31_beta3.tar.gz. Jalankan perintah berikut.

$ tar xzvf as31_beta3.tar.gz
as31/
as31/Makefile
as31/README
as31/as31.1
as31/as31.c
as31/as31.h
as31/as31_gtk.c
as31/emitter.c
as31/lexer.c
as31/parser.y
as31/run.c
as31/symbol.c
as31/tests/
as31/tests/extra.asm
as31/tests/paulmon1.asm
as31/tests/paulmon2.asm
as31/tests/paulmon1.ref
as31/tests/paulmon2.ref
as31/tests/extra.ref

File as31/README menjelaskan bahwa proses instalasi hanya perlu menjalankan perintah make dan menyalin file-file binary hasil dari proses ini ke direktori /usr/local/bin.

Selanjutnya kita coba proses kompilasi manual untuk memeriksa apakah ada paket-paket pendukung yang belum diinstalasi.

$ cd as31
$ make

Proses ini harus berjalan tanpa hambatan. Jika ada software yang diperlukan belum terinstalasi, maka kita harus menginstalasi terlebih dahulu agar proses kompilasi berjalan lancar.

Dari proses kompilasi ternyata dihasillkan hanya dua file binary, yaitu as31 dan as31_gtk. File-file ini akan kita salin ke direktori /usr/local/bin.

Salin file as31_beta3.tar.gz ke direktori /usr/src/redhat/SOURCES/.

# cp as31_beta3.tar.gz /usr/src/redhat/SOURCES/

Jika Anda memakai distribusi Slackware direktori ini adalah /usr/src/rpm/SOURCES/. Untuk distribusi yang lain bisa Anda lihat dengan perintah rpm -ql dari paket rpm-build. Struktur direktori untuk membangun paket RPM pada distribusi RedHat seperti ini.

/usr/src/redhat/
 |— BUILD
 |— RPMS
 | |— athlon
 | |— i386
 | |— i486
 | |— i586
 | |— i686
 | `— noarch
 |— SOURCES
 |— SPECS
 `— SRPMS

Sekarang waktunya kita membuat file spec-nya. Lihat contoh file spec berikut.

Summary: Assembler untuk Mikrokontroler keluarga 8051.
Name: as31
Packager: Salman AS
Version: beta3
Release: 1
Url: http://www.pjrc.com/tech/8051/
Source: as31_beta3.tar.gz
Copyright: GPL
Group: Development/Languages
Buildroot: /tmp
%description
Assembler source code program assembly untuk keluarga mikrokontroler 8051.
%prep
%setup -n as31 -q
%build
make
%install
mkdir -p %buildroot/usr/local/bin/
install as31 %buildroot/usr/local/bin/
install as31_gtk %buildroot/usr/local/bin/
%files
/usr/local/bin/as31
/usr/local/bin/as31_gtk
%doc README tests/*

Simpan file spec ini di direktori /usr/src/redhat/SPECS/. Kemudian jalankan rpm dengan option -ba, seperti ini:

# rpm -ba /usr/src/redhat/SPECS/as31.spec

Bagian awal dari spec file disebut Preamble.

Summary: Assembler untuk Mikrokontroler keluarga 8051.
Name: as31
Packager: Salman AS
Version: beta3
Release: 1
Url: http://www.pjrc.com/tech/8051/
Source: as31_beta3.tar.gz
Copyright: GPL
Group: Development/Languages
Buildroot: /tmp
%description
Assembler source code program assembly untuk keluarga mikrokontroler 8051.

Bagian ini berisi informasi-informasi yang akan didapatkan oleh user jika dia melakukan perintah rpm -q. Direktif Name, Version, dan Release nantinya akan dipakai menjadi nama file paket RPM yang dihasilkan. Version adalah versi software. Sedangkan Release adalah versi dari paket RPM yang dihasilkan. Group akan dipakai untuk menentukan klasifikasi paket software yang akan kita buat. Sedangkan Buildroot adalah direktori di mana proses pembangunan paket akan dijalankan. Kemudian sisa Direktif yang lain adalah informasi yang telah jelas dari makna direktifnya sendiri.

Bagian selanjutnya adalah Prep atau persiapan. Perintah-perintah di bagian ini akan dijalankan sebelum proses kompilasi dijalankan.

%prep
%setup -n as31 -q

Dalam bagian ini disediakan macro %setup yang akan mengurai paket source code dalam format tar.gz dan pindah ke direktori hasil proses penguraian file tersebut. Makro di atas make maksudnya adalah source code jika diurai hasilnya terdapat dalam direktori as31. Nama ini kita dapatkan jika kita mengurai paket secara manual dengan perintah tar. Option -q berfungsi untuk melakukan proses dengan menampilkan pesan seminimal mungkin. Untuk mengetahui proses pelaksanaan bagian Prep ini, jalankan perintah berikut.

# rpm -bp /usr/src/redhat/SPECS/as31.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.1343
+ umask 022
+ cd /usr/src/redhat/BUILD
+ cd /usr/src/redhat/BUILD
+ rm -rf as31
+ tar -xf -
+ /bin/gzip -dc /usr/src/redhat/SOURCES/as31_beta3.tar.gz
+ STATUS=0
+ `[` 0 -ne 0 `]`
+ cd as31
++ /usr/bin/id -u
+ `[` 0 = 0 `]`
+ /bin/chown -Rhf root .
++ /usr/bin/id -u
+ `[` 0 = 0 `]`
+ /bin/chgrp -Rhf root .
+ /bin/chmod -Rf a+rX,g-w,o-w .
+ exit 0

Dari output perintah di atas dapat dilihat bahwa makro %setup paling tidak menjalankan perintah:

  • Masuk ke direktori /usr/src/redhat/BUILD.
  • Menghapus direktori source code jika sebelumnya sudah ada direktori yang mempunyai nama yang sama dengan paket yang akan dikompilasi.
  • Mengurai paket source code dari direktori /usr/src/redhat/SOURCES/, nama file diambil dari direktif Source dalam bagian Pramble.
  • Pindah direktori ke direktori kode sumber software.
  • Mengubah kepemilikan, group, dan hak akses dari file dan direktori dalam source code.

Bagian selanjutnya adalah Build. Dalam bagian ini proses kompilasi akan dijalankan.

%build
make

Isikan perintah-perintah shell yang diperlukan di sini. Perintah yang kita perlukan, untuk contoh kita, hanya satu perintah saja, yaitu make yang dijalankan dalam direktori utama kode sumber.

Untuk menjalankan semua perintah dalam file spec sampai tahap kompilasi bisa kita jalankan perintah:

# rpm -bc /usr/src/redhat/SPECS/as31.spec

Bagian Install akan menjalankan proses instalasi software hasil kompilasi. Biasanya di bagian ini berisi satu perintah, make install. Tapi karena paket yang kita contohkan di sini tidak tersedia fasilitas ini, tapi dari dokumentasinya diketahui instalasi hanya menyalin dua file ke direktori /usr/local/bin/, maka bisa kita berikan perintah instalasi langsung.

%install
mkdir -p %buildroot/usr/local/bin/
install as31 %buildroot/usr/local/bin/
install as31_gtk %buildroot/usr/local/bin/

String %buildroot akan diganti dengan /tmp, seperti disebutkan dalam bagian Preamble. Jadi perintah di atas, bisa dijelaskan kira-kira seperti ini,

  • Buat direktori di /tmp/usr/local/bin/.
  • Instalasi file as31 dan as31_gtk ke direktori /tmp/usr/local/bin/.

Jika kita hanya ingin menjalankan perintah sampai tahap instalasi saja, tidak dilanjutkan dengan pembuatan paket, perintah yang diperlukan adalah:

# rpm -bi /usr/src/redhat/SPECS/as31.spec

Langkah terakhir adalah menentukan file-file apa saja yang akan dimasukkan ke dalam paket RPM beserta dokumentasinya. Informasi ini disebutkan dalam bagian files dan doc. Lihat cuplikan berikut.

%files
/usr/local/bin/as31
/usr/local/bin/as31_gtk
%doc README tests/*

Dari contoh ini file yang akan dimasukkan ke dalam paket RPM adalah as31 dan as31_gtk yang terdapat dalam direktori /usr/local/bin/. Tentu saja file tersebut diambil dari path relatif /tmp yang disebutkan di %buildroot. Dan dokumentasi diambil dari file README dan semua file dari direktori tests.

Membangun Paket Binari dan Source

Untuk membangun paket dalam format binari jalankan perintah ini:

# rpm -bb /usr/src/redhat/SPECS/as31.spec

Untuk membangun paket dalam format kode sumber, perintahnya:

# rpm -bs /usr/src/redhat/SPECS/as31.spec

Sedangkan untuk membangun keduanya, perintahnya:

# rpm -ba /usr/src/redhat/SPECS/as31.spec

Hasil dari ketiga perintah di atas adalah file paket RPM dalam format binari terdapat di direktori /usr/src/redhat/RPMS/i386/ dan paket RPM dalam format kode sumber di direktori /usr/src/redhat/SRPMS/.

Sebagai penutup untuk mengujinya, Anda bisa menginstalasi paket software binari dengan perintah ini:

# rpm -ivh /usr/src/redhat/RPMS/i386/as31-beta3-1.i386.rpm

dan untuk menginstalasi paket dalam format source code:

# rpm -ivh /usr/src/redhat/SRPMS/as31-beta3-1.src.rpm

Anda juga bisa membangun ulang paket dengan perintah:

# rpm --rebuild /usr/src/redhat/SRPMS/as31-beta3-1.src.rpm

E.O.A