GNU/Linux >> Belajar Linux >  >> Linux

7 Langkah Membangun Paket RPM dari Sumber di CentOS / RedHat

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.

  1. Mengeksekusi perintah dan makro yang disebutkan di bagian persiapan file spesifikasi.
  2. Memeriksa isi daftar file
  3. Mengeksekusi perintah dan makro di bagian build dari file spesifikasi. Makro dari daftar file juga dijalankan pada langkah ini.
  4. Membuat file paket biner
  5. 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:

  1. 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.
  2. %prep – Di bagian ini, kami menyiapkan perangkat lunak untuk proses pembangunan. Semua build sebelumnya dihapus selama proses ini dan file sumber (.tar) diperluas, dll.
  3. 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.
  4. %description – bagian deskripsi biasanya berisi deskripsi tentang paket.
  5. %build – Ini adalah bagian yang bertanggung jawab untuk melakukan build. Biasanya bagian %build adalah skrip sh.
  6. %install – bagian % install juga dijalankan sebagai skrip sh seperti %prep dan %build. Ini adalah langkah yang digunakan untuk instalasi.
  7. %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.
  8. %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

Linux
  1. Cara Mendaftar File yang Diinstal Dari Paket RPM atau DEB di Linux

  2. Cara Mengkompilasi Brotli dari Sumber di CentOS 7

  3. Cara Membangun Paket Dari Sumber Menggunakan CheckInstall

  1. Perintah RPM

  2. Kapan Seseorang Harus Mengkompilasi Dan Menginstal Dari Sumber?

  3. CentOS / RedHat :Panduan pemula untuk mencatat administrasi file

  1. 4 langkah untuk membuat pengguna Linux dari file csv dengan Ansible

  2. Bagaimana Menemukan Paket Mana yang Dapat Dieksekusi atau File di RedHat/CentOS/Fedora?

  3. Menggunakan Jenkins BUILD NUMBER dalam file spesifikasi RPM