Macbook M1을 구입하고, 대체로 만족하면서 사용하고 있었는데
막상 go source code를 작성하고 compile하려고 생각해보니, 실제로 실행 파일(executable file)을 돌릴 대상 장비가 x86 cpu를 사용하는 경우가 대부분이라서 cross compile 필요성을 느꼈다.
아직 한번도 go cross compile을 하지 않았던터라, 이번 기회에 짧게 메모를 해본다.
cross compile 지원되는 OS와 CPU architecture 확인
$ go tool dist list
aix/ppc64
android/386
... 중간 생략 ...
darwin/amd64 <-- Intel Mac을 사용하는 경우
darwin/arm64 <-- M1 Mac을 사용하는 경우
...
linux/386
linux/amd64 <-- Intel Linux를 사용하는 경우 (아마 대부분 이 경우가 아닐까?)
linux/arm
linux/arm64
... 중간 생략 ...
windows/386
windows/amd64
windows/arm
windows/arm64
$
go cross compile
Case: Linux OS & Intel CPU
M1 Macbook에서 Linux OS에서 돌릴 executable file을 build하는 방법이다.
GOOS=linux GOARCH=amd64 환경 변수만 설정하고, go build 명령을 수행하면 Linux OS에서 돌아가는 실행 파일이 만들어진다.
$ go mod init andrew.space/myapp
$ go mod tidy
$ GOOS=linux GOARCH=amd64 go build
$ ls
myapp
$
Case: Linux OS & ARM CPU
Intel Macbook에서 M1 Macbook에서 돌릴 executable file을 build하는 방법이다.
GOOS=darwin GOARCH=arm64 환경 변수만 설정하고, go build 명령을 수행하면 M1 Mac OS에서 돌아가는 실행 파일이 만들어진다.
(여담이지만, 이미 M1 Mac OS는 OS 자체적으로 Intel->ARM 구조로 변환해주는 기능이 있어서 굳이 이렇게까지 열심히 Cross compile을 하지 않아도 된다)
$ go mod init andrew.space/myapp
$ go mod tidy
$ GOOS=darwin GOARCH=arm64 go build
$ ls
myapp
$
Case: 다양의 OS와 CPU에 대한 일괄적으로 Cross Compile하기
매번 대상 OS와 CPU에 맞춰서 Cross Compile하기 귀찮다면, 아래와 같이 모든 OS, CPU에 대해서 Cross compile하도록 script를 만든다.
#!/usr/local/bin/bash
archs=(amd64 arm64 ppc64)
for arch in ${archs[@]}
do
env GOOS=linux GOARCH=${arch} go build -o myapp_${arch}
done
Tip: .bashrc 파일에 GO 환경 변수 설정
위에서 설명한 $GOOS, $GOARCH 환경 변수를 매번 타이핑하기 싫다면
아래처럼 .bashrc 파일에 한번만 기록해놓자!!!
$ cat ~/.bashrc
... 중간 생략 ...
##
## For GoLang
##
export GOPATH=$(go env GOPATH)
export GO111MODULE=on
export GOOS=linux
export GOARCH=amd64
... 중간 생략 ...
$
'Golang' 카테고리의 다른 글
go build 할 때 app version, build date, dev note를 추가하는 방법 (0) | 2022.07.05 |
---|---|
Go Package 및 Module 사용 예제 (0) | 2022.03.06 |
Golang REST API (0) | 2022.02.11 |
Go 언어 - Cobra Library를 이용하여 CLI Command 구현 (0) | 2021.11.24 |
Golang으로 App 개발시 폴더 초기화 작업(go mod init 및 tidy) (0) | 2021.06.25 |