Rabu, 19 September 2012

Install MinGW-w32 di Windows

Kalau sekarang sih gampang, tinggal pakai mingw-get dan beres. Tapi, kalau entah kenapa kamu nggak bisa pakai mingw-get, berikut cara lama buat install MinGW-w32 di Windows.

1. Siapin Tools

  • Download & install 7-Zip (wajib, karena file MinGW/MSYS biasanya format .tar.lzma)
  • Pasang asosiasi file di 7-Zip biar bisa buka .lzma langsung
  • Bikin folder di C:\ → C:\MinGW dan C:\msys

2. Download File yang Dibutuhin

File-file MinGW dan MSYS bisa diambil dari mirror SourceForge. Contoh: mirror MinGW. Jangan pakai interface default SourceForge yang ribet, langsung browse aja kayak FTP.

Ekstrak semua archive .tar.lzma ke folder yang sesuai. Ingat, di 7-Zip harus dibuka sampai ketemu folder bin/, include/, dll. Nah, isi folder itu yang perlu diekstrak ke C:\MinGW atau C:\msys.

3. Paket yang Wajib Didownload

Minimal kamu butuh:

  • GCC 4.5.0: gcc-core, gcc-c++, libgcc, libstdc++, libssp
  • Binutils 2.20.51: paket binutils
  • Runtime: mingwrt + w32api
  • Library: gmp, mpfr, mpc
  • MSYS: msysCORE, bash, make, coreutils, autoconf, automake, dll.

(Lengkapnya panjang banget, tapi intinya semua tools dasar compiler + MSYS environment).

4. Jalankan MSYS

Setelah ekstrak semua file, buka:

C:\msys\msys.bat

Dari dalam shell MSYS, jalanin:

cd /c/msys/postinstall
./pi.sh

Ikutin instruksi yang keluar. Ini bakal nge-setup environment MSYS biar siap dipakai.

5. Tes Installasi

Tutup MSYS, buka lagi, lalu coba compile program C sederhana:

gcc hello.c -o hello.exe
./hello.exe

Kalau berhasil, berarti instalasi MinGW-w32 kamu udah jalan!

Catatan Akhir

Cara ini agak ribet dan makan waktu, jadi kalau kamu cuma butuh cepat, pakai mingw-get aja. Tapi kalau lagi pengen belajar “old school setup”, ya cara ini masih bisa dipakai sampai sekarang.

Label: ,

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: , , ,

Kamis, 14 Juni 2012

Mencegah USB Device dengan Serial Berbeda Terdeteksi Sebagai Device Baru

Buat yang sering main-main sama USB device, mungkin pernah ngalamin masalah: setiap kali colok device dengan serial number berbeda, Windows nganggep itu device baru lagi. Ribet banget kan?

Nah, dulu ada sharing dari forum USB-IF (sayangnya link aslinya udah nggak aktif), tapi idenya masih bisa dipakai terutama di Windows 2000/XP.

Triknya

Semua mainnya di registry. Lokasinya ada di:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\UsbFlags]

Ada dua cara yang bisa dipakai:

1. Cara global

Sebenarnya Windows udah punya entry bawaan:

GlobalDisableSerNumGen = 1

Walaupun namanya agak menipu (seakan-akan disable serial number), tapi justru ini yang bikin serial number tetap aktif. Jadi biasanya biarkan saja setting ini apa adanya.

2. Cara spesifik per-device

Kalau mau lebih spesifik, kamu bisa bikin entry baru di bawah key UsbFlags. Namanya harus dimulai dengan IgnoreHWSerNum lalu diikuti Vendor ID (VID) dan Product ID (PID).

Contoh:

IgnoreHWSerNum0536016A = 1

Di sini, VID = 0536 (hex), sedangkan PID tergantung device/interface yang dipakai.

Dengan cara ini, Windows bakal "ngabaikan" serial number device tersebut, jadi walaupun serial-nya beda, tetap dianggap device yang sama.

Label: , , ,

Minggu, 10 Juni 2012

Menampilkan Hidden Devices di Windows

Kadang kita butuh lihat device yang udah pernah nyantol ke PC tapi sekarang nggak kelihatan di Device Manager. Untungnya, ada trik lama dari milis libusb-devel yang masih works sampai sekarang.

Caranya

  1. Bikin environment variable system (bukan user) dengan nama:
    DevMgr_Show_NonPresent_Devices
    dan kasih nilai 1.
  2. Buka Device Manager, terus lewat menunya aktifkan opsi buat nunjukin hidden devices.

Kalau penasaran lebih detail, bisa cek dokumen resmi dari FTDI di sini: Advanced Driver Options.

Trik ini udah dicoba di Windows 7 juga dan masih jalan mulus. Lumayan buat ngecek driver atau perangkat yang udah "ngendap" tapi nggak nongol lagi.

Sabtu, 02 Juni 2012

Compiling Resource Files di Visual Studio Express

Jadi gini, kalau kamu ambil project Visual Studio yang punya MFC GUI app terus coba compile di Visual Studio Express, kemungkinan besar bakal ketemu error kayak gini:


fatal error RC1050: Cannot open include file 'afxres.h'.
  

Kenapa bisa gitu? Karena Visual Studio Express nggak bawa library MFC, jadi file afxres.h memang nggak ada. Tapi tenang, solusinya simpel banget.

Solusi Cepat

Buka file .rc kamu, lalu ganti baris ini:


#include "afxres.h"
  

dengan ini:


#include <windows.h>
#define IDC_STATIC -1
  

Selesai deh! 🎉 Dengan cara ini, resource file bisa tetap dikompilasi dengan baik walau pakai Visual Studio Express. Jadi nggak perlu lagi bingung cari file afxres.h yang nggak bakal ada.

Label: , ,

Kamis, 24 Mei 2012

Jalanin Windows XP di QEMU

Lagi pengen nostalgia sama Windows XP tapi nggak mau repot dual boot? Salah satu cara gampangnya adalah jalanin XP di atas QEMU langsung dari Windows. Aku sempat coba compile QEMU pakai MinGW32/Msys, dan ternyata bisa jalan cukup mulus.

Langkah yang Aku Lakuin

  • Compile QEMU dari source, jangan lupa tambahin target-list=i386-softmmu biar cuma compile target yang dibutuhin.
  • Install UltraVNC buat koneksi GUI.
  • Copy executable QEMU dari i386-softmmu ke folder pc-bios, terus jalankan dari situ.
  • Bikin image harddisk pakai qemu-img.
  • By default QEMU di sistem IPv6 bakal maksa pakai IPv6, jadi koneksi VNC bisa nggak nyambung. Solusinya, pakai IPv4 di opsi -vnc.

Dari folder pc-bios, aku jalankan QEMU dengan command ini:


qemu -usb -vnc 127.0.0.1:0 -hda winxp.img -m 512 -localtime \
-net user -net nic,model=rtl8139 -cdrom //./d:
  

Setelah itu, konek pakai UltraVNC viewer dengan alamat localhost::5900, dan mulai install XP dari CD.

Tips Setelah Install XP

Begitu XP selesai diinstall, hal pertama yang wajib dilakukan adalah mematikan mouse acceleration. Caranya buka Mouse Properties → Pointer Options lalu matikan pilihan Enhance Pointer Precision. Kalau nggak, kontrol mouse di dalam VM bisa terasa aneh.

Sampai sini, XP udah bisa jalan dengan lancar di QEMU di atas Windows. Lumayan buat nostalgia atau testing software lama.

Jumat, 18 Mei 2012

Error "unresolved external symbol CLSID_FileOpenDialog" di Visual C++

Lagi ngoding di C++ terus build project, eh tiba-tiba muncul pesan error kayak gini:


unresolved external symbol CLSID_FileOpenDialog
error LNK2001: unresolved external symbol IID_IFileOpenDialog
error LNK2001: unresolved external symbol CLSID_FileOpenDialog
  

Kalau baru lihat, mungkin langsung mikir ada yang salah sama kodenya. Padahal sebenarnya penyebabnya simpel: kamu cuma lupa masukin library yang dibutuhin.

Buat kasus ini, yang kurang adalah uuid.lib. Library ini nyimpen definisi buat CLSID dan IID yang lagi dicari linker.

Cara Beresinnya

Cukup tambahin uuid.lib ke project kamu. Bisa lewat pengaturan linker di Visual Studio, atau langsung di kode pakai pragma kayak gini:


#pragma comment(lib, "uuid.lib")
  

Setelah itu, coba build ulang project kamu. Harusnya error tadi langsung hilang.

Jadi intinya, kalau ketemu error unresolved external symbol buat CLSID_FileOpenDialog atau IID_IFileOpenDialog, jangan panik. Tinggal pastikan uuid.lib udah dilink ke project.

Sabtu, 12 Mei 2012

Buka Device Manager Windows Cuma Sekali Klik

Kadang kita butuh banget akses cepat ke Device Manager. Di Windows 7 memang agak mendingan dibanding versi sebelumnya, tapi tetap aja nggak ada tombol satu klik langsung ke sana.

Nah, ada trik sederhana biar bisa buka Device Manager hanya dengan sekali jalanin shortcut. Cukup pakai perintah ini:


C:\Windows\system32\mmc.exe C:\Windows\system32\devmgmt.msc
  

Simpan aja perintah itu di shortcut, misalnya di desktop atau taskbar. Jadi kapan pun butuh, tinggal klik sekali, Device Manager langsung nongol.

Cara lama, tapi efektif banget kalau kamu sering utak-atik driver atau cek hardware di Windows.

Selasa, 08 Mei 2012

Windows UAC dan Error "Bad File Number" di Bash

Lagi iseng coba jalanin file setup_driver.exe hasil compile di MSYS/MinGW, eh tiba-tiba ketemu error aneh kayak gini:


sh: ./setup_driver.exe: Bad file number
  

Awalnya bikin bingung juga, padahal compile sukses. Ternyata masalahnya ada di cara Windows nge-handle file executable yang namanya ada kata setup-nya.

Jadi gini, Windows (lebih tepatnya UAC) punya kebiasaan khusus. Kalau ada aplikasi yang namanya mengandung kata "setup" atau "install", dia otomatis dianggap installer. Hasilnya, Windows coba ngejalanin file itu dengan hak akses lebih tinggi (elevated mode), dan ini bikin shell di MSYS/MinGW bingung. Makanya keluar error Bad file number.

Solusinya Gampang

Cukup ganti nama file kamu jadi sesuatu yang nggak ada kata setup atau install-nya. Misalnya dari setup_driver.exe jadi driver_tool.exe.

Setelah diganti, coba jalanin lagi dari bash. Harusnya udah normal dan errornya nggak muncul lagi.

Jadi intinya, masalah ini bukan di compile atau kodenya, tapi lebih ke “kebiasaan” Windows UAC yang ngira semua file setup itu installer.

Label: , , ,

Sabtu, 28 April 2012

Bikin Header Otomatis dengan Automake / Autotools

Pernah ngalamin pas lagi build project, eh kompilasi gagal cuma gara-gara file header belum ada? Contohnya kayak resource.h yang sebenarnya harus dibangkitin dulu sebelum bagian lain jalan.

Nah, ada trik gampangnya di Automake. Tinggal tambahin baris ini di Makefile.am:


BUILT_SOURCES = resource.h
  

Jadi setiap kali build, file resource.h bakal otomatis dibuat lebih dulu sebelum compiler ngerjain yang lain. Praktis banget, kan?

Contoh Nyatanya

Di project WDI (Windows Driver Installer) buat libusb 1.0, isi Makefile.am-nya kurang lebih kayak gini:


BUILT_SOURCES = resource.h
lib_LTLIBRARIES = libusb-wdi.la

LIB_SRC = resource.h infs.h usbi.h installer.h installer_library.h installer_library.c

libusb_wdi_la_CFLAGS = $(VISIBILITY_CFLAGS) $(AM_CFLAGS) -L../../libusb/libusb/.libs -lusb-1.0 
libusb_wdi_la_SOURCES = $(LIB_SRC)

resource.h:
    ../embedder/embedder.exe resource.h

clean-local:
    -rm -rf resource.h
  

Nah dengan setup kayak gitu, resource.h selalu dibangkitin duluan. Jadi nggak ada lagi error gara-gara header ilang pas build.

Trik kecil, tapi lumayan nyelametin waktu kalau project kamu memang butuh file header yang dinamis.

Minggu, 22 April 2012

Hilangkan Trailing Whitespaces Otomatis di Visual Studio

Kadang waktu ngoding di Visual Studio, kita nggak sadar suka ninggalin spasi atau tab di akhir baris (alias trailing whitespaces). Kelihatannya sepele, tapi kalau file dibuka ulang bisa bikin risih juga.

Nah, di Visual Studio 2008 ada trik supaya trailing whitespaces otomatis dihapus setiap kali kita save file. Lumayan praktis biar kode tetap rapi.

Caranya

  1. Buka menu ToolsMacrosMacro Explorer.
  2. Double klik MyMacros → Module1.
  3. Di Project Explorer Tree, double klik EnvironmentEvents yang ada di atas Module1.
  4. Setelah baris #End Region untuk #Region "Automatically generated code, do not modify", tambahkan kode berikut:

Private saved As Boolean = False
Private Sub DocumentEvents_DocumentSaved(ByVal document As EnvDTE.Document) _
                                         Handles DocumentEvents.DocumentSaved
    If Not saved Then
        Try
            ' Remove all the trailing whitespaces.
            DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, _
                                 "{:Zs|\t}+$", _
                                 vsFindOptions.vsFindOptionsRegularExpression, _
                                 String.Empty, _
                                 vsFindTarget.vsFindTargetCurrentDocument, , , _
                                 vsFindResultsLocation.vsFindResultsNone)

            saved = True
            document.Save()
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.OkOnly, "Trim White Space exception")
        End Try
    Else
        saved = False
    End If
End Sub
  

Dengan script ini, setiap kali file disimpan, trailing whitespaces bakal otomatis dihapus. Jadi nggak perlu lagi bersihin manual satu-satu.

Simple, tapi bikin workflow lebih nyaman.

Label: ,

Jumat, 13 April 2012

Ngatasin Error "usb_mon_register" pas Compile Kernel Module di Linux

Pernah lagi asik compile kernel module di Linux, tiba-tiba muncul error aneh kayak gini:


ERROR: "usb_mon_register" [drivers/usb/mon/usbmon.ko] undefined!
  

Kalau baru lihat, mungkin agak bikin bingung. Padahal sebenarnya penyebabnya sederhana aja. Biasanya error ini muncul karena konfigurasi kernel yang kita pakai sekarang tidak sama dengan konfigurasi waktu kernel terakhir dikompilasi.

Cara Beresinnya

  • Recompile kernel biar konfigurasinya sinkron lagi.
  • Kalau masih perlu, compile ulang juga modul yang barusan error.
  • Setelah itu, pastikan kamu sudah boot ke kernel yang baru dikompilasi.

Intinya sih, ini bukan bug yang parah atau aneh. Lebih ke masalah sinkronisasi aja antara kernel dan modulnya. Jadi solusinya ya tinggal compile ulang, selesai.

Semoga catatan kecil ini bisa jadi referensi kalau suatu saat ketemu error yang sama.

Selasa, 10 April 2012

Ngatasin Error "A service installation section in this inf is invalid" di Windows

Lagi asik install driver di Windows, eh tiba-tiba muncul error yang cukup bikin kaget:


A service installation section in this inf is invalid
  

Kalau kamu pakai Windows 7 x64 atau Vista x64, besar kemungkinan masalahnya ada di file INF yang dipakai. Biasanya sih ini gara-gara bagian ServiceBinary masih menunjuk ke driver 32 bit, padahal kita lagi install di sistem 64 bit.

Solusinya

Coba buka file INF drivernya, lalu pastikan bagian ServiceBinary sudah mengarah ke file driver versi 64 bit. Contohnya kayak gini:


ServiceBinary = %12%\mydriver_x64.sys
  

Setelah diperbaiki, coba install ulang drivernya. Harusnya kali ini jalan lebih mulus dan error tadi nggak muncul lagi.

Jadi intinya, error ini bukan hal yang rumit banget. Biasanya cuma soal salah referensi file aja di INF-nya. Cek sebentar, ubah ke versi yang benar, lalu beres.