Goをビルドしてみた
Google が Go という言語処理系をリリースしたので、さっそくビルドしてみました。
環境
- Debian GNU/Linux
- 2.6.26-2-amd64 #1 SMP Wed Aug 19 22:33:18 UTC 2009 x86_64 GNU/Linux
手順
環境変数の設定
Go では環境変数をいくつか設定しておく必要があります。これはその場で設定するのではなく、~/.bashrc などに書いておく必要があるようです。
また、$GOBIN を設定したところには予め $PATH に追加しておく必要があります。
hg clone
公式ページの手順通りに hg clone します。
% env | grep GO GOBIN=/home/limit/local/go GOARCH=amd64 GOROOT=/home/limit/hg/go GOOS=linux $ hg clone -r release https://go.googlecode.com/hg/ $GOROOT
処理系のビルド
普段 NIS を使っている環境でビルドしたので、さまざまな問題を避けるため
という処理を行っています。こういう変な設定をしていると環境変数がうまく処理できないらしく、単に src で ./all.bash を叩いても動きませんでした。
仕方がないので all.bash の中を見て、ある程度手作業でやってみることにしました。
all.bash は make.bash と run.bash を起動しているだけです。
make.bash の先頭では $GOROOT が正しく設定されているかどうかをチェックしていて、これが上記の原因でうまく通っていませんでした。したがってそこを飛ばして、ビルドを行いました。このスクリプトの中で $GOBIN/quietgcc というスクリプトを生成していて、これを使っているため、 $GOBIN には $PATH が通っていないとダメです。
2009/11/12追記:これはこちらの勘違いだったようで、環境変数を正しく設定していたら上記の処理をした環境でも問題なく動作してくれました。
テスト
テストは run.bash で行われます。これは環境変数を気にせず、そのまま走らせました。
どうやら net のテスト付近で失敗したようです。
2009/11/12追記:このエラーは解消されました(エラーメッセージは下へ移動しました)。詳細は下記。
さしあたり、 src/pkg/Makefile の NOTEST リストに net を追加したところ他のテストはうまくいきました。
多分これのバグレポートを投げたりしないといけないですねー。
2009/11/12追記:投げました! net: TestDialError fails · Issue #32 · golang/go · GitHub
2009/11/12さらに追記:別の問題にMergeされていて、エラーメッセージが異なるから新たなIssueとして登録したはずなのに何かと思ったらこの net というテスト自体がテスト対象から外されたようです。これでエラーは出ません。net: TestDialError fails · Issue #23 · golang/go · GitHub
Python 的簡単さと C, C++ 的性能を持ち合わせるということなので期待です。
出ていたエラーメッセージ(解決したので移動しました)
make[2]: ディレクトリ `/home/limit/hg/go/src/pkg/net' に入ります 6g -o _gotest_.6 dnsclient.go dnsconfig.go dnsmsg.go fd.go fd_linux.go ip.go ipsock.go net.go parse.go port.go sock.go tcpsock.go udpsock.go unixsock.go dialgoogle_test.go ip_test.go net_test.go parse_test.go port_test.go server_test.go timeout_test.go rm -f _test/net.a gopack grc _test/net.a _gotest_.6 make[2]: ディレクトリ `/home/limit/hg/go/src/pkg/net' から出ます throw: index out of range panic PC=0x2ada70fa4d38 throw+0x3e /home/limit/hg/go/src/pkg/runtime/runtime.c:74 throw(0x47f060, 0x0) runtime·throwindex+0x1c /home/limit/hg/go/src/pkg/runtime/runtime.c:47 runtime·throwindex() net·hostPortToIP+0x19a /home/limit/hg/go/src/pkg/net/ipsock.go:199 net·hostPortToIP(0x446170, 0x0, 0x3, 0x0, 0x464280, ...) net·ResolveTCPAddr+0x34 /home/limit/hg/go/src/pkg/net/tcpsock.go:61 net·ResolveTCPAddr(0x464280, 0x0, 0xf, 0x0, 0x4462f0, ...) net·Dial+0x2a3 /home/limit/hg/go/src/pkg/net/net.go:133 net·Dial(0x446170, 0x0, 0x3, 0x0, 0x4462f0, ...) net·TestDialError+0xbc /home/limit/hg/go/src/pkg/net/net_test.go:56 net·TestDialError(0x71017180, 0x2ada) testing·tRunner+0x22 /home/limit/hg/go/src/pkg/testing/testing.go:105 testing·tRunner(0x71017180, 0x2ada, 0x494a28, 0x0) goexit /home/limit/hg/go/src/pkg/runtime/proc.c:134 goexit() 0x2ada71017180 unknown pc goroutine 3: runtime·entersyscall+0x50 /home/limit/hg/go/src/pkg/runtime/proc.c:539 runtime·entersyscall() syscall·Syscall6+0x5 /home/limit/hg/go/src/pkg/syscall/asm_linux_amd64.s:41 syscall·Syscall6() syscall·EpollWait+0x84 /home/limit/hg/go/src/pkg/syscall/zsyscall_linux_amd64.go:132 syscall·EpollWait(0x6, 0x2ada, 0x70fc35b0, 0x2ada, 0x1, ...) net·*pollster·WaitFD+0xb5 /home/limit/hg/go/src/pkg/net/fd_linux.go:116 net·*pollster·WaitFD(0x70fc3000, 0x2ada, 0x399c0818, 0x0, 0x72, ...) net·*pollServer·Run+0x9e /home/limit/hg/go/src/pkg/net/fd.go:237 net·*pollServer·Run(0x70f5e580, 0x2ada) goexit /home/limit/hg/go/src/pkg/runtime/proc.c:134 goexit() 0x2ada70f5e580 unknown pc goroutine 1: gosched+0x34 /home/limit/hg/go/src/pkg/runtime/proc.c:515 gosched() chanrecv+0x318 /home/limit/hg/go/src/pkg/runtime/chan.c:319 chanrecv(0x70ff5e60, 0x2ada, 0x70fa3f68, 0x2ada, 0x0, ...) runtime·chanrecv1+0x50 /home/limit/hg/go/src/pkg/runtime/chan.c:415 runtime·chanrecv1(0x70ff5e60, 0x2ada) testing·Main+0x263 /home/limit/hg/go/src/pkg/testing/testing.go:132 testing·Main(0x4949f8, 0x0) main·main+0x23 /home/limit/hg/go/src/pkg/net/_testmain.go:21 main·main() mainstart+0xf /home/limit/hg/go/src/pkg/runtime/amd64/asm.s:55 mainstart() goexit /home/limit/hg/go/src/pkg/runtime/proc.c:134 goexit() make[1]: *** [test] エラー 2 make[1]: ディレクトリ `/home/limit/hg/go/src/pkg/net' から出ます make: *** [net.test] エラー 2