Gentoo Logo

Mengganti Variabel CHOST

Daftar Isi:

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!



Print

Diperbarui 16 Juli 2007

Versi asli dari dokumen ini terakhir diupdate 29 Juli 2008

Rangkuman: Dokumen ini menjelaskan cara mengganti variabel CHOST pada sistem yang sudah berfungsi.

Wernfried Haas
Author

Mike Frysinger
Reviewer

Chris White
"Editor"

Dzikri Aziz
Translator

Donate to support our development efforts.

Copyright 2001-2012 Gentoo Foundation, Inc. Questions, Comments? Contact us.