Cross Compile with MinGW-w64
Fri 07 October 2011Windows ရဲ့ Environment ဟာ Compile လုပ်ဖို့အဓိက မထားတဲ့အတွက် တကယ်တမ်း တစ်ချို့ Opensource တွေကို ကိုယ်တိုင် Compile လုပ်ဖို့လိုလိုရင် အတော်ပြဿနာတက်တယ် အများအားဖြင့် 64 bits တွေလိုချင်ရင်ဖြစ်တတ်တယ် အဲဒီ့အချိန်ကျရင်တော့ သူများလုပ်ထားတာရှိသလား လိုက်ရှာရတာကမောတယ် ကိုယ်တိုင်ကိုယ်ကျ Compile လုပ်ရရင်ပိုမောပါတယ်။ Windows မှာ Compile လုပ်ချင်ရင် Native မဟုတ်ပဲ လွယ်ချင်ရင်တော့ Cygwin မှာလုပ်ရင်တော့ဖြစ်တယ် ဒါပေမယ့် Cygwin dll ကြားထဲကပါနေတော့ နေရာတိုင်းသုံးလို့မဖြစ်ဘူး တစ်ချို့ Opensource တွေက VC နဲ့လုပ်ရလွယ်အောင် မပေးထားရင် Compile လုပ်ရတာ အတော်ဒုက္ခများပါတယ်။ Native လိုချင်ရင် အသုံးအတည့်ဆုံးကတော့ Mingw ကို MSys နဲ့သုံးရင်တော့အဆင်ပြေတယ်။ အခုနောက်ပိုင်း ပြဿနာဖြစ်ဖြစ်နေတာက 64 bits လိုချင်တော့ Mingw 64 bits ကို Setup လုပ်ရတာကလည်း နည်းနည်းလက်ဝင်ပါတယ် အဲဒါကြောင့် နောက်ပိုင်းတော့ Mingw သုံးပြီး Linux ပေါ်မှာပဲ Cross Compile လုပ်လိုက်တော့တယ်။
Linux ကလည်း သူ့ရဲ့ Native မှာ Compile လုပ်ရလွယ်ပေမယ့် Cross Compile ဆိုရင်တော့ GNU Autotools တွေအလုပ်လုပ်တာတော့ နည်းနည်းနားလည်ဖို့လိုပါတယ်။ Ubuntu ပေါ်မှာပဲ Cross Compile လုပ်ဖြစ်တယ် Ubuntu ရဲ့ Repo ထဲမှာ Mingw 64 bits ပါပေမယ့် တကယ်သုံးကြည့်တော့ Error များပါတယ် အဲဒါကြောင့် တကယ်သုံးမယ်ဆိုရင် Mingw 64 bits Binary တွေကိုမူရင်းဆိုက်ကနေပဲ ဆွဲယူရပါတယ် အဲဒါတွေကိုပါ ကိုယ်တိုင် Compile လုပ်လို့ရပါတယ် ဒါပေမယ့်လုပ်ဖို့တော့ မလိုအပ်ရင်အားမပေးပါဘူး Mingw တစ်ခုလုံးကို Compile လုပ်ရတာ အတော်အချိန်ကုန်သလို ပြဿနာလည်းများလွန်းပါတယ်။ Cross Compile ဖြစ်တဲ့အတွက် ကိုယ်လုပ်ချင်တဲ့ Platform အလိုက် Compiler တွေကိုယူရပါမယ် Windows 32 and 64 ဆိုတဲ့အတွက် Compiler လည်း ၂ ခုလိုပါတယ်။ အောက်မှာပြထားတဲ့ URL နှစ်ခုကနေ ဒေါင်းလုပ်လုပ်လို့ရပါတယ်။ အဲဒီ့မှာလည်း Personal နဲ့ Automated Builds ဆိုပြီး ၂ မျိုးရှိတယ် တစ်ချို့ကလည်း Personal က အများနည်းတယ်ပြောတယ် ဒါပေမယ့် နောက်ဆုံး Build ကိုပဲကျွန်တော်သုံးတော့ Automated သုံးနေတာ အခုထိတော့ ဘာမှမဖြစ်ဖူးသေးပါဘူး။
http://sourceforge.net/projects/mingw-w64/files/Toolchains targetting Win32 http://sourceforge.net/projects/mingw-w64/files/Toolchains targetting Win64
ရလာတဲ့ Compiler တွေကို တစ်နေရာမှာသွားထားပါတယ် ဘယ်နေရာထားထားရပါတယ် ကျွန်တော်ကတော့ /opt အောက်မှာ mingw32 and mingw64 ဆိုပြီးသတ်မှတ်ထားလိုက်တယ်။ သူက Compiler name တွေရှေ့မှာ ကိုယ် Cross လုပ်မယ့် Architecture Name ထည့်ထားတယ် gcc compiler ဆိုရင် 32 Bits Windows အတွက်ဆို i686-mingw32msvc-gcc လို့နာမည်ပေးပြီးတော့ 64 Bits Windows အတွက်ဆို x86_64-mingw32msvc-gcc လို့နာမည်ပေးထားတယ်။ အဲဒီတော့ Cross Compile လုပ်ချင်တဲ့ Source တွေကို သက်ဆိုင်ရာ Compiler နဲ့ Compile လုပ်ရပါတယ် တကယ်တော့ Compiler တစ်ခုတည်မဟုတ်ပါဘူး Loader, Linker, … စသည်ဖြင့် အကုန်လုံးကိုပြောင်းသုံးရမှာပါ။ အဲဒီတော့ Build လုပ်တဲ့အချိန်မှာ Manual ဆိုရင်ပြဿနာမဟုတ်ပေမယ့် Automated ဆိုရင်တော့ Makefile ထဲမှာ လိုက်ပြင်ရပါလိမ့်မယ် အဲဒါလည်း လက်နဲပြင်လို့မဖြစ်နိုင်တော့ Autotools တွေနဲ့ Makefile generate လုပ်တဲ့အချိန်မှာ Parameter ထည့်ပေးလိုက်မှအဆင်ပြေပါတယ်။ အဲဒါကြောင့် Makefile generate လုပ်တဲ့ Configure script ကို Execute လုပ်တဲ့အချိန်မှာ အောက်မှာပြထားတဲ့ Parameter တွေထည့်ပေးရပါမယ်။
CC=/opt/mingw64/bin/x86_64-w64-mingw32-gcc CXX=/opt/mingw64/bin/x86_64-w64-mingw32-g++ LD=/opt/mingw64/bin/x86_64-w64-mingw32-ld AR=/opt/mingw64/bin/x86_64-w64-mingw32-ar AS=/opt/mingw64/bin/x86_64-w64-mingw32-as NM=/opt/mingw64/bin/x86_64-w64-mingw32-nm STRIP=/opt/mingw64/bin/x86_64-w64-mingw32-strip RANLIB=/opt/mingw64/bin/x86_64-w64-mingw32-ranlib DLLTOOL=/opt/mingw64/bin/x86_64-w64-mingw32-dlltool OBJDUMP=/opt/mingw64/bin/x86_64-w64-mingw32-objdump RC=/opt/mingw64/bin/x86_64-w64-mingw32-windres —host=x86_64-w64-mingw32
CC=/opt/mingw32/bin/i686-w64-mingw32-gcc CXX=/opt/mingw32/bin/i686-w64-mingw32-g++ LD=/opt/mingw32/bin/i686-w64-mingw32-ld AR=/opt/mingw32/bin/i686-w64-mingw32-ar AS=/opt/mingw32/bin/i686-w64-mingw32-as NM=/opt/mingw32/bin/i686-w64-mingw32-nm STRIP=/opt/mingw32/bin/i686-w64-mingw32-strip RANLIB=/opt/mingw32/bin/i686-w64-mingw32-ranlib DLLTOOL=/opt/mingw32/bin/i686-w64-mingw32-dlltool OBJDUMP=/opt/mingw32/bin/i686-w64-mingw32-objdump RC=/opt/mingw32/bin/i686-w64-mingw32-windres —host=i686-w64-mingw32
ပြီးရင်တော့ ပုံမှန် Build လုပ်သလိုပဲ Make လုပ်လို့ရပါပြီ။ စိတ်ဝင်စားတယ်ဆိုရင် တစ်ခုခုကို Cross Compile လုပ်ကြည့်ပါ လွယ်လွယ်ကူကူဆိုရင် Curl ရဲ့ Source ကို Download လုပ်လိုက်ပါ ပြီးရင်တော့ အပေါ်မှာပြထားသလို 32 bits အတွက်ရယ် 64 bits အတွက်ရယ် Compile လုပ်ကြည့်ပါ curl.exe တွေကို Build လုပ်ပေးပါလိမ့်မယ် အဲဒါတွေကို Windows ပေါ်ကိုကူးသွားပြီး Execute လုပ်ကြည့်ပါ အလုပ်လုပ်ပါလိမ့်မယ်။ 64 bits ကို 32 bits Windows ပေါ်မှာစမ်းကြည့်မိရင်တော့ အလုပ်မလုပ်တာတွေ့ပါလိမ့်မယ်။ Linux ပေါ်မှာလည်း Exe files တွေအလုပ်လုပ်မလုပ် စမ်းကြည့်ချင်တယ်ဆိုရင် Wine Install လုပ်ထားရင်တော့ Exe တွေကိုတစ်ခါတည်း Execute လုပ်ပြီးစမ်းလို့ရပါတယ်။ အားလို့စိတ်ဝင်စားရင်တော့ စမ်းကြည့်နိုင်ပါတယ် ဘာအကျိုးထူးသလဲမေးရင်တော့ Source Code အလကားပေးရင်တောင် ကောင်းလွန်းပေမယ့် သုံးလို့မလွယ်တာတွေ ရှိတယ်လို့သိစေချင်တာပါ တကယ်လုပ်ကြည့်ရင် ရေးထားတဲ့ကုဒ်ကို Compile လုပ်ရတာကိုက မလွယ်ကူဘူးဆိုတာ နားလည်သွားပါလိမ့်မယ်။