Go developer’ın koşturduğu ortamdan farklı platforma suya,sabuna dokunmadan derleme yapabilme gibi bir lüksü var. Bu nimetten yararlanmak, bir kaç komuta baksa da söz konusu ortam Windows olunca bazı trickler gerekebiliyor.
Runtime’ı derlememiz için gcc’ye ihtiyacımız var ve Windows için gcc portu MinGW. Öncelikle MinGW’yi C:\MinGW path’ine boşluk içermeyecek şekilde kurun ve C:\MinGW\bin dizinin Sistem Environment’in PATH alanına ekleyin. (set PATH ile doğrulayabilirsiniz)
Artık bilgisayarımızda gcc derleyicisi var ve Go’nun C runtime’ını derleyebiliriz.
Aşağıdaki komutu çalıştırın.
cd %GOPATH%\src make.bat
Her şey yolunda ise %GOOS% ve %GOARCH% değişkenlerine göre runtime yüklenecektir. Eğer make.bat başarılı şekilde sonlandıysa kendinizi şanslı sayabilirsiniz.
Bende işler bu kadar kolay olmadı. Öncelikle x64 plaformunda koşuyorsanız aşağıdaki hatayı almanız muhtemel.
Bu sorun x86 için derlenmiş as.exe’nin x64 kütüphanesi ile dans edememesinden meydana geliyor.
Çözüm için;
C:\MinGW\mingw32
klasörünü silin veya ismini değiştirin.
Bir heves ile make.bat’a saldırıp tekrar çalıştırdığımda ise aşağıdaki durum ile karşılaştım.
##### Building C bootstrap tool. cmd/dist ##### Building compilers and Go bootstrap tool. In file included from C:\Users\mattn\dev\go\src\lib9\_exits.c:29:0: C:\go\include/libc.h:313:8: error: redefinition of 'struct timespec' struct timespec { ^ In file included from c:\mingw\include\unistd.h:95:0, from C:\go\include/u.h:62, from C:\go\src\lib9\_exits.c:28: c:\mingw\include\parts\time.h:65:8: note: originally defined here struct timespec ...
Biraz araştırdıktan sonra ufak bir bug olduğunu ve Go’nun bunun için bir patch yayınlamış olduğunu öğrendim ve manual patchledim.
%GOPATH%\include\libc.h
dosyasının 313 ve 318 satırlarını aşağıdaki gibi düzenlemek gerekiyor.
# if !defined(__struct_timespec_defined) struct timespec { int tv_sec; long tv_nsec; }; # endif
Düzenlemeden emin olmak için https://go-review.googlesource.com/#/c/2201/3/include/libc.h dosyasını referans alabilirsiniz.
Güncelleme yaptıktan sonra make.bat’ı tekrar çalıştırdım ve ufak bir tebessüm eşliğinde başarılı bir şekilde tamamlandığını gördüm.
Runtime
İşe derlemek istediğimiz hedef plaformun runtime’ını yüklemek ile başlayalım. Bunun için sistem değişkenlerini derlemek istediğim plaforma göre çekip onun runtime’ını yükledim. Aşağıdaki gibi;
set GOOS=linux set GOARCH=amd64 go tool dist install -v pkg/runtime go install -v -a std make.bat
Burada linux/amd64 plaformundaki runtime’ı Go’ya yükle dedik.
Bu araç Go’nun pkg klasörüne gerekli dosyaları derleyip atıyor ve biz de linux/amd64 platformuna göre uygulamamızı compile edebilecek duruma geliyoruz.
Derleme
Dos komut istemini açıp uygulamamın dizinine eriştikten sonra aşağıdaki komutları çalıştrıdım. (IDE’den de build edebilirsiniz tabi.)
cd C:\uygulama\dizini set GOOS=linux set GOARCH=amd64 go build
Burada GOOS ile hedef platformu GOARCH ile de mimariyi belirliyoruz ve “go build” ile aduket’i atıyoruz. Kod’da bir problem yoksa nur topu gibi bir executable’ınız oluyor.
“go build” dedikten sonra ise runtime aşağıdaki gibi şımarabilir.
go build runtime: freebsd/amd64 must be bootstrapped using make.bat
Burada siz freebsd için amd64 platformunda bir derleme istiyormuşsunuz fakat bunun tool’unu yüklememişsiniz. Bir üstteki Runtime başlığı altında linux/amd64 için yaptığımız hareketinin ayrınızı freedbs/amd64 için yaptıktan sonra denerseniz bu plaforma görede derleyebilirsiniz.