반응형

gcc 컴파일 명령어를 사용할 때는 -D 옵션을 이용해서 Source Code 밖에서 상수를 지정할 수 있었다.

그런데, Go Language에도 이런 똑같은 기능이 있을까?

 

답: Go에도 GCC와 똑같은 기능이 있다!!!

 

아래 예제처럼 하면 된다. ^^

 


 

매번 go build 명령을 입력하기 귀찮으니까, 아래처럼 go build 스크립트를 만들자.

$ cat  my_go_build.sh

#!/bin/bash

export MY_APP_VERSION=0.1.0

go build -ldflags "-X main.appVersion=${MY_APP_VERSION} -X 'main.buildDate=$(date +%F) $(date +%T)' -X 'main.devNote=New Feature ABC is added'"

$

 

 

go source code를 작성하자. (아래는 예시를 위해서 간단하게 만든 것이니까, 참고만 할것 !!!)

$ cat main.go

package main

import (
        "fmt"
)

func main() {
    getAppVersion()

	// My Main Routine ...
    fmt.Printf("My Main Routing ...\n")
}

$

 

 `go build -ldflags "-X ... -X ... -X ..."` 이런 식으로 입력한 외부 상수를 go source code 내부에서 참조(reference)할 수 있도록 아래와 같이 변수를 선언하고, 사용하자 !!!

package main

import (
        "fmt"
)

var (
    appVersion string
    buildDate string
    devNote string
)

func getAppVersion() {
    fmt.Printf("App Name   : almighty\n")
    fmt.Printf("Version    : %s\n", appVersion)
    fmt.Printf("Build Date : %s\n", buildDate)
    fmt.Printf("Dev Note   : %s\n", devNote)
}

 

 

위와 같이 go source code가 작성되었다면, 아래와 같이 build하고 실행 바이너리 파일을 실행해보자.

 

$ my_go_build.sh

$ my_example_app

App Name   : almighty
Version    : 0.1.0
Build Date : 2022-07-05 16:18:12
Dev Note   : New Feature ABC is added
My Main Routing ...

$
반응형

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

... 중간 생략 ...

$

+ Recent posts