龍芯的go之路(一)-在龍芯中安裝go

哈哈哈hh發表於2021-09-10

工具與資源中心

幫助開發者更加高效的工作,提供圍繞開發者全生命週期的工具與資源

https://developer.aliyun.com/tool?spm=a1z389.11499242.0.0.6545241364KBGP&utm_content=g_1000295017


龍芯派2代的go語言配置,以及安裝go-opencv

  • go語言作為後起之秀,我們在龍芯派這個國產硬體上配置go語言所需的環境顯得十分的有必要了,同時我們也安裝下go語言下的opencv

一.直接使用自帶的yum源安裝包裡的go進行安裝

  • 直接使用yum install 即可 可以使用yum search 查詢一下

二、從原始碼構建Go語言環境

由於當前最新發布的Go語言的穩定版本為Go 1.6,並且官方從該版本開始正式支援MIPS架構的處理器,故筆者以Go 1.6為例展示Go語言環境在龍芯平臺上的構建方法。為了最大限度減少Go語言對其它程式設計工具的依賴,從Go 1.5開始,Go語言的編譯器、彙編器和連結器等底層工具鏈全部使用Go語言來實現。故自Go 1.5開始,從原始碼安裝Go語言環境時需要使用現成的Go語言編譯器來編譯Go的原始碼,上述過程稱為Go語言的自舉編譯。因此,從原始碼安裝Go 1.6時要求系統中存在Go 1.4及其以上的Go語言環境。 由於官方從Go 1.6才開始正式支援MIPS架構,因而無法找到現成的可用於在龍芯上進行自舉編譯的低版本Go編譯器。好在Go語言提供了友好的交叉編譯功能,我們可以藉助X86的機器編譯一個MIPS平臺的Go編譯器,用作在龍芯上從原始碼構建Go 1.6的自舉編譯器。因此,在龍芯平臺上從原始碼構建Go 1.6的環境必須分成兩個階段進行:

1) 在X86平臺上交叉編譯出面向MIPS平臺的Go語言自舉編譯工具鏈;

2) 在龍芯平臺上利用1)中的Go自舉編譯器構建Go 1.6開發環境。

下面筆者逐步向大家展示Go 1.6環境在龍芯平臺上的構建過程。等大家走完整個過程就會發現,在龍芯上從原始碼安裝Go語言環境非常簡單。

第一階段:在X86平臺上交叉編譯出面向MIPS平臺的Go語言自舉編譯工具鏈。

隨便找一臺裝有64位Linux作業系統的X86電腦,逐步執行以下命令。

1. 下載Go 1.4(或者更高版本)的二進位制發行版作為交叉編譯的自舉編譯工具鏈 筆者選擇Go 1.4的發行版作為在X86上編譯Go 1.6原始碼的自舉編譯器。由於官網   在國內無法正常訪問,可以透過其映象站點  。筆者下載的檔案為go1.4.2.linux-amd64.tar.gz,大小約59 M。下載後可以解壓到任意目錄,例如可以透過如下命令將其解壓到/opt資料夾下並重新命名為go1.4.2:

$ tar xvzf go1.4.2.linux-amd64.tar.gz -C /opt
$ mv /opt/go /opt/go1.4.2

2. 配置交叉編譯的自舉編譯工具鏈

$ export GOROOT_BOOTSTRAP=/opt/go1.4.2

3. 下載Go 1.6的原始碼

$ cd ~/workspace/golang/$ git clone 

4. 切換到Go 1.6的發行版

$ cd go$ git checkout release-branch.go1.6

5. 交叉編譯 這一步透過執行指令碼bootstrp.bash完成。該指令碼執行前,需要透過環境變數GOOS和GOARCH分別指明交叉編譯的目標作業系統和處理器架構。

$ cd ~/workspace/golang/go/src$ GOOS=linux GOARCH=mips64le ./bootstrap.bash

接下來就是等待交叉編譯結束了。由於交叉編譯無需執行Go語言官方自帶的測試集,一般10分鐘內即可完成編譯。不出意外的話,整個過程應該非常順利。如果您看到以下提示,則表明交叉編譯成功。

----
Bootstrap toolchain for linux/mips64le installed in /home/fool/workspace/golang/go-linux-mips64le-bootstrap.
Building tbz.
-rw-rw-r-- 1 fool fool 46736199  6月  3 09:08 /home/fool/workspace/golang/go-linux-mips64le-bootstrap.tbz

交叉編譯所生成的面向MIPS平臺的Go語言自舉編譯工具鏈位於壓縮包/home/fool/workspace/golang/go-linux-mips64le-bootstrap.tbz中。將該壓縮包複製到龍芯電腦中備用。

第二階段:在龍芯平臺上從原始碼構建Go 1.6開發環境。

1. 解壓交叉編譯生成的面向MIPS平臺的自舉編譯工具鏈

$ tar xvjf go-linux-mips64le-bootstrap.tbz -C ~/workspace

2. 簡單檢驗自舉編譯工具鏈是否可用

$ cd ~/workspace/go-linux-mips64le-bootstrap/bin$ export GOROOT=/home/loongson/workspace/go-linux-mips64le-bootstrap$ ./go version

如果觀察到以下輸出,則基本可以說明交叉編譯沒有問題。

go version go1.6.2 linux/mips64le

3. 下載Go 1.6的原始碼並切換到Go 1.6的發行版。

$ cd ~/workspace$ git clone $ cd go$ git checkout release-branch.go1.6

4. 編譯配置 在當前目錄建立名為env.sh的shell指令碼,輸入以下語句後儲存退出。

#!/bin/bashexport GOROOT_BOOTSTRAP=/home/loongson/workspace/go-linux-mips64le-bootstrapexport GOROOT=/home/loongson/workspace/go

其中,GOROOT_BOOTSTRAP用於指向自舉編譯工具鏈的根目錄,GOROOT指向Go 1.6原始碼的根目錄。 執行env.sh,以完成編譯配置。

$ source env.sh

5. 首次編譯

$ cd src$ ./all.bash

上述指令碼執行時,首先會利用自舉編譯工具鏈完成對Go 1.6原始碼的編譯,生成龍芯上的Go 1.6環境。隨後利用官方的測試集對生成的本地Go 1.6進行測試。測試的過程相對漫長,需要耐心等待。約20分鐘後,測試期間中突然列印如下錯誤資訊:

ok      cmd/compile/internal/test    0.038s
ok      cmd/cover    18.360s
ok      cmd/doc    0.393s
ok      cmd/fix    0.192s
panic: test timed out after 3m0s
 
goroutine 489 [running]:
panic(0x120552480, 0xc4203087f0)
    /home/loongson/workspace/go/src/runtime/panic.go:500 +0x4c4testing.startAlarm.func1()
    /home/loongson/workspace/go/src/testing/testing.go:918 +0x168created by time.goFunc
    /home/loongson/workspace/go/src/time/sleep.go:132 +0x5c…
FAIL    cmd/go    208.996s
ok      cmd/gofmt    0.270s
ok      cmd/internal/goobj    0.064s
ok      cmd/internal/obj    0.032s
ok      cmd/internal/obj/x86    0.067s
ok      cmd/internal/pprof/profile    0.048s
ok      cmd/link    0.077s
ok      cmd/nm    9.304s

測試專案cmd/go沒有透過測試。這是為什麼呢?筆者起初懷疑編譯生成的Go 1.6可能有問題,反覆檢查了編譯引數的設定,但錯誤依舊。後來,考慮到官方既然已經宣佈Go 1.6直接支援MIPS,編譯出錯的機率應極小,更何況前面那麼多的測試專案都能正確執行。於是將思路從對編譯引數的檢查轉向對測試引數的排查。顯然,錯誤由測試超時導致,而預設的超時閾值僅為3分鐘。對於龍芯和ARM等低主頻的處理器,cmd/go測試項的執行時間可能會超過3分鐘。因此,在龍芯平臺上有可能需要適當增大測試超時的閾值。後來,經過一系列分析和排查,終於找到了環境變數GO_TEST_TIMEOUT_SCALE,用於對測試超時的閾值進行倍增。例如,若設定GO_TEST_TIMEOUT_SCALE = 2,則測試超時的閾值擴大為原來的兩倍,即由3分鐘增大到6分鐘。

6. 重新編譯 根據具體平臺的需要在env.sh中增加對環境變數GO_TEST_TIMEOUT_SCALE的設定,例如以下為適用於龍芯平臺的env.sh。

#!/bin/bash export GOROOT_BOOTSTRAP=/home/loongson/workspace/go-linux-mips64le-bootstrapexport GOROOT=/home/loongson/workspace/go 
# Added for Loongsonexport GO_TEST_TIMEOUT_SCALE=2

上述修改完成後,重新執行env.sh和all.bash這兩個指令碼。

$ cd ~/workspace/go$ source env.sh$ cd src$ ./all.bash

待指令碼執行結束後,如果觀察到如下輸出資訊,則說明龍芯平臺上Go 1.6的編譯和測試順利完成。整個過程約半小時。

ALL TESTS PASSED
---Installed Go for linux/mips64le in /home/loongson/workspace/go
Installed commands in /home/loongson/workspace/go/bin*** You need to add /home/loongson/workspace/go/bin to your PATH.

7. 安裝編譯生成的Go 1.6。 在~/.bashrc的末尾新增如下語句

export GOROOT=/home/loongson/workspace/goexport PATH=$PATH: $GOROOT/bin

然後執行

$ source ~/.bashrc

三、龍芯上Go語言對全世界的問候

激動人心的時刻終於到來了!我們先執行一下Go命令,列印一下版本資訊吧:

$ go versiongo version go1.6.2 linux/mips64le

接下來,我們來測試一下Go的“Hello World”!開啟任何一款文字編輯器,您可以使用Linux經典的vim,也可以使用更適合大眾的gedit,編寫hello.go檔案,僅需幾行程式碼:

package mainimport "fmt"func main() {
    fmt.Printf("Hello World!\n")
}

首先編譯原始碼hello.go。Go和C/C++語言一樣,屬於靜態編譯型語言。Go的源程式必須經過編譯後才能執行。

$ go build hello.go

上述命令會生成名為hello的可執行檔案。執行hello

$ ./hello
Hello World!

親自感受了Go語言在龍芯上的第一個HelloWorld,真是太令人興奮了! 上述編譯和執行的過程也可以使用go run命令一次性完成,例如

$ go run hello.goHello World!



本文轉自:https://developer.aliyun.com/article/790287?spm=a2c6h.12873581.0.0.6b4c767dbHK00x&groupCode=othertech

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70003733/viewspace-2791510/,如需轉載,請註明出處,否則將追究法律責任。

相關文章