Membangun ulang sebuah paket biner dibutuhkan dalam beberapa kondisi. Dalam kondisi tertentu, administrator membutuhkan fitur perangkat lunak yang mensyaratkan untuk di-compile dari source, dengan opsi kompilasi tertentu; pada kasus lain, perangkat yang dipaketkan dalam Debian yang terpasang tidak cukup anyar. Pada kasus kedua, administrator umumnya akan mem-build paket yang lebih terkini diambil dari Debian dengan versi yang lebih baru — seperti
Testing atau bahkan
Unstable — sehingga paket yang lebih baru ini dapat bekerja pada distribusi
Stable mereka; operasi ini disebut dengan “backporting”. Seperti biasa, perlu waspada sebelum memutuskan melakukan tugas seperti itu, dengan memeriksa apakah sebelumnya sudah pernah dilakukan — pencarian cepat pada Debian Package Tracker untuk paket tersebut akan mengungkap informasi itu.
.
15.1.1. Mendapatkan Sumber
Membangun kembali paket Debian dimulai dengan mendapatkan kode sumbernya. Cara termudah adalah dengan menggunakan perintah
apt-get source nama-paket
. Perintah ini memerlukan baris
deb-src
di berkas
/etc/apt/sources.list
, dan berkas indeks terbaru (mis.
apt-get update
). Kondisi ini seharusnya sudah terpenuhi jika Anda mengikuti instruksi dari bab yang berhubungan dengan konfigurasi APT (lihat
Bagian 6.1, “Mengisi Berkas sources.list
”). Namun, perhatikan bahwa Anda akan mengunduh paket sumber dari versi Debian yang disebutkan dalam baris
deb-src
.
Jika Anda membutuhkan versi lainnya, Anda dapat mengunduh secara manual dari cermin Debian atau dari situs web. Hal ini melibatkan dua atau tiga berkas (dengan ekstensi *.dsc
— untuk Debian Source Control — *.tar.comp
, dan terkadang *.diff.gz
atau *.debian.tar.comp
— comp dengan alternatif gz
, bz2
, atau xz
tergantung perkakas kompresi yang digunakan), lalu jalankan perintah dpkg-source -x file.dsc
. Jika berkas *.dsc
dapat diakses langsung pada URL tertentu, terdapat cara yang lebih sederhana untuk mengambilnya, yaitu dengan perintah dget URL
. Perintah ini (yang dapat ditemukan di paket devscripts) mengambil berkas *.dsc
pada alamat yang diberikan, menganalisis isinya, dan secara otomatis mengambil berkas atau berkas-berkas yang diacu di dalamnya. Sekali semua telah diunduh, itu memverifikasi integritas paket sumber yang diunduh memakai dscverify
, dan itu mengekstrak paket sumber (kecuali bila opsi -d
atau --download-only
dipakai. Ring kunci Debian diperlukan, kecuali bila opsi -u
diberikan.
15.1.2. Membuat Perubahan
Mari kita gunakan paket samba sebagai contoh.
$
apt source samba
Reading package lists... Done
NOTICE: 'samba' packaging is maintained in the 'Git' version control system at:
https://salsa.debian.org/samba-team/samba.git
Please use:
git clone https://salsa.debian.org/samba-team/samba.git
to retrieve the latest (possibly unreleased) updates to the package.
Need to get 12.3 MB of source archives.
Get:1 http://security.debian.org/debian-security bullseye-security/main samba 2:4.13.13+dfsg-1~deb11u3 (dsc) [4,514 B]
Get:2 http://security.debian.org/debian-security bullseye-security/main samba 2:4.13.13+dfsg-1~deb11u3 (tar) [11.8 MB]
Get:3 http://security.debian.org/debian-security bullseye-security/main samba 2:4.13.13+dfsg-1~deb11u3 (diff) [468 kB]
Fetched 12.3 MB in 3s (4,582 kB/s)
dpkg-source: info: extracting samba in samba-4.13.13+dfsg
dpkg-source: info: unpacking samba_4.13.13+dfsg.orig.tar.xz
dpkg-source: info: unpacking samba_4.13.13+dfsg-1~deb11u3.debian.tar.xz
dpkg-source: info: using patch list from debian/patches/series
dpkg-source: info: applying 07_private_lib
dpkg-source: info: applying bug_221618_precise-64bit-prototype.patch
dpkg-source: info: applying [...]
Sumber dari paket sekarang tersedia di dalam direktori dengan nama paket sumber berikut dengan versinya (samba-4.13.13+dfsg
); di sinilah kita akan bekerja untuk melakukan perubahan lokal.
Hal pertama yang perlu dilakukan adalah mengubah nomor versi paket, sehingga paket hasil rebuilt dapat dibedakan dari paket asalnya yang disediakan Debian. Dengan asumsi versi saat ini adalah
2:4.13.13+dfsg-1~deb11u3
, kita dapat membuat versi
2:4.13.13+dfsg-1~deb11u3+falcot1
, yang dengan jelas menandakan asal dari paket. Hal ini membuat nomor versi paket lebih tinggi dari yang disediakan Debian, sehingga paket akan dengan mudah terpasang sebagai pemutakhiran dari paket asalnya. Perubahan seperti ini paling baik dihasilkan menggunakan perintah
dch
(
Debian CHangelog) dari paket
devscripts.
$
cd 4.13.13+dfsg-1~deb11u3
$
dch --local +falcot
Perintah terakhir memanggil penyunting teks (
sensible-editor
— ini harus menjadi editor favorit Anda jika disebutkan di variabel lingkungan
VISUAL
atau
EDITOR
, dan penyunting default sebaliknya) untuk memungkinkan mendokumentasikan perbedaan yang dibawa oleh rebuild ini. Penyunting ini menunjukkan kepada kita bahwa
dch
sungguh mengubah berkas
debian/changelog
.
Saat perubahan pada opsi build diperlukan, perubahan perlu dibuat pada debian/rules
, yang mendorong langkah-langkah pada proses build. Pada kasus yang paling sederhana, baris terkait konfigurasi awal (./configure …
) atau pada build sesungguhnya ($(MAKE) …
atau make …
atau cmake …
atau …) dapat dengan mudah ditemukan. Jika perintah ini tidak dipanggil secara eksplisit, mereka merupakan efek samping dari perintah eksplisit lainnya, yang pada kasus tertentu mengacu pada dokumentasi mereka untuk mempelajari lebih lanjut bagaimana mengubah perilaku baku. Dengan paket-paket yang memakai dh
, Anda mungkin perlu menambah override untuk perintah dh_auto_configure
atau dh_auto_build
(lihat halaman manual masing-masing dan debhelper(7) untuk penjelasan tentang bagaimana mencapai ini).
Tergantung pada perubahan lokal pada paket, pemutakhiran bisa jadi dibutuhkan dalam berkas debian/control
, yang berisi deskripsi dari paket yang dihasilkan. Secara spesifik, berkas ini berisi baris Build-Depends
yang mengendalikan daftar dependensi yang perlu dipenuhi pada paket yang dibangun. Hal ini seringkali mengacu pada versi paket yang ada di dalam distribusi dari sumber paket asal, namun tidak tersedia di dalam distribusi yang digunakan untuk rebuild. Tidak ada cara otomatis untuk menentukan jika dependensi benar-benar dibutuhkan atau hanya disebutkan untuk menjamin bahwa build hanya dicoba dengan versi terbaru dari pustaka — ini merupakan satu-satunya cara untuk memaksa autobuilder untuk menggunakan versi paket yang diberikan selama proses build, hal inilah mengapa Debian maintainer seringkali menggunakan versi build-dependencies yang ketat.
Jika Anda tahu secara yakin bahwa build-dependencies terlalu ketat, Anda bebas untuk melonggarkannya secara lokal. Dengan membaca berkas yang mendokumentasikan standar membangun perangkat lunak — berkas ini sering disebut sebagai INSTALL
— akan membantu Anda mengetahui dependensi yang sesuai. Idealnya, semua dependensi harus dapat dipenuhi dari distribusi yang digunakan untuk rebuild; jika tidak, sebuah proses rekursif dimulai, yaitu saat paket yang disebutkan dalam field Build-Depends
harus di-backport sebelum paket target dapat di-backport. Beberapa paket bisa jadi tidak perlu di-backport, dan dapat di-install apa-adanya selama proses build (contoh yang jelas adalah debhelper). Perlu dicatat bahwa proses backport dapat dengan cepat menjadi kompleks jika Anda tidak hati-hati. Oleh karena itu, backport sedapat mungkin diminimalisir.
Saat semua perubahan yang diperlukan telah diterapkan pada sumber, kita dapat memulai membuat paket binari sesungguhnya (.deb
file). Semua proses ini dikelola oleh perintah dpkg-buildpackage
.
Contoh 15.1. Membangun ulang sebuah paket
$
dpkg-buildpackage -us -uc
[...]
Perintah sebelumnya dapat gagal jika bidang
Build-Depends
belum diperbarui, atau jika paket terkait tidak terpasang. Pada kasus seperti ini, mungkin untuk mengesampingkan kondisi ini dengan memberikan opsi
-d
ke
dpkg-buildpackage
. Namun, dengan secara eksplisit mengacuhkan dependensi ini akan berrisiko terjadi kegagalan pada tahap berikutnya. Lebih buruk lagi, paket bisa jadi terlihat di-build dengan benar namun tidak berjalan sebagaimana mestinya: beberapa program secara otomatis menonaktifkan beberapa fitur saat pustaka yang dibutuhkan tidak tersedia saat waktu build. Switch masih bisa sangat berguna jika Anda hanya ingin membuat paket sumber, yang seharusnya diteruskan ke lingkungan build yang bersih seperti yang dijelaskan di
LIHAT CEPAT Membangun paket di lingkungan chroot dan virtual.
Opsi lain yang digunakan dalam contoh di atas memastikan bahwa baik .dsc
(-us
) paket sumber maupun berkas .changes
(-uc
) yang dihasilkan tidak ditandatangani dengan kunci kriptografi pembuat paket setelah build berhasil.
Lebih sering, pengembang Debian menggunakan program dengan tingkat lebih tinggi seperti debuild
; ini menjalankan dpkg-buildpackage
seperti biasa, namun juga menambahkan invokasi dari program yang menjalankan pemeriksaan untuk memvalidasi paket terhadap Debian policy. Skrip ini juga membersihkan lingkungan sehingga variabel lingkungan lokal tidak “mengotori” paket yang di-build. Perintah debuild
adalah salah satu perkakas dalam keluarga devscripts, yang berbagi konsistensi dan konfigurasi yang sama untuk membuat pekerjaan pemelihara menjadi lebih mudah.