至今還沒仔細看過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使用