Build Sendiri Paket Arch Linux

Uji coba mem-build kustom SQLite di Arch Linux

Beberapa waktu lalu aku menjajal dua hosting SQLite serverless yang lagi ngetren: Cloudflare D1 dan Turso, layanan tersebut mematok biaya berdasarkan banyaknya baris terbaca dan data yang masuk ke dalam tabel. Mau tak mau kita harus membuat desain database dan kueri yang efisien untuk menghemat biaya.

SQLite sudah ada fitur untuk menganalisis banyaknya baris yang terbaca setiap kali mengeksekusi kueri SQL, fitur ini bisa dijadikan sebagai parameter keefisienan kueri SQL kita. Sayangnya, fitur ini tidak tersedia di SQLite hasil build-an normal di Arch Linux. Oleh karena itu, kita harus mem-build sendiri SQLite.

Sekarang, aku di sini mau membagikan panduan mem-build sendiri paket Arch Linux dengan SQLite sebagai contoh paket yang akan kita build.

Mengunduh Repositori#

Ada dua metode untuk mengunduh repositori paket dari Arch Linux.

Yang pertama, mengunduh repositori dengan git langsung. Menurut informasi dari ArchWiki, untuk mengunduh repositorinya cukup dengan:

git clone https://gitlab.archlinux.org/archlinux/packaging/packages/<nama paket>.git

Misal untuk paket SQLite:

git clone https://gitlab.archlinux.org/archlinux/packaging/packages/sqlite.git

Nama paket dan URL git-nya bisa kamu cari di laman daftar paket Arch Linux atau bisa melalui pacman -Ss <kata kunci>.

Yang kedua menggunakan perkakas pkgctl yang dapat diinstal dengan:

sudo pacman -S devtools

Cara mengunduhnya seperti ini kalau menggunakan pkgctl:

pkgctl repo clone --protocol=https sqlite

Mem-build & Menginstal Paket#

Setelah repositori paket terunduh, di dalam direktori paket yang telah diunduh, ada skrip Bash bernama PKGBUILD. File tersebut terdiri atas informasi build yang diperlukan untuk mem-build paket Arch Linux, jadi kalau mau membuat build kustom, modifikasi PKGBUILD-nya.

Karena aku di sini membutuhkan build-an SQLite dengan fitur sqlite3_stmt_scanstatus_v2(), jadi hanya perlu memodifikasi file PKGBUILD SQLite dan menambahkan opsi -DSQLITE_ENABLE_STMT_SCANSTATUS ke variabel CPPFLAGS.

Kemudian baru deh, mem-build paket dari Arch Linux dengan:

makepkg -s

Setelah proses build selesai, bakal muncul file berekstensi tar.zst disertai dengan nama paket dan versinya:

$ ls *.zst
lemon-3.47.2-1-x86_64.pkg.tar.zst
sqlite-3.47.2-1-x86_64.pkg.tar.zst
sqlite-analyzer-3.47.2-1-x86_64.pkg.tar.zst
sqlite-doc-3.47.2-1-x86_64.pkg.tar.zst
sqlite-tcl-3.47.2-1-x86_64.pkg.tar.zst

Langkah terakhir, instal file hasil build-an tadi dan tunggu hingga selesai.

pacman -U ./sqlite-3.47.2-1-x86_64.pkg.tar.zst

Sedikit tambahan, ada versi yang lebih ringkas untuk mem-build sekaligus menginstalnya (bisa kamu jadikan sebagai alternatif):

makepkg -si

Uji Coba Hasil Build-an#

SQLite punya fitur untuk mengecek opsi-opsi yang diaktifkan pada waktu peng-compile-an, untuk mengeceknya cukup dengan:

sqlite> PRAGMA compile_options;

Kalau ada ENABLE_STMT_SCANSTATUS di daftarnya, artinya kita berhasil membuat build kustom SQLite.

Sekarang, kita akan mencoba mengeksekusi kueri SQL untuk mengambil data dari tabel users pada saat sebelum dan setelah membuat indeks.

Sebelum itu, kita harus mengaktifkan scanstats agar informasi banyaknya baris yang terpindai ditampilkan setiap kali mengeksekusi kueri SQL.

.scanstats on

Sebelum membuat indeks:

sqlite> SELECT username FROM users WHERE username = 'pratikno';
QUERY PLAN (cycles=28876890 [100%])
`--SCAN users     (cycles=21798849 [75%] loops=1 rows=120405)

Hasil kueri SQL di atas jumlah baris yang terpindai ada sebanyak 120405 baris, jadi sangat tidak efisien kalau jumlah barisnya sangat banyak, yang membutuhkan banyak waktu serta biaya penggunaan layanan Cloudflare D1 dan Turso pun jadi semakin mahal. Supaya lebih efisien, kita bisa membuat indeks pada kolom username.

sqlite> CREATE INDEX users_username_idx ON username (username);

Ulangi kueri SQL tadi, yang sekarang ini jauh lebih ngebut dan hanya membutuhkan 1 kuota baca pada tabel.

sqlite> SELECT username FROM users WHERE username = 'pratikno';
QUERY PLAN (cycles=281757 [100%])
`--SEARCH users USING INDEX users_username_idx (username=?)     (cycles=73449 [26%] loops=1 rows=1)

Pembaruan Paket#

Kalau ada pembaruan paket dari pacman -Syu, hasil build-an paket akan digantikan dengan versi terbaru dari repositori resmi Arch Linux.

Untuk mencegah hal ini terjadi, kamu bisa menambahkan grup khusus supaya paket-paket tersebut tidak ikutan diperbarui kalau ada versi terbaru.

Caranya cukup tambahkan konfigurasi ini ke dalam file /etc/pacman.conf, nama grup bebas, contoh ini menggunakan nama grup modified.

/etc/pacman.conf
IgnoreGroup = modified

Kemudian tambahkan nama grup modified ke file PKGBUILD paket yang ingin di-build sendiri:

PKGBUILD
groups=('modified')

Komitkan hasil modifikasi PKGBUILD supaya masuk ke dalam histori git.

git add PKGBUILD
git commit -m 'enable stmt_scanstatus'

Jadi, kalau ada pembaruan paket, tinggal lakukan rebase seperti ini dan ulangi proses build dari awal:

git pull --rebase

Terakhir, demi menjaga kestabilan sistem, setiap ada pembaruan paket Arch Linux, paket hasil build-an sendiri harus diperbarui juga.