Plan 9で最初からGoをビルドする
Plan 9にGoをインストールするで書いた内容に従って、2025年夏の最新バージョンまでビルドしていく。
Go 1.4.3
Section titled “Go 1.4.3”C言語でビルドする。素のPlan 9ではうまく証明書が扱えないのでLinux等でダウンロードしておく。
curl -LO https://go.dev/dl/go1.4.3.src.tar.gzあとはPlan 9でバイナリだけビルド。
gunzip -c go1.4.3.src.tar.gz | tar xmv go go1.4cd go1.4/src./make.rcGo 1.9.7
Section titled “Go 1.9.7”一足飛びにGo 1.17やGo 1.11まで上げると runtime: garbage collector found invalid heap pointer というエラーになったので、一旦Go 1.9を経由する。これはGo 1.4.3を使ってビルドする。
curl -LO https://go.dev/dl/go1.9.7.src.tar.gzビルドの手順はGo 1.4と同じなので省略。
Go 1.11.13
Section titled “Go 1.11.13”Go 1.9.7を使ってビルドする。バージョンが手元にあったのでビルドしたが、これは飛ばしてGo 1.17まで上げてもいいかもしれない。
curl -LO https://go.dev/dl/go1.11.13.src.tar.gzGOROOT_BOOTSTRAP を明示的に与える必要がある。
gunzip -c go1.11.13.src.tar.gz | tar xmv go go1.11cd go1.11/srcGOROOT_BOOTSTRAP=$home/go1.9 ./make.rc -vソースコードの履歴によると、Go 1.10.0で make.rc の出力が
Building Go cmd/dist using /usr/glenda/go1.9. (go1.9.7 plan9/amd64)Building Go toolchain1 using /usr/glenda/go1.9.Building Go bootstrap cmd/go (go_bootstrap) using Go toolchain1.のようにシンプルなスタイルに変わってしまったが、make.rc に -v オプションを渡せるようになっていて、これを渡すと従来のスタイルで細かい進捗が出力されるようになる。Plan 9でビルドすると非常に遅く、特に1.20以降は数時間必要なので、基本的には -v オプションを設定するといい。
Go 1.17.13
Section titled “Go 1.17.13”Go 1.11を使ってビルドする。
curl -LO https://go.dev/dl/go1.17.13.src.tar.gzGOROOT_BOOTSTRAP を明示的に与える必要がある。
gunzip -c go1.17.13.src.tar.gz | tar xmv go go1.17cd go1.17/srcGOROOT_BOOTSTRAP=$home/go1.11 ./make.rc -vGo 1.21.13
Section titled “Go 1.21.13”Go 1.17を使ってビルドする。次のバージョンをビルドするために必要な最小バージョンは1.20だが、新しい方がなにかと良いだろうと思って、Go 1.17でビルド可能な中での最も新しいバージョンを選択した。
curl -LO https://go.dev/dl/go1.21.13.src.tar.gzGOROOT_BOOTSTRAP を明示的に与える必要がある。この辺りから pkg/$GOOS_$GOARCH に直接出力せず、/tmp/go-build-xxx 以下へバイナリを書き出して、その参照を pkg/obj/go-build に置くような構造に変わっているので ramfs すると多少早くなるかもしれない。
gunzip -c go1.21.13.src.tar.gz | tar xmv go go1.21cd go1.21/srcGOROOT_BOOTSTRAP=$home/go1.17 ./make.rc -vGo 1.22.12
Section titled “Go 1.22.12”Go 1.21を使ってビルドする。
curl -LO https://go.dev/dl/go1.22.12.src.tar.gzこれまでと変わらない。
gunzip -c go1.21.13.src.tar.gz | tar xmv go go1.22cd go1.22/srcGOROOT_BOOTSTRAP=$home/go1.21 ./make.rc -vGo 1.24.5
Section titled “Go 1.24.5”Go 1.22を使ってビルドする。
curl -LO https://go.dev/dl/go1.24.5.src.tar.gzこれまでと変わらないが、現時点ではこれが最新なのでリネームしない。
gunzip -c go1.24.5.src.tar.gz | tar xcd go/srcGOROOT_BOOTSTRAP=$home/go1.22 ./make.rc -v落ちた
Building Go toolchain3 using go_bootstrap and Go toolchain2.M structure uses sizeclass 1792/0x700 bytes; incompatible with mutex flag mask 0x3fffatal error: runtime.m memory alignment too small for spinbit mutexruntime: panic before malloc heap initialized
runtime stack:runtime.throw({0xc675e7?, 0x0?}) runtime/panic.go:1101 +0x49 fp=0x7fffffffee78 sp=0x7fffffffee48 pc=0x273529runtime.lockVerifyMSize() runtime/lock_spinbit.go:97 +0xc5 fp=0x7fffffffeea0 sp=0x7fffffffee78 pc=0x2175c5runtime.schedinit() runtime/proc.go:818 +0x34 fp=0x7fffffffef00 sp=0x7fffffffeea0 pc=0x244c74runtime.rt0_go() runtime/asm_amd64.s:349 +0x128 fp=0x7fffffffef08 sp=0x7fffffffef00 pc=0x278a28go: error obtaining buildID for go tool compile: exit status: 'compile 17771: 2'go tool dist: FAILED: /usr/glenda/go/pkg/tool/plan9_amd64/go_bootstrap install -v -a cmd/asm cmd/cgo cmd/compile cmd/link cmd/preprofile: exit status: 'go_bootstrap 17767: 1'似た話題はruntime: panic before malloc heap initialized on plan9/amd64で見つかったけどクローズされている。
Go 1.25rc2相当
Section titled “Go 1.25rc2相当”Go 1.22を使ってビルドするが、masterを拾ってきた。そうすると .git がなくてうまく動かないので手作業で VERSION を作成する。
go1.25rc2time 2025-07-29T12:08:00ZGo 1.24.5と同様に、現時点ではこれが最新なのでリネームしない。
unzip go-master.zipmv go-master gocd go/srcGOROOT_BOOTSTRAP=$home/go1.22 ./make.rc -v