http://9legacy.org/download.html
僕の場合には環境変数
GOLANG=$home/src/golang
仮に Go 1.16.13 on plan9/amd64 をインストールするとすれば、ダウンロードしたファイルを $GOLANG にコピーして展開するとディレクトリ
$GOLANG/go-plan9-amd64-bootstrap
$GOLANG/bootstrap とする。
9legacy.org の配布ファイルは Linux でクロスコンパイルした痕跡が残っている。すなわち
$GOLANG/bootstrap/bin
go と gofmt が含まれているが、これは Linux のものである。Plan9 用のものは$GOLANG/bootstrap/bin/plan9_amd64
cp $GOLANG/bootstrap/bin/plan9_amd64/* $GOLANG/bootstrap/bin
このあと $GOLANG/bootstrap を "$GOLANG/go" と名前を変更し、環境変数 $GOROOT を
GOROOT=$GOLANG/go
path=($path $GOROOT/bin)
http://p9.local/admin/server.htmlip/ipconfig -P loopback /dev/null 127.0.0.1 ip/ipconfig -P loopback /dev/null ::1
なお、現在の loop back アドレスの設定状態は
cat /net/ipifc/1/status
Plan9 用の Go が既に動いていれば、それを使ってソースからコンパイルできる。ソースコードは直接 Go の公式ページ[1]からダウンロードする。例えばそれを go1.17.3.tar.gz とせよ。このファイルは展開するとディレクトリ go が生成されるように作られている。ところが$GOLANG/go が既に存在するので、古い方は $GOLANG/bootstrap とでも名前を変えておく必要がある。すなわち次のように行う:
cd $GOLANG mv go bootstrap tar -xf go1.17.6.src.tar # produces go GOROOT_BOOTSTRAP=$GOLANG/bootstrap cd go/src all.rc
Building Go cmd/dist using /usr/arisawa/src/golang/bootstrap Building Go toolchain1 using /usr/arisawa/src/golang/bootstrap. Building Go bootstrap cmd/go (go_bootstrap) using Go toolchain1. Building Go toolchain2 using go_bootstrap and Go toolchain1. Building Go toolchain3 using go_bootstrap and Go toolchain2. Building packages and commands for plan9/amd64. ##### Testing packages. ok archive/tar 0.090s ok archive/zip 0.295s ...
メッセージの詳細を示しておく: 詳細
「詳細」を見れば判るが、1箇所(go test proxy)でテストに失敗している。原因は(今の所)不明。
all.rc は内部で make.rc
Golang のアップデートにおける "Testing packages" は結構時間がかかる。
ここに書いた方法でやると、その間 Go を使えないことになる。Go を使ってサービスを行っている場合には、このことは問題なる。
ページ[1]では現在ではバイナリコードを含む配布をサポートしているのは、Windows、MacOS、FreeBSD および Linux のみである。しかし優秀なクロスコンパイラがあるので、上記 OS のいずれかを持っていれば、Plan9(9front を含む)でも最新の Go の版を直ちに使える。
僕の環境では Linux に(少し古い)Go のバイナリ版が既にインストールされていた。この Go のクロスコンパイラを利用して Go の最新版(Go1.17.6)を Plan9 にインストールする手順を解説する。(文献[3]を参考にした)
go1.17.6.src.tar.gz を手に入れる$GOLANG とする。僕の場合は $GOLANG は $HOME/src/golang にしている。(注意: 公式サイトの推奨インストール先は /usr/local/go である)$GOLANG/go が作られる。(従って既に $GOLANG/go があれば名称を変更しておく必要がある)amd64 と想定する。cd $GOLANG/go/src GOOS=plan9 GOARCH=amd64 make.bashすると、次のメッセージを出して終了する:
GOOS=plan9 GOARCH=amd64 make.bash Building Go cmd/dist using /home/arisawa/src/golang/go. (go1.17.6 linux/amd64) Building Go toolchain1 using /home/arisawa/src/golang/go. GOOS=plan9 GOARCH=amd64 make.bash Building Go cmd/dist using /home/arisawa/src/golang/go. (go1.17.6 linux/amd64) Building Go toolchain1 using /home/arisawa/src/golang/go. Building Go bootstrap cmd/go (go_bootstrap) using Go toolchain1. Building Go toolchain2 using go_bootstrap and Go toolchain1. Building Go toolchain3 using go_bootstrap and Go toolchain2. Building packages and commands for host, linux/amd64. Building packages and commands for target, plan9/amd64. --- Installed Go for plan9/amd64 in /home/arisawa/src/golang/go1.17.6 Installed commands in /home/arisawa/src/golang/go1.17.6/bin
$GOROOT を $GOLANG/go としよう。新たに生成されたコードは
$GOROOT/bin$GOROOT/pkg$GOROOT/src$GOROOT/bin/go と $GOROOT/bin/gofmt は Linux のコードであるgo と gofmt の Plan9 のコードは $GOROOT/bin/plan9_amd64/ にある。GOROOT=$GOLANG/go PATH=$PATH:$GOROOT/bin
注意: Go の実行コードの置き場所は1箇所にまとめた方が混乱が少ない。Linux の配布版は /usr/bin にコードを作るが、そこに古いコードが残っている可能性があるので注意。(僕は削除した)
なお、生成された go と gofmt は strip されていないので膨れている。Linux の場合 strip すれば 2/3 ほどに小さくなる。(Plan9 のコードは(Plan9 側で strip しても)殆ど小さくならない)
最後に、ディレクトリ $GOLANG/go 以下を Plan9 側に移す。生成されたコードのテストは Plan9 側で行う必要がある。
あとは Plan9 の環境変数
GOROOT=$home/src/golang/go path=($path $GOROOT/bin)
僕が Go を試したのは Go の初版がリリースされた年(2012)である[2]。従って今から 10 年も前になる。この頃に書いた僕の記事が[8]と[9]にある。しかしそれ以降は Go を使っていない。なぜか? Go が生成したコードが C で生成したコードに比べて数十倍から百倍も大きなサイズになるからである。この問題に関して Plan9 のメーリングリストに不満が寄せられていた。Rob は、アセンブラから C に変わったときも同じように言われたのだ... と返事をしていた。コードサイズの問題はハードウェア性能の進歩が解決するだろうと Rob は見通していたに違いない。
多様なシステムで共通の言語が利用できることは良いことである。しかし肝心の本家と分家の公式リリースには Go が含まれていない。コードサイズの問題も大きいが、(今の所)基本的に困っていないからではないかと思われる。Plan9 には優秀なスクリプト言語 rc が存在し、C でパーツを作り、rc で組み立てるのが Plan9er の基本的なプログラミングスタイルである1。従って C で書くプログラムは大きくはならない。単機能であり、他の OS のようにオプションの山にはならないのである。
rc-httpd はそうした極端な例であろう。この傾向は分家の方が強い
[1] Downloads
https://go.dev/dl/
[2] Release History
https://go.dev/doc/devel/release
[3] Download and install
https://go.dev/doc/install
[4] Installing Go from source
https://go.dev/doc/install/source
[5] Installation - 9legacy
http://9legacy.org/download.html
[6] Rob Pike
http://herpolhode.com/rob/
[7] Systems Software Research is Irrelevant
http://herpolhode.com/rob/utah2000.pdf (2000)
[8] 初めての Go lang
http://ar.nyx.link/blog/golang/ (2012)
[9] Speed comparison: CPython, PyPy, Lua, LuaJIT, C, Go
http://ar.nyx.link/blog/speed/ (2012)
Go が利用する環境変数は
go env
GOROOT である。
xxx.go を(お試しに)実行するにはgo run xxx.go arg1 arg2 ... # (1)
arg1 arg2 ... は xxx.go に与える引数であるが、必要がないなら書かない。また arg1 に Go のソースコードを与えた場合には別の意味になる。
(1)による実行コードは /tmp に生成され、実行後に自動的に消去される。消去されたくないなら
go build xxx.go # (2)
xxx は(2)を実行したディレクトリに生成される。従ってxxx arg1 arg2 ... # (3)
実行コードをコマンドとして活用したい場合には、実行コードの置き場所を決めておく必要があろう。この問題は GOPATH で扱われる。
$GOROOT である。他方、ユーザーが作成した、あるいは非公式の Go のソースプロクラムの置き場所は $GOROOT と区別したほうが良い。$GOPATH/src はそれらの(推奨される)置き場所である。
GOPATH の値はgo env GOPATH
GOPATH が設定されている場合には、この結果は環境変数 GOPATH に一致している。設定されていない場合には、$HOME/go となっている。従ってGOPATH=`{go env GOPATH}
$GOPATH が設定されているとして説明する。
$GOPATH/bin は、Go ユーザーによってコンパイルされた実行コードの、推奨される置き場所である。
go install xxx.go
$GOPATH/bin に xxx が生成されているはずである。これはgo build xxx.go
xxx である。
$GOPATH/bin に置かれている実行コードがコマンドとして利用できるようにするには、新しい path を
path=($path $GOPATH/bin)
GOPATH についての、詳しい解説は
go help gopath