This post is a continuation of my previous post on bootstrapping Go 1.5 on the Raspberry Pi.
Now that Go 1.5 is written entirely in Go there is a bootstrapping problem — you need Go to build Go. For most people running Windows, Mac or Linux, this isn’t a big issue as the Go project provides installers for Go 1.4. However, if you’re using one of the new platforms added in Go 1.5; ARM64 or PPC64, there is no pre built installer as Go 1.4 did not support those platforms.
This post explains how to bootstrap Go 1.5 onto a platform that has no pre built version of Go 1.4. The process assumes you are building on a Darwin or Linux host, if you’re on Windows, sorry you’re out of luck.
We use the names host and target to describe the machine preparing the bootstrap installation and the non Intel machine receiving the bootstrap installation respectively.
As always, please uninstall any version of Go you may have on your workstation before beginning; check your $PATH
and do not set $GOROOT
.
Build Go 1.4 on your host
After uninstalling any previous version of Go from the host, fetch the source for Go 1.4 and build it locally.
% git clone https://go.googlesource.com/go $HOME/go1.4 % cd $HOME/go1.4/src % git checkout release-branch.go1.4 % ./make.bash
This process will build Go 1.4 into the directory $HOME/go1.4
.
Notes:
- This procedure assumes that Go 1.4 is built in
$HOME/go1.4
, if you choose to use another path, please adjust accordingly. - We use
./make.bash
to skip running the full unit tests, you can use./all.bash
to run the unit tests if you prefer. - Do not add
$HOME/go1.4/bin
to your$PATH
.
Build Go 1.5 on your host
Now you have Go 1.4 on your host, you can use that to bootstrap Go 1.5 on your host.
% git clone https://go.googlesource.com/go $HOME/go % cd $HOME/go/src % git checkout release-branch.go1.5 % env GOROOT_BOOTSTRAP=$HOME/go1.4 ./make.bash
This process will build Go 1.5 into the directory $HOME/go
.
Notes:
- Again, we use
./make.bash
to skip running the full unit tests, you can use./all.bash
to run the unit tests if you prefer. - You should add
$HOME/go/bin
to your$PATH
to use the version of Go 1.5 you just built as your Go install.
Build a bootstrap distribution for your target
From your Go 1.5 installation, build a bootstrap version of Go for your target.
The process is similar to cross compiling and uses the same GOOS
and GOARCH
environment variables. In this example we’ll build a bootstrap for linux/ppc64
. To build for other architectures, adjust accordingly.
% cd $HOME/go/src % env GOOS=linux GOARCH=ppc64 ./bootstrap.bash ... Bootstrap toolchain for linux/ppc64 installed in /home/dfc/go-linux-ppc64-bootstrap. Building tbz. -rw-rw-r-- 1 dfc dfc 46704160 Oct 16 10:39 /home/dfc/go-linux-ppc64-bootstrap.tbz
The bootstrap script is hard coded to place the output tarball two directories above ./bootstrap.bash
, which will be $HOME/go-linux-ppc64-bootstrap.tbz
in this case.
Now scp go-linux-ppc64-bootstrap.tbz
to the target, and unpack it to $HOME
.
Notes:
- This bootstrap distribution should only be used for bootstrapping Go 1.5 on the target.
Build Go 1.5 on your target
On the target you should have the bootstrap distribution in your home directory, ie $HOME/go-linux-ppc64-bootstrap
. We’ll use that as our GOROOT_BOOTSTRAP
and build Go 1.5 on the target.
% git clone https://go.googlesource.com/go $HOME/go % cd $HOME/go/src % git checkout release-branch.go1.5 % env GOROOT_BOOTSTRAP=$HOME/go-linux-ppc64-bootstrap ./all.bash
Now you’ll have Go 1.5 built natively on your target, in this case linux/ppc64
, but this procedure has been tested on linux/arm64
and also linux/ppc64le
.