hakeの日記

Windows環境でプログラミングの勉強をしています。

rubyのクロスコンパイル(続き)

昨日の続き
cursesとreadlineをrequireできるようにしてみる。何故この二つかというとirbを使用しているときに上下カーソルキーでヒストリが利用できるようになるから、というのをdipusさんの1.8.4-2を試していて気がついた。
まずはncursesとreadllineのクロスコンパイルから

  • GNUなサイトからncurses-5.5.tar.gzとreadline-5.1.tar.gzを取ってきて展開 (追記:ncurses-5.5はzaurusでは使用できませんでした
  • 下の要領でクロスコンパイル。インストール先は/opt/QtPalmtop
$ LDFLAGS='-static-libgcc' CFLAGS='-Os -static-libgcc -mcpu=xscale -mtune=xscale' \
  CC='arm-linux-gcc' \
  ./configure --prefix=/opt/QtPalmtop \
  --host=arm-linux --target=arm-linux --build=i686-pc-linux-gnu
  --enable-shared (←これは付けなかったかも)
$ make
$ su
# export PATH=/usr/local/zaurus/bin:$PATH  ←readlineのインストールで必要、arm-linux-hogeにパスを通している
# make install
--with-curses-dir=/opt/QtPalmtop
--with-readline-dir=/opt/QtPalmtop
  • ライブラリはruby-1.8.4/.ext/の下に作成される。curses.soとreadline.soについて依存関係を確認
$ arm-linux-objdump -x xxxx.so | grep NEEDED
  • 普通にコンパイルするとreadline.soがlibreadline.so.5を必要とするようになってしまう。rubyのパッケージだけで動作させたい。スタティックリンクさせる明確なオプションが不明なので、とりあえずlibreadline.so.5を別名に変更してlibreadline.aだけが見えるようにしたらできたみたい。
  • パッケージ化してザウルスにインストールしたときに他のライブラリを必要とする旨のメッセージが出ないので良さそう。
  • irb上でrequre 'readline'するとfalseを返すのが謎、cursesはtrueを返す。でもサンプルを動かした限りではちゃんと動作してるんだよなぁ (コメントいただいて理由が判明しました。irb起動時に既にロードされていたのでfalseを返すのでした(^^ゞ)