in Go

Çözüm: Go Programlama Dilinde Windows Cross Compiling

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.

as-error-1

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.

Yorum Bırak

Comment