近日,笔者在CentOS上编译安装新版本Golang源码(1.14)时,出现了一条报错信息,如下:
ERROR: Cannot find /root/go1.4/bin/go.
Set $GOROOT_BOOTSTRAP to a working Go tree >= Go 1.4.
想要编译安装的版本是1.14,为什么需先安装低版本的1.4呢?跟随我的脚步一起来看原因吧。
1. 为什么要先安装Go.1.4
带着这个问题,找到一份官方的 Go 1.5自举计划 。
什么是自举(bootstrapping)?
简言之:用要编译的目标编程语言编写其编译器(或汇编器)。
Go项目组在Go 1.5中将使用Go 1.4进行构建,Go源码树将完全消除所有C的代码。移除C编译器(5c,6c,8c,9c)。剩下的C程序将转成Go语言,包括Go compilers(golang.org/s/go13compiler), 汇编器和连接器(golang.org/s/go13linker)以及cmd/dist。如果这些程序都采用 Go编写,这会引发一个在完整构建源码的启动问题: 需要一个可用的Go工具链来构建Go工具链。
为了构建>=Go 1.5版本,需要先安装Go 1.4到$GOROOT_BOOTSTRAP,默认的$GOROOT_BOOTSTRAP是$HOME/go1.4,我们使用Go 1.4 作为启动的基础版本来编译工具链。
Go 1.4构建过程:
1.使用 gcc 或者 clang 构建 cmd/dist .
2.使用 dist、build 编译器工具链(gcc 或者 clang)
3.NOP
4.使用 dist 构建 cmd/go (as go_bootstrap)
5.使用 go_bootstrap 构建其他的标准库和命令
>=Go 1.5版本建过程:
1.使用Go 1.4构建 cmd/dist
2.使用dist构建编译器工具链
3.使用dist重新构建编译器工具链
4.使用dist构建cmd/go(go_bootstrap)
5.使用go_bootstrap构建其他标准库和命令
2. 编译安装Go 1.4
编译安装Go 1.4版本,大概需要下面几个步骤:
cd ~ && wget
tar -zxvf go1.4.linux-amd64.tar.gz
cd go/src/ && ./all.bash
cd ../.. && mv go /root/go1.4
到这里已经安装好了Go 1.4版本,可以开始安装其他>=1.5的版本。
3. 编译安装>=Go 1.5的版本
安装>=Go 1.5版本源码,步骤也非常简单:
1. 下载源码压缩包
2. 源码包解压缩
3. 进到src目录
4. ./all.bash
5. 设置环境变量