天天看點

go/src/make.bash閱讀環境變量為什麼有GOARCH和GOHOSTARCH的分别?GOTOOLDIR是什麼?整個make的流程是什麼樣的?

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

繼續閱讀