GO(Golang) Cross Compile 구성

Mac에서 개발한 GO 애플리케이션을 Linux 64bit 머신에 배포하고 싶을 경우 크로스 컴파일(Cross Compile) 환경을 구성해야 합니다.

공식문서(https://golang.org/doc/install/source)에 설명된 내용으로 하다보니 잘 안되서 구글링한 결과를 토대로 재정리 했습니다.

기존에 pkg로 설치된 /usr/local/go 는 지워버리고, GOROOT 또한 $HOME/go로 변경했습니다.

환경변수와 설치 위치는 다음과 같습니다.

GO 1.4 : $HOME/go1.4

GO 1.6 : $HOME/go

export GOROOT=$HOME/go
export GOROOT_BOOTSTRAP=$HOME/go1.4
export GOPATH=/Workspace/go
export PATH=$PATH:$GOPATH/bin:$GOROOT/bin

크로스 컴파일일에는 GOROOT_BOOTSTRAP이라는 환경변수가 하나 더 필요한데, 이는 GO 1.4 버전이 위치한 곳으로 지정했습니다.

크로스컴파일의 기반이 될 GO 1.4부터 설치합니다.

# git clone https://go.googlesource.com/go $HOME/go1.4
# cd $HOME/go1.4/src
# git checkout release-branch.go1.4
./make.bash

빌드가 완료되면 다음과 같은 메시지가 나옵니다.

Screen Shot 2016-08-15 at 4.11.22 PM

이제 GOROOT로 사용할 GO 1.6 버전을 설치합니다.

# git clone https://go.googlesource.com/go $HOME/go
# cd $HOME/go/src
# git checkout release-branch.go1.6
# ./all.bash

마찬가지로 빌드가 완료되면 다음과 같이 PATH를 설정하라고 나옵니다.

Screen Shot 2016-08-15 at 4.19.46 PM

크로스 컴파일을 해보기전에, 맥환경에서 빌드 옵션없이 생성한 GO 실행파일을 Linux 64bit 머신에서 실행해봤습니다.

# vi test.go
package main
import "fmt"
func main() {
fmt.Println("Hello World")
}
간단한 GO 프로그램을 생성하고 빌드한 후 Linux 머신에서 실행하니
# go build test.go
# scp test ${SERVER}
Screen Shot 2016-08-15 at 4.23.48 PM
Screen Shot 2016-08-15 at 4.25.14 PM
HelloWorld 한줄 출력하는 프로그램인데도 Linux 에서는 실해이 안됩니다.ㅠ.ㅠ
이제 빌드 옵션을 통해 크로스 컴파일 후 다시 실행해봅니다.
# GOOS=linux GOARCH=amd64 go build test.go
# scp test ${SERVER}
Screen Shot 2016-08-15 at 4.26.03 PM
이제 되네요! GOOS와 GOARCH를 원하는 형태로 주고 빌드만 하면 이제 GO가 지원하는 모든 OS와 아키텍처에서 GO 애플리케이션을 실행 할 수 있습니다.
GO 에서 지원하는 OS와 아키텍처는 다음과 같습니다.
$GOOS$GOARCHdarwin386darwinamd64darwinarmdarwinarm64dragonflyamd64freebsd386freebsdamd64freebsdarmlinux386linuxamd64linuxarmlinuxarm64linuxppc64linuxppc64lelinuxmips64linuxmips64lenetbsd386netbsdamd64netbsdarmopenbsd386openbsdamd64openbsdarmplan9386plan9amd64solarisamd64windows386windowsamd64