LFS: Tentang Cross-compilation
Dalam proses build Linux From Scratch (LFS), salah satu tahap penting adalah cross-compilation. Meski dilakukan di sistem yang sama, tujuannya bukan lintas arsitektur, tapi untuk menjamin kebersihan lingkungan build.
Cross-compiling adalah proses compile code program pada satu sistem (host) untuk dieksekusi pada sistem yang berbeda (target). Contohnya jika kita meng-compile aplikasi Android (ARM) dari PC (x86_64).
Nah tapi kan PC kita buat build dan ngejalanin LFS itu sama, kenapa harus cross-compile? hal ini untuk menjamin bahwa semua tools yang dibuat bebas dari pengaru sistem host. Dengan teknik ini build tools tidak akan menggunakan library atau tool host secara tidak sengaja dan semua disusun dari awal, pakai toolchain yang kita buat sendiri. Sehingga hasilnya jadi lebih konsisten dan portable
Cross-compile di LFS
di LFS kita melakukan semacam fake cross-compilation yang tujuannya adalah memastikan build tool tidak bergantung pada sistem host (misal Ubuntu, Fedora, Arch, dll) dan menghindari link ke library host yang membuat sistem target tidak pure. Hal ini dapat dilakukan dengan:
- Mengganti triplet host (
LFS_TGT). Contohnya
x86_64-pc-linux-gnu diganti menjadi x86_64-lfs-linux-gnu
- Gunakan
--with-sysrootuntuk set root directory ke sistem LFS (bukan ke root host asli)
Tiga Tahap Compile
| Stage | Build | Host | Target | Keterangan |
|---|---|---|---|---|
| 1 | cc1 |
pc | lfs | membangun cross-compiler menggunakan compiler dari sistem host (cc-pc)
|
| 2 | cc-lfs |
lfs (masih di-run dari pc) | lfs | Bangun compiler native untuk LFS, tapi tetap dijalankan di luar chroot. |
| 3 | cc-lfs |
lfs | lfs | Rebuild compiler dalam chroot LFS, dites, dan benar-benar jalan mandiri. |
- Stage 1: Masih di luar chroot, pakai compiler sistem.
- Stage 2: Masih di luar chroot, tapi kita sudah build toolchain lengkap untuk target LFS.
- Stage 3: Masuk ke chroot, semua build dan tes dilakukan dari dalam sistem LFS sendiri. Ini fase stabilisasi.
Chicken & Egg Paradox
Compiler C (gcc) perlu:
glibcuntuk standar library- Tapi
glibcbutuhlibgcc libstdc++juga butuhglibc
Lalu masalahnya adalah kita butuh glibc untuk libgcc,
tapi juga butuh libgcc untuk bisa compile glibc
Solusinya:
- Bangun versi terbatas
libgccdulu (tanpa fitur seperti threads, EH) - Pakai
cc1untuk compileglibc - Bangun
libstdc++pakaicc1, link kelibgccyang sudah rebuild.
Kesimpulan
Dengan pendekatan ini, kita memastikan bahwa semua tools yang digunakan dalam sistem LFS benar-benar self-contained dan tidak tergantung pada pustaka sistem host, menjamin portabilitas dan kestabilan ke depannya.