至今还没仔细看过make.bash的内容。这篇算是阅读笔记了。
首先是make.bash中用到的环境变量:
goroot_final:go源码的根目录,这个变量的是在gcc的时候使用的,如果你设置了这个,gcc的-d参数就是你设置的
gohostarch:go所在的宿主机器的架构,当然这里指的是cpu的架构
goarch:安装包和工具所在的机器的架构。
goos:安装包和工具所在的机器的操作系统。
go_gcflags:是否要在编译的时候需要带上5g/6g/8g的参数
go_ldflags:是否要在链接的时候带上5l/6l/8l的参数
cgo_enabled:是否能使用cgo
对于环境变量,你可以在编译完成后使用dist工具来查看,比如:
yejianfengtekimacbook-air:darwin_amd64 yejianfeng$ ./dist env
goroot="/users/yejianfeng/software/go"
gobin="/users/yejianfeng/software/go/bin"
goarch="amd64"
goos="darwin"
gohostarch="amd64"
gohostos="darwin"
gotooldir="/users/yejianfeng/software/go/pkg/tool/darwin_amd64"
gochar="6"
下面一个情境:amd64的机器上,下载了一份源码,所以gohostarch是设置成为amd64,但是我现在想写的是intel x86-32的go可执行文件,所以设置goarch为intel86。这就是交叉编译的概念。
当然这两个环境变量是在编译出go工具的时候才有用,具体的编译go代码就没用了。
go tool命令后面可以跟其他的工具,比如pprof, yacc, api等。go tool实质上只是一个转发命令给这些工具,这些工具的源代码是放在goroot/src/cmd下面,这些工具的源码编译之后生成的二进制可执行文件就放在$gotooldir里面,具体的路径就在goroot/pkg/tool/(darwin_amd64)/下。
这个变量是在这句话中设置的
eval $(./cmd/dist/dist env -p)
go_bootstrap是什么?
我们可以看到go_bootstrap这个工具是使用dist工具bootstrap生成的。然后再使用go_bootstrap install来编译go的包。最后又悄悄地把go_bootstrap删掉。
我们还原一下,进入gotooldir,调用./dist bootstrap重新生成go_bootstrap
运行下你会发现,原来就是bin/go嘛,但是再看看大小,只有3m多,而完整的bin/go有5.6m。
所以可以推断go_bootstrap是包含了基本的go代码编译能力的工具。
其实也是几句话就能说清楚:
1 先gcc编译出dist
2 dist编译出go代码基本编译器go bootstrap
3 用go bootstrap编译出go的src中的其他go源码
4 将其他所有工具生成放在src/cmd下供bin/go使用