Rabu, 11 Juli 2012

Compiling MinGW-w64 dengan Multilib di Linux

Oke, ini cerita panjang tentang gimana caranya bikin sendiri MinGW-w64 di Linux yang bisa jalanin -m32 dan -m64 (alias support multilib). Jadi kamu bisa compile binary Windows 32-bit maupun 64-bit langsung dari Linux.

Peringatan Dulu Nih

Kalau kamu lagi ada kerjaan mepet deadline atau butuh cepat, mending jangan coba compile cross compiler manual. Prosesnya bisa makan waktu berhari-hari dan bikin kepala pusing. Jadi ini cuma cocok buat kamu yang pengen eksperimen, belajar, atau emang butuh versi terbaru banget dari semua toolchain.

Yang Dibutuhin

  • MinGW-w64 (ambil dari SVN)
  • binutils 2.20.1
  • gcc 4.5.0
  • gmp 4.3.2
  • mpfr 3.0.0
  • mpc 0.8.2

Siapin disk space sekitar 2-3 GB (lebih enak kalau pakai SSD). Trus, usahakan compile di mesin dengan CPU kenceng & multicore, biar nggak terlalu lama.

Setup Awal

Setelah semua source di-download, extract ke satu working directory. Lalu pindahin library supaya dikenali gcc:

mv mpfr-3.0.0/ gcc-4.5.0/mpfr
mv gmp-4.3.2/ gcc-4.5.0/gmp
mv mpc-0.8.2/ gcc-4.5.0/mpc

Ingat, jangan compile langsung dari dalam folder source. Selalu bikin folder build sendiri.

Build Binutils

mkdir binutils-build; cd binutils-build
../binutils-2.20.1/configure --disable-nls \
  --target=x86_64-w64-mingw32 \
  --enable-targets=x86_64-w64-mingw32,i686-w64-mingw32
make -j4
make install

Hasilnya: tools dasar MinGW-w64 masuk ke /usr/local/bin.

Install Header MinGW

cd ..; mkdir mingw-build; cd mingw-build
../mingw-w64/trunk/mingw-w64-headers/configure --host=x86_64-w64-mingw32
make install

Ini bakal ngopi headers ke /usr/local/x86_64-w64-mingw32/include/.

Directory & Symlink

ln -s /usr/local/x86_64-w64-mingw32 /usr/local/mingw
mkdir -p /usr/local/x86_64-w64-mingw32/lib32
ln -s /usr/local/x86_64-w64-mingw32/lib /usr/local/x86_64-w64-mingw32/lib64

Ini penting buat multilib supaya nggak bingung antara lib32 dan lib64.

Build GCC (Pass 1)

cd ..; mkdir gcc-build; cd gcc-build
../gcc-4.5.0/configure --disable-nls \
  --target=x86_64-w64-mingw32 \
  --enable-languages=c,c++ \
  --with-system-zlib \
  --enable-multilib \
  --enable-shared \
  --enable-fully-dynamic-string
make all-gcc -j4
make install-gcc

Kalau ada error soal gmp-impl.h atau longlong.h nggak ketemu, copy manual dari folder gcc/gmp/.

Build CRT

cd ../mingw-build
../mingw-w64/trunk/configure --disable-nls --host=x86_64-w64-mingw32 --enable-lib32
make -j4
make install -j4

Build GCC (Pass 2)

Nah, di sini biasanya mulai banyak drama: error skipping incompatible lib, No rule to make target, sampai Link tests are not allowed. Biasanya bisa diakalin dengan:

  • Edit Makefile biar path lib → lib32 sesuai arsitektur
  • Kopi libtool antar folder
  • Bikin symlink manual kalau ada header yang "hilang"

Intinya, coba terus sampai berhasil. Kadang butuh rerun make berkali-kali.

Hasil Akhir

Kalau semua lancar (dan sabar kamu cukup tebal), akhirnya kamu bakal punya MinGW-w64 cross compiler full multilib yang bisa compile binary Windows 32-bit & 64-bit, plus support static maupun DLL.

Contoh compile 32-bit:

./configure --host=x86_64-w64-mingw32
export CFLAGS=-m32

Done! Sekarang kamu bisa cross compile Windows binary langsung dari Linux. Berat di awal, tapi puas banget kalau berhasil.

Label: , , ,

<< Beranda