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.html
ip/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