2011年12月24日土曜日

Solaris 11でmikutter用ruby環境を構築する

pkgsrcがうまくいかずぐぬぬしていたので、気をとり直してmikutterを動かしてみることにした。 ただ、ホストがXServerを動かせるような環境では無いので、sshでXをforwardして起動する。 また、リポジトリにはruby1.8.7しか無いため、ruby1.9.3はソースからビルドする。

pkg install gcc
pkg install system/header
pkg install library/desktop/gtk2
pkg install x11/session/xauth
pkg install system/font/truetype/ipafont
wget ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.9.3-p0.tar.gz
tar xzf ruby-1.9.3-p0 && cd ruby-1.9.3-p0
./configure --prefix=/usr/ruby && make && make install
/usr/ruby/bin/gem install gtk2

だいたいこんな感じでmikutterを実行できるruby環境が出来上がる。 あとはいつも通りmikutterをcheckoutして実行すればよい。

Solaris 10(SPARC)の時はやたら苦労したのに、 今回はすんなり通ってしまいあっさり終わってしまった。

Solaris 11でpkgsrcを使う

poolがv33なZFSを試そうとOracle印のSolaris 11を入れてみた。 しかしパッケージが古かったり無かったりするものが多くてよろしくないので、 pkgsrcを導入した。その流れをさっとまとめておく。

pkg install git
pkg install gcc
pkg install system/header
zfs create -o mountpoint=legacy rpool/netbsd
zfs create -o mountpoint=/usr/pkg rpool/netbsd/pkg
zfs create -o mountpoint=/usr/pkgsrc rpool/netbsd/pkgsrc
git clone https://github.com/jsonn/pkgsrc /usr/pkgsrc
cd /usr/pkgsrc/bootstrap
./bootstrap.sh --prefix=/usr/pkg

bootstrapを開始して数分、以下のようなエラーが発生。

checking how to run the C preprocessor... cpp
configure: error: in `/usr/pkgsrc/bootstrap/work/wrk/devel/bmake/work/SunOS':
configure: error: C preprocessor "cpp" fails sanity check
See `config.log' for more details.
*** Error code 1

config.logを見たところ、/usr/gcc/binにPATHが通っていないので、 cppを見つけられずにコケている模様。 gcc自体には/usr/bin/gccにシンボリックリンクが張られていたので気が付かなかった。

rm -rf ./work /usr/pkg/* /var/db/pkg
PATH=$PATH:/usr/gcc/4.5/bin ./bootstrap --prefix=/usr/pkg

これでbootstrapは通った。

nbpatchがコケる

bootstrapが完了したので、早速tmuxあたりをインストールしてみることにしたのだが、 早速コケてしまった。libtoolにpatchを当てる際にnbpatchがエラー終了している様子。

miku@iroha:/usr/pkgsrc/devel/libtool$ sudo bmake 
=> Bootstrap dependency digest>=20010302: found digest-20111104
===> Checking for vulnerabilities in libtool-2.2.6b
===> Installing dependencies for libtool-2.2.6b
=> Build dependency nbpatch-[0-9]*: found nbpatch-20100124
=> Full dependency libtool-base-2.2.6b{,nb[0-9]*}: NOT found
=> Verifying package-install for ../../devel/libtool-base
=> Bootstrap dependency digest>=20010302: found digest-20111104
=> Bootstrap dependency tnftp-[0-9]*: found tnftp-20070806
===> Checking for vulnerabilities in libtool-base-2.2.6bnb5
=> Checksum SHA1 OK for libtool-2.2.6b.tar.gz
=> Checksum RMD160 OK for libtool-2.2.6b.tar.gz
===> Installing dependencies for libtool-base-2.2.6bnb5
=> Build dependency nbpatch-[0-9]*: found nbpatch-20100124
===> Overriding tools for libtool-base-2.2.6bnb5
===> Extracting for libtool-base-2.2.6bnb5
===> Patching for libtool-base-2.2.6bnb5
=> Applying pkgsrc patches for libtool-base-2.2.6bnb5
patch: **** too many file arguments
Patch /usr/pkgsrc/devel/libtool-base/../libtool/patches/patch-aa failed
patch: **** too many file arguments
Patch /usr/pkgsrc/devel/libtool-base/../libtool/patches/patch-ab failed
patch: **** too many file arguments
Patch /usr/pkgsrc/devel/libtool-base/../libtool/patches/patch-ac failed
patch: **** too many file arguments
Patch /usr/pkgsrc/devel/libtool-base/../libtool/patches/patch-ad failed
ERROR: Patching failed due to modified or broken patch file(s):
ERROR:  /usr/pkgsrc/devel/libtool-base/../libtool/patches/patch-aa
ERROR:  /usr/pkgsrc/devel/libtool-base/../libtool/patches/patch-ab
ERROR:  /usr/pkgsrc/devel/libtool-base/../libtool/patches/patch-ac
ERROR:  /usr/pkgsrc/devel/libtool-base/../libtool/patches/patch-ad
*** Error code 1

Stop.
bmake: stopped in /usr/pkgsrc/devel/libtool-base
*** Error code 1

Stop.
bmake: stopped in /usr/pkgsrc/devel/libtool-base
*** Error code 1

Stop.
bmake: stopped in /usr/pkgsrc/devel/libtool

sudo bmake PATCH_DEBUG=1 PKG_VERBOSE=1 PKG_DEBUG=yes PKG_DEBUG_LEVEL=2した場合のエラー部分はこんな感じ。

+ patches=/usr/pkgsrc/devel/libtool-base/../libtool/patches/patch-*
+ test -f /usr/pkgsrc/devel/libtool-base/../libtool/patches/patch-aa
+ test ! -f /usr/pkgsrc/devel/libtool-base/../libtool/distinfo
+ echo => Verifying /usr/pkgsrc/devel/libtool-base/../libtool/patches/patch-aa
=> Verifying /usr/pkgsrc/devel/libtool-base/../libtool/patches/patch-aa
+ /usr/bin/env DIGEST=/usr/pkg/bin/digest CAT=/usr/bin/cat ECHO=echo SED=/usr/gnu/bin/sed TEST=test /usr/pkg/bin/pdksh /usr/pkgsrc/mk/checksum/check
sum -p /usr/pkgsrc/devel/libtool-base/../libtool/distinfo /usr/pkgsrc/devel/libtool-base/../libtool/patches/patch-aa
+ > /dev/null 
+ 2>&1 
+ cksum_result=0
+ echo => Applying pkgsrc patch /usr/pkgsrc/devel/libtool-base/../libtool/patches/patch-aa
=> Applying pkgsrc patch /usr/pkgsrc/devel/libtool-base/../libtool/patches/patch-aa
+ fuzz_flags=
+ /usr/pkg/bin/nbpatch -v
+ > /dev/null 
+ 2>&1 
+ fuzz_flags=-F0
+ /usr/pkg/bin/nbpatch -F0 -d /usr/pkgsrc/devel/libtool-base/work/libtool-2.2.6b -E -p0 -V simple -z .orig
+ < /usr/pkgsrc/devel/libtool-base/../libtool/patches/patch-aa 
patch: **** too many file arguments
+ echo Patch /usr/pkgsrc/devel/libtool-base/../libtool/patches/patch-aa failed
Patch /usr/pkgsrc/devel/libtool-base/../libtool/patches/patch-aa failed
+ fail= /usr/pkgsrc/devel/libtool-base/../libtool/patches/patch-aa

他のパッケージでもnbpatchがエラーを吐いてコケてしまいまったくビルドが通らない。 さてどうしたらいいものか...

2011年12月21日水曜日

Debian/kFreeBSD(wheezy)に9.0のカーネルが登場

Debian流にFreeBSDが利用できることで期待のDebian/kFreeBSD。 そのテスト版に、そろそろ正式版リリース予定のFreeBSD 9.0のカーネル類が提供されたようなので、 早速試してみた。

まずはカーネル。直接wheezyをインストールしようと試したもののうまく行かず、 今回もsqueezeからのアップグレードでwheezyを入れた。 アップグレード方法はlinuxなdebianと同じく、sources.listを書き換えて更新するだけ。

FreeBSDといえばZFS。8.3以降はpoolのバージョンが28になるということで、 こちらもv28になっていることが確認できた。 zfsutilsをインストールすることで利用できるようになる。

FreeBSDといえばもうひとつ、jailがある。こちらも最近ようやくDebian/kFreeBSDに提供されて、 wheezy以降なら利用できる。debianなのでjail環境はdebootstrapで一発作成。

そして、BSDといえばpfも使える。まだpflogは使えない(?)ようだが、 とりあえずpfそのものを有効にすることはできる。

これ以外にも追加されつつある機能はいろいろとあるもよう。 ただ、testingだけあって安定性の面でやはりまだ難がある (この記事を書くにあたっても、1度ファイルシステムが壊れた) ようなので、常用するには難があるかもしれない。

2011年12月11日日曜日

ruby/dlでの構造体の扱いについて

ruby/dlでlibaoを使うでCのライブラリをCでラッパを書かずにrubyから利用できることは分かった。 ただ、構造体の扱いが少々面倒臭いことが分かったので、纏めておく。

構造体のメンバに構造体が存在する場合

構造体の定義はDL::Importer#structを用いて行うことができるが、 構造体のメンバに構造体が存在する場合、それを自動的に展開はしてくれない。

例えば、以下のような2つの構造体があったとする。

typedef struct info{
  int no;
  char *name;
} info;

typedef struct namelist{
  info first;
  info second;
  info third;
} namelist;

これをDL::Importer#structに渡す際には、以下のように書きたくなるが、 これではnamelist構造体のメンバであるinfoがうまく展開されない。

Info = struct(['int no', 'char *name'])
NameList = struct(['info first', 'info second', 'info third'])

以下のように手動で展開する必要がある。

NameList = struct(['int first_no', 'char *first_name',
  'int second_no', 'char *second_name', 
  'int third_no', 'char *thrd_name'])

関数の引数に構造体のポインタを渡す場合

関数の引数に構造体のポインタを渡す場合は、ruby/dl側でvoid *に自動的に変換するようなので、 そのまま渡して構わない模様。

# int check(namelist *list);
extern('int check(namelist *list)')

関数の引数に構造体そのものを渡す場合

aliasできる型が無いのでDL::Imprter#typealiasも利用できないし、どうしたらいいものか…と悩み続けて数週間。 入れ子の構造体同様に定義してしまえばよいということにようやく気がついた。

# int check(namelist list);
extern('int check(int first_no, char *, int , char *,  int, char *)')

あとはrubyから呼ぶ際にメンバの順番通りに引数を渡せば良い。

ここまでくるのにだいぶ長期間悩んでしまったが、まぁなんとかなったのでよしとしたいところ…orz。