[Golang] Golang 在 ARM 上的交叉編譯(cross compile)與自動化

這次的主題要介紹Golang非常棒的功能,cross compile,並且以Raspberry Pi的ARM CPU架構為例。

前提介紹

Go提供了非常優秀的建置工具,讓你用來產生不同系統架構的執行檔(binary),更好的是你可以不用安裝目標系統架構。
這讓我們不用在Raspberry Pi上開發程式,卻可以讓我們在Mac上開發好程式碼,然後編譯出Raspberry Pi可以執行的binary。這就是我們今天要介紹cross compile的目的!

這次我們建立在之前介紹過的Build Golang Project in Jenkins基礎上,我們讓Jenkins也能build出ARM平台的code,就算沒有需要用到Jenkins的朋友,所有編譯的指令和環境也是一樣的喔!

建置 toolchain

  1. 在Jenkins中,新增一個新的"Go Installation" (“Manage Jenkins" -> “Configure" -> “Go" -> “Go安裝" -> “新增Go安裝程式")
  2. 新增一個新的Go,取名為"Go 1.4.2 Cross Compile"
  3. 因此,這個新的Go相關環境會被安裝在 “/var/lib/jenkins/tools/org.jenkinsci.plugins.golang.GolangInstallation/Go_1.4.2_Cross_Compile/" (路徑各個Jenkins安裝環境不同)

準備Go的cross compile環境

$ cd /var/lib/jenkins/tools/org.jenkinsci.plugins.golang.GolangInstallation/Go_1.4.2_Cross_Compile/
$ ./all.bash

下載工具golang-crosscompile

golang-crosscompile是一系列的script協助工具,用來協助你編譯不同環境的runtime

$ cd ~
$ git clone git://github.com/davecheney/golang-crosscompile.git
$ source golang-crosscompile/crosscompile.bash

開始製作相關runtime

$ export GOROOT="/var/lib/jenkins/tools/org.jenkinsci.plugins.golang.GolangInstallation/Go_1.4.2_Cross_Compile"
$ go-crosscompile-build-all
go-crosscompile-build darwin/386
go-crosscompile-build darwin/amd64
go-crosscompile-build freebsd/386
go-crosscompile-build freebsd/amd64
go-crosscompile-build linux/386
go-crosscompile-build linux/amd64
go-crosscompile-build linux/arm
go-crosscompile-build windows/386
go-crosscompile-build windows/amd64

等到上面的指令都執行完以後,恭喜你已經擁有全部Go支援的平台了,接下來我們來試試看怎麼cross compile吧!

切換 Build target

切換生成執行檔的指令非常簡單,我們這邊以Raspberry Pi的ARM CPU為例:

export GOARCH=arm
export GOOS=linux
export GOARM=7

Build code

當我們在環境變數中設定好確定要產生的build target後,只要跟平常一樣執行go install PACKAGE就行囉!

go install test.com/tester

檢查binary架構

‘file’指令可以讓我們知道這個檔案的file type

$ file bin/linux_arm/tester
bin/linux_arm/worker: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, not stripped
廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s