Mengganti Variabel CHOST
1.
Pendahuluan
Mengganti variabel CHOST merupakan masalah besar dan dapat merusak sistem
anda - jadi mengapa ada panduannya?
Ada beberapa situasi yang memaksa penggantian CHOST, misalnya jika anda ingin
melakukan upgrade ke glibc-2.4 yang hanya mendukung nptl sedangkan
CHOST anda adalah i386 yang tidak dapat menggunakan nptl. Pada situasi ini,
anda tidak memiliki banyak pilihan, dan salah satunya adalah mengganti CHOST.
Walaupun telah mengikuti panduan ini, anda mungkin masih akan mendapatkan
masalah, jadi pastikan agar anda membaca panduan ini dan mengikutinya dengan
sangat hati-hati. Pada contoh ini, CHOST akan diganti dari i386 ke i686. Jika
penggantian CHOST anda berbeda, maka sesuaikan perintah-perintahnya.
2.
Mengganti variabel CHOST
Kompilasi paket
Untuk memulai penggantian CHOST, edit file /etc/make.conf dan
ganti nilai CHOST sesuai dengan kebutuhan anda. Kemudian, kompilasi
ulang paket-paket berikut secara berurutan:
Daftar Kode 2.1: Kompilasi ulang tool penting sistem |
# emerge -av1 binutils gcc glibc
|
Penting:
Perlu diwaspadai bahwa melakukan upgrade major gcc bersamaan dengan penggantian
CHOST (mis. memulai dari gcc 3.3 dan CHOST i386, lalu berpindah ke gcc 4.1 dan
CHOST i686) dapat mengakibatkan beberapa efek samping. Selain anda hampir tidak
bisa melakukannya, susah sekali memperkirakan masalah apa saja yang akan timbul
untuk mendokumentasikannya di panduan ini. Sebagai konsekuensi, harap lakukan
kedua proses tersebut satu per satu, misalnya dengan meng-upgrade gcc dahulu
seperti yang dijelaskan di Panduan
Upgrade GCC baru kemudian mengganti CHOST. Jika anda menggunakan sistem
dengan CHOST=i386, anda perlu me-mask glibc 2.4 (dan yang lebih baru)
selama proses upgrade gcc berlangsung karena glibc 2.4 tidak dapat digunakan
dengan i386, lalu unmask jika anda sudah selesai meng-upgrade gcc.
|
Memeriksa apakah semuanya baik-baik saja
Sekarang saatnya untuk memastikan apakah aturan gcc-config dan
binutils-config sudah benar dan anda tidak meninggalkan sampah di
/etc/env.d/.
Output gcc-config dan binutils-config terlihat seperti ini
(bisa berbeda tergantung pada versi gcc dan CHOST anda, contoh ini menggunakan
gcc 4.1.1 dan i686):
Daftar Kode 2.2: Memeriksa apakah aturan sudah benar |
# gcc-config -l
[1] i686-pc-linux-gnu-4.1.1 *
# gcc-config -c
i686-pc-linux-gnu-4.1.1
# binutils-config -l
[1] i686-pc-linux-gnu-2.16.1 *
# binutils-config -c
i686-pc-linux-gnu-2.16.1
|
Kemudian, periksa apakah ada referensi ke CHOST lama yang tertinggal di
/etc/env.d/:
Daftar Kode 2.3: Memeriksa referensi CHOST lama |
# cd /etc/env.d/
# grep 386 *
05gcc-i386-pc-linux-gnu:PATH="/usr/i386-pc-linux-gnu/gcc-bin/4.1.1"
05gcc-i386-pc-linux-gnu:ROOTPATH="/usr/i386-pc-linux-gnu/gcc-bin/4.1.1"
|
Catatan:
Hal ini mungkin saja tidak terjadi pada sistem anda, tetapi pada contoh di
atas, 05gcc-i386-pc-linux-gnu berisi referensi ke CHOST lama.
Semuanya bisa berbeda dengan sistem anda, tergantung pada CHOST baru/lama
anda, atau mungkin tidak ada masalah di sini. Nama filenya juga bisa
berbeda, yakni 05gcc-CHOST_baru_anda-pc-linux-gnu.
|
Sebelum menghapus file tersebut, mari kita periksa file-file yang berisi
CHOST baru:
Daftar Kode 2.4: Memeriksa file-file yang berisi CHOST baru |
# grep 686 *
05binutils:MANPATH=/usr/share/binutils-data/i686-pc-linux-gnu/2.16.1/man
05binutils:INFOPATH=/usr/share/binutils-data/i686-pc-linux-gnu/2.16.1/info
05binutils:LDPATH=/usr/i686-pc-linux-gnu/lib
05gcc:PATH="/usr/i686-pc-linux-gnu/gcc-bin/4.1.1"
05gcc:ROOTPATH="/usr/i686-pc-linux-gnu/gcc-bin/4.1.1"
05gcc:MANPATH="/usr/share/gcc-data/i686-pc-linux-gnu/4.1.1/man"
05gcc:INFOPATH="/usr/share/gcc-data/i686-pc-linux-gnu/4.1.1/info"
05gcc:LDPATH="/usr/lib/gcc/i686-pc-linux-gnu/4.1.1"
|
Output di atas kelihatannya sudah bagus karena seharusnya di dalam
/etc/env.d/ hanya boleh ada satu file untuk gcc (pada
contoh ini adalah 05gcc). Sekarang mari kita hapus file yang berisi
referensi lama:
Daftar Kode 2.5: Menghapus file-file yang berisi referensi lama |
# rm 05gcc-i386-pc-linux-gnu
|
Hal yang sama juga berlaku untuk binutils - jika ada lebih dari satu
file, lihatlah file mana yang sudah usang lalu hapus. Kemudian, periksa
/etc/env.d/binutils/
Daftar Kode 2.6: Memeriksa binutils |
# cd /etc/env.d/binutils/
# ls -la
total 8
-rw-r--r-- 1 root root 15 Sep 3 13:48 config-i686-pc-linux-gnu
-rw-r--r-- 1 root root 126 Sep 3 13:48 i686-pc-linux-gnu-2.16.1
# cat config-i686-pc-linux-gnu
CURRENT=2.16.1
# cat i686-pc-linux-gnu-2.16.1
TARGET="i686-pc-linux-gnu"
VER="2.16.1"
LIBPATH="/usr/lib/binutils/i686-pc-linux-gnu/2.16.1"
FAKE_TARGETS="i686-pc-linux-gnu"
|
Output di atas kelihatannya juga sudah bagus, kedua file tersebut memang harus
ada di sana. Saatnya untuk masuk ke direktori gcc.
Daftar Kode 2.7: Memeriksa gcc |
# cd /etc/env.d/gcc
# ls -la
total 12
-rw-r--r-- 1 root root 32 Sep 3 16:43 config
-rw-r--r-- 1 root root 32 Aug 3 14:25 config-i386-pc-linux-gnu
-rw-r--r-- 1 root root 292 Sep 3 16:43 i686-pc-linux-gnu-4.1.1
# cat config
CURRENT=i686-pc-linux-gnu-4.1.1
# cat config-i386-pc-linux-gnu
CURRENT=i386-pc-linux-gnu-4.1.1
# cat i686-pc-linux-gnu-4.1.1
PATH="/usr/i686-pc-linux-gnu/gcc-bin/4.1.1"
ROOTPATH="/usr/i686-pc-linux-gnu/gcc-bin/4.1.1"
LDPATH="/usr/lib/gcc/i686-pc-linux-gnu/4.1.1"
GCCBITS="32"
MANPATH="/usr/share/gcc-data/i686-pc-linux-gnu/4.1.1/man"
INFOPATH="/usr/share/gcc-data/i686-pc-linux-gnu/4.1.1/info"
STDCXX_INCDIR="g++-v4"
|
config dan i686-pc-linux-gnu-4.1.1 sudah benar,
tetapi config-i386-pc-linux-gnu adalah sampah yang perlu dibuang.
Catatan:
Lagi-lagi, nama file yang berisi referensi ke versi gcc lama di sistem anda
mungkin berbeda, mis. config-i686-pc-linux-gnu walaupun anda
sedang mengganti CHOST anda ke i686. Anda harus mengenali file dari isinya,
bukan hanya dari namanya.
|
Daftar Kode 2.8: Menghapus file konfigurasi gcc lama |
# rm config-i386-pc-linux-gnu
|
Sekarang jalankan perintah-perintah berikut untuk memperbarui lingkungan anda:
Daftar Kode 2.9: Memperbarui lingkungan |
# env-update && source /etc/profile
|
Kemudian periksa apakah semuanya sudah benar:
Daftar Kode 2.10: Memastikan apakah semua referensi ke CHOST lama sudah dihapus |
# grep -r 386 /etc/env.d/
|
Jika anda masih menemukan sampah lain, kemungkinan anda melewatkan beberapa
file. Lacak dulu sebelum melanjutkan.
Menyelesaikan Penggantian
Sekarang kita perlu menginstal ulang libtool dan menjalankan
fix_libtool_files.sh. Pastikan anda menggunakan versi gcc yang benar:
(versi gcc saat ini, 4.1.1 pada contoh, dan CHOST lama, i386 pada contoh).
Daftar Kode 2.11: Memastikan pustaka sudah benar |
# emerge -av1 libtool
# fix_libtool_files.sh 4.1.1 --oldarch i386-pc-linux-gnu
|
Anda mungkin perlu membangun ulang semua paket-paket anda:
Daftar Kode 2.12: Membangun ulang world |
# emerge -e world
|
Sebenaranya secara teori, anda tidak perlu melakukannya, tetapi kami tidak
dapat menjamin bahwa inilah yang benar. Jika anda tidak membangun ulang
world, ada beberapa paket yang perlu anda bangun ulang, jadi anda perlu:
Daftar Kode 2.13: Membangun ulang python |
# emerge -av1 python
|
Semua paket yang menggunakan perl diinstal ke direktori CHOST dan untuk
itu perlu anda bangun ulang. Jika anda belum memiliki qfile, anda
perlu menginstal app-portage/portage-utils terlebih dahulu.
Daftar Kode 2.14: Membangun ulang paket-paket perl |
# emerge -av portage-utils
# emerge -av1 `qfile /usr/lib/perl* -Cq | sort -u`
|
Jika anda menemukan paket lain yang perlu dibangun ulang, harap hubungi penulis
dokumen ini.
Masalah-masalah umum
Ketika melakukan upgrade dari gcc 3.3 ke 4.1 bersamaan dengan mengganti CHOST
(tolong jangan lakukan), beberapa pengguna telah melaporkan paket-paket yang
rusak dan perlu dikompilasi ulang, seperti groff dan courier:
Daftar Kode 2.15: Pesan error |
error while loading shared libraries: libstdc++.so.5: cannot open shared object file: No such file or directory
|
Hal ini terjadi karena selama proses upgrade, CHOST tidak cocok dengan CTARGET
dan compiler mengasumsikan kita sedang melakukan cross-compiling.
Akhirnya, LDPATH tidak dimasukkan ke ld.so.conf, yang menghasilkan
error ini.
Bacalah Panduan Upgrade GCC kami
untuk mengetahui apa saja yang perlu dikompilasi ulang setelah melakukan
upgrade gcc.
Pada beberapa kasus yang jarang terjadi, masalah ini juga dapat merusak
versi-versi lama python. Anda dapat memperbaikinya dengan menambahkan
/usr/lib/gcc-lib/i386-pc-linux-gnu/3.3.6 (sesuaikan dengan CHOST
dan versi gcc lama anda) ke /etc/ld.so.conf, menjalankan
ldconfig kemudian emerge libstdc++-v3. Namun, seperti yang sudah
dapat anda mengerti, seharusnya anda tidak perlu menghadapi masalah ini -
jangan ganti CHOST anda bersamaan dengan meng-upgrade gcc.
Laporan
Kiranya itu saja, kami akan menerima semua laporan (berhasil, gagal, atau
menemukan masalah lain), kirimkan email ke Wernfried Haas
atau ke thread
forum ini. Kebanyakan dari panduan ini berasal dari vapier,
terima kasih atas bantuannya!
Isi dokumen ini dilisensikan dengan lisensi Creative Commons -
Attribution / Share Alike.
|