limitusus’s diary

主に技術のことを書きます

Goをビルドしてみた

Google が Go という言語処理系をリリースしたので、さっそくビルドしてみました。

環境

手順

環境変数の設定

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 を使っている環境でビルドしたので、さまざまな問題を避けるため

  1. 最初は bash でログインする
  2. .bashrc の中で zsh があることを確かめ、zsh を起動する

という処理を行っています。こういう変な設定をしていると環境変数がうまく処理できないらしく、単に 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