在M1 Mac上編譯使用arm64原生go
go會(huì)在2021年2月發(fā)布的1.16版中正式Apple Silicon,即arm64架構(gòu)的Mac操作系統(tǒng),雖然還未正式發(fā)布,但目前go 1.16版已經(jīng)進(jìn)入feature freeze期,只是會(huì)再修修bug,改進(jìn)文檔等,喜歡嘗鮮的朋友,其實(shí)已經(jīng)可以在m1 mac里面下載go最新的源碼,然后編譯原生arm64版的go出來(lái)。
以下操作我全部在m1 mac mini上完成;并假設(shè)go的工具鏈安裝在 $HOME/goroots 路徑下。
mac上需要確保安裝有 rosetta 2(https://support.apple.com/en-us/HT211861)。
安裝go 1.15
自go 1.4開(kāi)始,go的編譯器已經(jīng)實(shí)現(xiàn)了自舉,即我們可以使用go本身來(lái)編譯go,那么,為了在mac上使用arm64的go 1.16嘗鮮版,我們首先需要amd64的go 1.15。
說(shuō)是安裝,但其實(shí)只需要下載就可以了:
mkdir $HOME/goroots
cd $HOME/goroots
wget https://dl.google.com/go/go1.15.6.darwin-amd64.tar.gz
tar xzf go1.15.6.darwin-amd64.tar.gz獲得go源碼
直接clone go源碼倉(cāng)庫(kù):
cd $HOME/goroots
git clone https://go.googlesource.com/go gosource克隆github上的go源碼鏡像(github.com/golang/go)也行。
clone出來(lái)之后目前master分支便是 1.16 的預(yù)發(fā)布分支。
預(yù)編譯darwin/arm64
要編譯go的話,需要先預(yù)編譯 bootstrap 響應(yīng)的工具鏈,這個(gè)工具鏈本身也是需要是arm64版,不然最后make出來(lái)的還會(huì)是x86。
cd $HOME/goroots/gosource/src
arch --x86_64 env GOROOT_BOOTSTRAP=$HOME/goroots/go GODEBUG=asyncpreemptoff=1 GOOS=darwin GOARCH=arm64 ./bootstrap.bash注意上面的編譯環(huán)境變量參數(shù)中有 GODEBUG=asyncpreemptoff=1 ,這是因?yàn)槲覀兊膅o 1.15是amd64版,直接在m1 mac中運(yùn)行時(shí)需要依賴 rosetta 2,而目前似乎rosetta 2對(duì)于go的協(xié)程異步搶占還有bug,因此需要關(guān)閉;否則編譯時(shí)會(huì)死鎖并出現(xiàn)錯(cuò)誤:
rosetta error: ulock_wait failure: 105
完成這步后,我們便可在 $HOME/goroots/go-darwin-arm64-bootstrap 路徑下獲得編譯完整go的arm64工具鏈
編譯arm64原生go
cd $HOME/goroots/gosource/src
arch --arm64e env GOROOT_BOOTSTRAP=$HOME/goroots/go-darwin-arm64-bootstrap ./make.bash這樣我們便可在 $HOME/goroots/gosource/bin/go 獲得arm64的go啦~export $HOME/goroots/gosource/bin 路徑去PATH,便可以在系統(tǒng)中使用原生的go了 :)

搞定~
