2015年2月12日木曜日

はじめてのgo言語 ( cachectlを使おうとして、しかも中断)on ubuntu-12.04

本来の目的は、これを動かすことだった。linuxの仮想記憶から、特定のファイルキャッシュを追い出すらしい。余計なスワップを防いでメモリ節約が出来るらしい。

Page Cache Controller For Regular File in Go
https://github.com/cubicdaiya/cachectl

ご覧の通りのgithubそして、go言語。まあgo言語はボケ防止に始めようかと思ってたから丁度いい。と思ってたら結構ハマった。言語そのもじゃないところで。

ubuntuでgoを使う自体は簡単 glang-go ( golang-go 2:1-5 )  パッケージを入れればよい。

そこから先であった。go独特のお約束が出てくる。或いはチュートリアルを読めば書いてあるのだろうか。読まずに始める小生が悪いのだろう。小生は取扱い説明書は読まない人種であるからして。

ビルド手順を順番に試すが、初段でいきなり詰まる。

make gom

gomなるビルドツールが自動的に入るって話なのだが、
  • root権限が必要
    • 内部的に go get -u github.com/mattn/gom をやっていて、それにroot権限が必要らしい。
      • github.com/mattn は既にgo業界では有名人らしい ...
  • 入ってる筈のgomが何処だか判らない。
コマンドラインgoは、どうやら簡易なビルド&パッケージツールとしての側面を持ってるようだ。小生は昨今、LL言語ばかり使っていたのでこういう感覚がなくなっていたようだ。
go getは何をやってるのか、結論から言うと
  • $GOPATH/src にソース展開する。
    • github.comから勝手にfetchしてくれる。
    • なるほどgoはgithubと仲が良いと。
    • デフォルトは GOPATH=/usr/lib/go
      • root権限が必要な理由はコレ
      • export GOPATH=$HOME としておけば必要ない。
  • ビルド成功すると $GOPATH/bin にバイナリが入る。
    • 今回の場合は、当然のごとく /usr/lib/go/bin/gom に入ってる。
      • しかし/usr/bin/gom にシンボリックリンクを貼るとかはやってくれない。
      • GOPATH=/usr にすれば /usr/bin/gom が出来るかと思ったらそうでもなかった。
      • GOPATH=$HOME とかにしといて、PATH=$GOPATH/bin:$PATH で通しちゃった方が幸せかもしれない。
なるほど、ご時世に合わせてよく出来ている。が、それが馴染むまでは五里霧中だった。最終的にはstraceして体で覚えました。

ようやく次の手順で進める。

make bundle

ソース同梱のGomfileを使ってビルドが出来るわけだが、ここでまたハマった。依存パッケージの github.com/BurntSushi/toml のビルドに失敗する。
$ sudo go get github.com/BurntSushi/toml
# github.com/BurntSushi/toml
/usr/lib/go/src/pkg/github.com/BurntSushi/toml/decode_meta.go:70: function ends without a return statement
/usr/lib/go/src/pkg/github.com/BurntSushi/toml/encode.go:360: function ends without a return statement
/usr/lib/go/src/pkg/github.com/BurntSushi/toml/encode.go:467: function ends without a return statement
/usr/lib/go/src/pkg/github.com/BurntSushi/toml/encode.go:476: function ends without a return statement
/usr/lib/go/src/pkg/github.com/BurntSushi/toml/lex.go:77: function ends without a return statement
/usr/lib/go/src/pkg/github.com/BurntSushi/toml/lex.go:263: function ends without a return statement
/usr/lib/go/src/pkg/github.com/BurntSushi/toml/lex.go:284: function ends without a return statement
/usr/lib/go/src/pkg/github.com/BurntSushi/toml/lex.go:299: function ends without a return statement
/usr/lib/go/src/pkg/github.com/BurntSushi/toml/lex.go:316: function ends without a return statement
/usr/lib/go/src/pkg/github.com/BurntSushi/toml/lex.go:338: function ends without a return statement
/usr/lib/go/src/pkg/github.com/BurntSushi/toml/lex.go:338: too many errors
ご覧の通りのエラーで進まない。ちなみにこの手の外部パッケージは lib*.a が出来上がるようだ。良くできてる。

このエラーメッセージは既知の問題であった。ソースを書き換える必要がありそうだ。

https://groups.google.com/forum/#!topic/golang-nuts/u66fQbfbzEo

うーん、そこまでは今すぐは無理だな。AM2時だし!

その後、ubuntu 14.10で試したらアッサリビルド通りましたorz