龙芯的go之路(一)-在龙芯中安装go

龙芯派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源代码的自举编译器。由于官网 https://golang.org 在国内无法正常访问,可以通过其镜像站点 http://golangtc.com/download进行下载。笔者下载的文件为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 https://github.com/golang/go.git

\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 https://github.com/golang/go.git
$ cd go
$ git checkout release-branch.go1.6

\4. 编译配置 在当前目录创建名为env.sh的shell脚本,输入以下语句后保存退出。

#!/bin/bash
export GOROOT_BOOTSTRAP=/home/loongson/workspace/go-linux-mips64le-bootstrap
export 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 +0x4c4
testing.startAlarm.func1()
    /home/loongson/workspace/go/src/testing/testing.go:918 +0x168
created 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-bootstrap
export GOROOT=/home/loongson/workspace/go
 
# Added for Loongson
export 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/go
export PATH=$PATH: $GOROOT/bin

然后执行

$ source ~/.bashrc

三、龙芯上Go语言对全世界的问候

激动人心的时刻终于到来了!我们先运行一下Go命令,打印一下版本信息吧:

$ go version
go version go1.6.2 linux/mips64le

接下来,我们来测试一下Go的“Hello World”!打开任何一款文本编辑器,您可以使用Linux经典的vim,也可以使用更适合大众的gedit,编写hello.go文件,仅需几行代码:

package main
import "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.go
Hello World!
上一篇:win10 环境下配置 openGL的freeglut、glew等库,使用openGL


下一篇:安装Ubuntu后必须要做的几件事(二)--开发工具篇