工具链介绍
go有两套编译工具链,分别是从plant9移植过来的gc和依赖gcc的gccgo。官方为gc工具链提供了二进制安装包和源码, 可以根据需要选择一种安装方式。gc工具链对操作系统和CPU类型的支持情况如下:
| 操作系统 | CPU类型 | 备注 |
|---|
| FreeBSD 8 or later | amd64, 386, arm | Debian GNU/kFreeBSD not supported; FreeBSD/ARM needs FreeBSD 10 or later |
| Linux 2.6.23 or later with glibc | amd64, 386, arm | CentOS/RHEL 5.x not supported; no binary distribution for ARM yet |
| Mac OS X 10.6 or later | amd64, 386 | use the gcc** that comes with Xcode** |
| Windows XP or later | amd64, 386 | use MinGW gcc. No need for cygwin or msys. |
对于其它操作系统或CPU类型,需要从源码编译gc工具链或使用gccgo。
- 如果使用cgo,则需要安装gcc;
- Xcode command tool是Xcode的一部分,它包含gcc编译器, 可以从Xcode的Componts->Downloads对话框中下载该tool。
安装
二进制安装
- 从官网下载二进制包如*go1.6.linux-amd64.tar.gz*
- 解压到
/usr/local目录:$ tar -C /usr/local -xzf go$VERSION.$GOOS-$GOARCH.tar.gz - 将/usr/local/go/bin添加到PATH中:$ export PATH=$PATH:/usr/local/go/bin
go默认假设被安装到/usr/loca/go,如果被安装到其它位置,则需要设置GOROOT环境变量。例如,二进制包被解压到$HOME目录,则设置如下:$ export GOROOT=$HOME/go$ export PATH=$PATH:$GOROOT/bin注意:只有当将go安装到非/usr/local目录时才需要设置GOROOT变量。
从源码编译安装
安装Go编译器二进制文件
1.4版本后的Go工具链是用go语言写的,如果要构建它,系统需要安装Go编译器:
- 如果系统已经有>= 1.4版本的go工具链,则将
GOROOT_BOOTSTRAP变量设置为所在目录;$ unset GOROOT GOPATH#如果系统已经有go工具链,需要清除`$GOPATH`和`$GOROOT`变量;$ export GOROOT_BOOTSTRAP=$HOME/local/go - 否则,需要下载1.4版本的go工具链,该版本是C写的,只依赖gcc和glibc;可以下载二进制或编译并安装源码,然后将
GOROOT_BOOTSTRAP变量设置为所在目录;$ cd /tmp$ git clone git@github.com:golang/go.git$ cd go$ git checkout -b 1.4.3 go1.4.3$ cd src$ ./all.bash#编译go 1.4.3$ export GOROOT_BOOTSTRAP=/tmp/go/go#GOROOT\_BOOTSTRAP缺省值为`$HOME/go1.4`,如果安装到其它位置,则需要重新定义;
使用GOROOT_BOOTSTRAP变量指定Go工具链位置(如果位于$HOME/go1.4,则无需指定)后,可以执行源码中的
bootstrap.bash脚本,生成支持
$GOOS、
$GOARCH指定的目标操作系统和架构的新工具链:$ GOOS=linux GOARCH=ppc64 ./bootstrap.bash该命令生成的工具链位于
../../go-${GOOS}-${GOARCH}-bootstrap.目录,可以设置为变量
GOROOT_BOOTSTRAP的值,用于后续编译源码;
编译最新的go源码
- 设置git代理:$ git config http.proxy http://user:passwd@host:port$ git config https.proxy https://user:passwd@host:port
- 设置go get代理$ export http_proxy=http://user:passwd@host:port
- 获取源代码:直接下载或者从git仓库clone。
- 从官网下载$ wget https://golang.org/dl/go$VERSION.src.tar.gz$ tar -xzvf go$VERSION.$OS-$ARCH.tar.gz
- 从git代码库clone:$ git clone https://go.googlesource.com/go #需FQ$ git clone https://github.com/golang/go.git$ cd go$ git checkout go1.6 #也可以切换到其它分支如master
- 编译源代码$ pwd/tmp/$ cd go/src$ ./all.bash#使用`GOROOT_BOOTSTRAP`指定的go 1.4版本以上的工具链来编译go源码...ALL TESTS PASSED---Installed Go for linux/amd64 in /tmp/goInstalled commands in /tmp/go/bin*** You need to add /tmp/go/bin to your PATH.go 会将安装位置记录到二进制的
GOROOT变量中,如果需要调整安装目录,可以设置$GOROOT_FINAL=/path/to/goTree, 这样编译完后会提示将/tmp/go移动到
/path/to/goTree目录(这个参数只能在编译阶段有效,如果在编译后移动Go tree则参考步骤5)。$ ls /tmp/go -Fapi/AUTHORSbin/CONTRIBUTORSdoc/favicon.icoinclude/lib/LICENSEmisc/PATENTSpkg/READMErobots.txtsrc/test/VERSION$ ls /tmp/go/bin#源码包自带的二进制工具命令, 没有 godocgogofmt$ ls /tmp/go/pkg/tool/linux_amd64/addr2lineasmcgocompiledistdocfixlinknmobjdumppackpproftour yacc$ /tmp/go/bin/go env |grep -E "GOROOT|GOTOOLDIR"GOROOT="/tmp/go" #可见Go tree被安装到预期位置GOTOOLDIR="/tmp/go/pkg/tool/linux_amd64"将/tmp/go/bin加入到PATH中,即可使用。 - 移动 Go 源码目录可以将编译过的Go Tree移动到其它目录,然后修改
GOROOT环境变量即可。$ mkdir /tmp/xxx$ export GOROOT=/tmp/xxx$ mv * /tmp/xxx$ /tmp/xxx/bin/go env |grep -E "GOROOT|GOTOOLDIR"GOROOT="/tmp/xxx" #Go tree和工具链自动调整GOTOOLDIR="/tmp/xxx/pkg/tool/linux_amd64"#设置PATH和GOPATH$ export PATH=/tmp/xxx/bin:$PATH$ which go/tmp/xxx/bin/go$ go versiongo version go1.4 linux/amd64 - 安装额外的工具如
godoc, vet, cover(二进制发布版中包含这些工具,无需额外安装):一些Go工具位于go.tools仓库中,需要额外安装。$ #安装所有工具:$ go get golang.org/x/tools/cmd/... #...是通配符,参考: go help packages$ go get golang.org/x/tools/cmd/godoc #只安装godoc工具$ ls bin/ #多了godocgogodocgofmt$ ls pkg/tool/linux_amd64/ #多了vet,coveraddr2lineasmcgocompilecoverdistdocfixlinknmobjdumppackpproftourtracevetyaccgo 命令会将godoc安装到$GOROOT/bin或者$GOBIN,其它的go tool如cover、vet安装到$GOROOT/pkg/tool/$GOOS_$GOARCH。可以用go tool cover或go tool vet命令来调用后面目录中的程序。
工具链测试
- 创建和设置GOPATH(非必须):$ mkdir -p $HOME/go/{src,bin,pkg}$ export GOPATH=$HOME/go$ mkdir $HOME/go/src/demo$ cd !$
- 编写一个测试文件如 hello.gopackage mainimport "fmt"func main() {fmt.Printf("hello, world
")}
- 编译并执行, -x选项可以打印出编译过程$ go build -x demo.goWORK=/tmp/go-build333633893mkdir -p $WORK/command-line-arguments/_obj/mkdir -p $WORK/command-line-arguments/_obj/exe/cd /home/ksyun/golang/src/home/ksyun/local/go/pkg/tool/linux_amd64/compile -o $WORK/command-line-arguments.a -trimpath $WORK -p main -complete -buildid ed5feda32ea5b5ab51ac7fe9d1193005f6f99836 -D _/home/ksyun/golang/src -I $WORK -pack ./demo.gocd ./home/ksyun/local/go/pkg/tool/linux_amd64/link -o $WORK/command-line-arguments/_obj/exe/a.out -L $WORK -extld=gcc -buildmode=exe -buildid=ed5feda32ea5b5ab51ac7fe9d1193005f6f99836 $WORK/command-line-arguments.amv $WORK/command-line-arguments/_obj/exe/a.out demohello, world
环境变量(可选)
编译工具链可以使用以下环境变量进行配置;
$GOROOT
构建时,值为all.bash脚本所在目录的父目录,会被写入到生成的二进制中;如果后续移动了安装目录,则使用该变量指定新的Go Tree顶层目录;$GOROOT_FINAL
一般和$GOROOT一致,定义在构建后的安装阶段安装到的位置;$GOOS和$GOARCH
交叉编译时,分别定义目标操作系统和体系结构,默认和$GOHOSTOS和$GOHOSTARCH一致。各组合如下:$GOOS $GOARCHAndroid armdarwin386darwinamd64darwinarmdarwinarm64dragonfly amd64freebsd 386freebsd amd64freebsd armlinux 386linux amd64linux armlinux arm64linux ppc64linux ppc64lelinux mips64linux mips64lenetbsd386netbsdamd64netbsdarmopenbsd 386openbsd amd64openbsd armplan9 386plan9 amd64solaris amd64windows 386windows amd64$ #交叉编译$ GOOS=windows GOARCH=amd64 go build$ file pssh.exepssh.exe: PE32+ executable for MS Windows (console) Mono/.Net assembly$GOHOSTOS和$GOHOSTARCH
编译工具链所在主机的操作系统和架构类型,必须与所在操作系统和CPU架构类型兼容;$GOBIN
如果设置,则所有的Go二进制程序将安装到此目录,而不是默认的$GOPATH/bin
参考
- Getting Started
- Installing Go from source
本文永久更新链接地址