hakeの日記

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

rubyのクロスコンパイル

もはや自分にとってザウルス上でのテキスト情報の整理を行う上で必須の存在になっているruby。せっかくcoLinux上のクロスコンパイル環境を構築したのだから、これくらいは自分でビルドしたいと思い、勉強をかねて挑戦。

$ tar zxvf ruby-1.8.4.tar.gz
$ cd ruby-1.8.4
  • とりあえずcoLinux上で動くrubyを作ってみる、これは./configure; makeで問題なく作成できた。
  • 次にザウルス用にクロスコンパイル、ちなみに使っているのはgcc3.4.6です。 ./configureの途中でsetpgrpがどーたらというエラーで止まってしまったのでググってみたところ「ac_cv_func_setpgrp_void=yes」というオプションが必要らしい、つけたら通った。
  • コンパイルしてできたバイナリをザウルスにインストールしたら、Ryby/Qteのアプリが動かない。libruby.so.1.8が必要らしい。というわけで「--enable-shared」をつけて再度ビルド
  • 今度はlibgcc_s.soが無いと怒られた。「-static-libgcc」をつけてたのに良くわからん。
  • Makefileの中を覗くとLDSHARED行に「-static-libgcc」を付けると良さそう、というわけで./configure時に付加
  • makeのログをみるとsocket.soのビルドに失敗してたので、メッセージ通りに「--enable-wide-getaddrinfo」を追加

追記

  • 最適化オプションについてネット上ではサイズを小さくする「-Os」が多く使用されているのでこちらにする。
  • 上で書いたsocket.soのビルド失敗については「--disable-ipv6」で対応するのが一般的らしい
  • 最終的に以下になった
$ export PATH=/usr/local/zaurus/bin:$PATH
$ export LD_LIBRARY_PATH=usr/local/zaurus/lib:$LD_LIBRARY_PATH

$ LDFLAGS='-static-libgcc' CFLAGS='-Os -static-libgcc -mcpu=xscale -mtune=xscale' \
  CC='arm-linux-gcc' LDSHARED='arm-linux-gcc -shared -static-libgcc' \
  ./configure --prefix=/opt/QtPalmtop \
  --host=arm-linux --target=arm-linux --build=i686-pc-linux-gnu \
  ac_cv_func_setpgrp_void=yes --enable-shared --disable-ipv6
$ make
$ su
# make DESTDIR=/ipkg/ruby install
  • 「-static-libgcc」の対策にもっと良い方法がありそうな気がする。
  • SL-C3000へのパッケージのインストールにやたら時間がかかるのが謎。プロセスを見たら全てのインストールファイルに対して「sh -c /lib/ld.so.2 --list file」を実行している。SL-C860だとこんなに時間かからないのに何故?
  • 自前のRuby/Qteアプリは動いているみたいなのでおっけー???


今回のは、zlibやらopensslやら外部のライブラリが使えないので使えるようにしてみたいなぁ。そのためにはzlibやらのコンパイルも必要なのか。。。