乐趣区

关于环境搭建:龙芯GoGoGo龙芯平台上构建Go语言环境指南

一、初识 Go 语言

Go 语言是 Google 公司于 2009 年正式推出的一款开源的编程语言,是由 Robert Griesemer、Ken Thompson 和 Rob Pike 等世界顶尖计算科学家精心打造的零碎编程语言。Go 语言最显著的特点是编码简洁迅速、反对高效并发和主动内存治理等。此外,Go 语言还面向网络服务器、存储系统和数据库等畛域的编程进行了优化设计,并且简化了利用零碎的装置和部署。因而,Go 语言受到了宽广程序员的青眼,越来越多地开始利用于谷歌和百度等出名中外企业的产品中。

Go 语言形象标识

对于这样一个在云计算和大数据时代最具发展前景的编程语言,龙芯平台能不能很好地反对呢?明天咱们就从 Go 的源代码开始,逐渐构建龙芯平台上的 Go 语言环境。只管笔者的试验机器为装置了龙芯开源社区版操作系统 Loongnix 的龙芯 3B 迷你电脑,本文的办法实用于所有 64 位操作系统的 MIPS 处理器平台。

二、下载 Go 语言的源代码

为了吸引更多的社区开发力量,Google 开源了 Go 语言的源代码,并托管于世界驰名的 github 网站中。咱们能够通过执行以下命令获取 Go 语言的全套源代码:

$ cd ~

$ git clone https://github.com/golang/go.git

上述命令要求您的电脑中装置了 git 版本控制工具。如果您的电脑中没有预装 git,能够通过如下命令疾速装置:

$ sudo yum install git

三、从源代码构建 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 语言自举编译工具链;
    1. 在龙芯平台上利用 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
    1. 配置穿插编译的自举编译工具链
    $ export GOROOT_BOOTSTRAP=/opt/go1.4.2
    1. 下载 Go 1.6 的源代码
    $ cd ~/workspace/golang/
    $ git clone https://github.com/golang/go.git
    1. 切换到 Go 1.6 的发行版
    $ cd go
    $ git checkout release-branch.go1.6
    1. 穿插编译 这一步通过执行脚本 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
    1. 简略测验自举编译工具链是否可用
    $ 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
    1. 下载 Go 1.6 的源代码并切换到 Go 1.6 的发行版。
    $ cd ~/workspace
    $ git clone https://github.com/golang/go.git
    $ cd go
    $ git checkout release-branch.go1.6
    1. 编译配置 在当前目录创立名为 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
    1. 首次编译
    $ 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 分钟。

    1. 从新编译 依据具体平台的须要在 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.
    1. 装置编译生成的 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!

    五、持续把玩 Go!Go!Go!

    看到这里,有读者不禁会问:除了运行简略的 HelloWorld,龙芯平台上的 Go 还能干什么?Go 语言具备不便移植的个性。所有利用 Go 语言编写的应用程序,通过相应平台的 Go 语言编译器编译后,都可能在该平台上运行。所以 Go 语言环境在龙芯平台上的胜利构建意味着龙芯领有了 Go 的全套软件生态。之前在 X86 或 ARM 等平台上搭建的基于 Go 语言的利用零碎,当初都可能以较低的代价迅速迁徙到龙芯平台上来。眼下基于 Go 的开源我的项目十分多,笔者没有工夫一一搭建。笔者生性好玩,故专门筛选了几个较为有意思我的项目进行试验。感兴趣的敌人能够尝试更多的我的项目。须要特地留神的是,在测试开源我的项目时,还须要额定 设置 GOPATH 环境变量。这是因为许多开源我的项目援用了 Go 语言的第三方库,须要从 GOPATH 环境变量指向的门路中加载第三方库或者将所援用的第三方库下载到该门路中。例如,笔者的设置如下:

    $ export GOPATH=/home/loongson/workspace/3rdpkg

    为了便于日后 Go 语言程序的开发,倡议将上述环境变量也退出到~/.bashrc 文件中。

    碰撞反弹游戏 (https://github.com/kurehajime/pong-command)

    游戏时,输出任意一个字符串(如 go1.6.2),该字符串会沿直线运动,遇到高低边界或左右围栏则镜面反弹。左侧围栏由电脑自动管制,右侧围栏由玩家操作。游戏的指标是管制右侧围栏在垂直方向的地位,使得字符串一直被碰撞反弹。

    龙芯平台上的碰撞反弹游戏

    汉语拼音转换工具(https://github.com/mozillazg/go-pinyin)

    将任意汉字转换成对应的汉语拼音。例如,输出“龙芯俱乐部”的执行状况如下:

    龙芯平台上的汉语拼音转换工具

    翻译助手 Utran(https://github.com/zengsai/utran)

    能够将英文翻译成汉语。例如,输出“This is go1.6.2 running on Loongson.”的执行状况如下:

    龙芯平台上的翻译助手 Utran

    排序算法可视化(https://github.com/SimonWaldherr/GolangSortingVisualization)

    可将常见的冒泡、抉择、插入和快排等排序算法的排序过程可视化。

    排序过程可视化

    六、遇到问题怎么办?

    以上是笔者在龙芯平台上从源代码构建 Go 语言环境的记录。读者依照这些操作步骤也应该能疾速构建好 Go 语言开发环境。如果遇到问题本人不能解决,龙芯社区提供了官网的 Bug 服务网站(http://bugs.loongnix.org/login_page.php), 您能够把遇到的问题提交下来,龙芯团队的人会及时为您解决。

    文章来源于龙芯开源社区
    龙芯技术社区

    退出移动版