在M1 Mac上編譯使用arm64原生go
go會在2021年2月發(fā)布的1.16版中正式Apple Silicon,即arm64架構(gòu)的Mac操作系統(tǒng),雖然還未正式發(fā)布,但目前go 1.16版已經(jīng)進入feature freeze期,只是會再修修bug,改進文檔等,喜歡嘗鮮的朋友,其實已經(jīng)可以在m1 mac里面下載go最新的源碼,然后編譯原生arm64版的go出來。
以下操作我全部在m1 mac mini上完成;并假設(shè)go的工具鏈安裝在 $HOME/goroots 路徑下。
mac上需要確保安裝有 rosetta 2(https://support.apple.com/en-us/HT211861)。
安裝go 1.15
自go 1.4開始,go的編譯器已經(jīng)實現(xiàn)了自舉,即我們可以使用go本身來編譯go,那么,為了在mac上使用arm64的go 1.16嘗鮮版,我們首先需要amd64的go 1.15。
說是安裝,但其實只需要下載就可以了:
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源碼倉庫:
cd $HOME/goroots
git clone https://go.googlesource.com/go gosource克隆github上的go源碼鏡像(github.com/golang/go)也行。
clone出來之后目前master分支便是 1.16 的預(yù)發(fā)布分支。
預(yù)編譯darwin/arm64
要編譯go的話,需要先預(yù)編譯 bootstrap 響應(yīng)的工具鏈,這個工具鏈本身也是需要是arm64版,不然最后make出來的還會是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 ,這是因為我們的go 1.15是amd64版,直接在m1 mac中運行時需要依賴 rosetta 2,而目前似乎rosetta 2對于go的協(xié)程異步搶占還有bug,因此需要關(guān)閉;否則編譯時會死鎖并出現(xiàn)錯誤:
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了 :)

搞定~
