Opie/arm


めまぐるしくかわる opie cvs の make 手順のメモとして。

qte 2.3.5

「すでに qte 2.3.5 が出ている (同時に qtopia 1.6.1 も出た)。 IM 周りに手が入った他、バグ fix 少々と、微妙にロバストになったかな。
でも 2.3.4 使った」 ── と書いていたが、さすがに 2.3.5 に移行した。

上記の二つを、この順で qt-embedded-2.3.5 にあてる。

qte235-opiecvs は、 cvs20030529 時点の opie に含まれる qte234 パッチのうち simpad パッチ以外を全て含んだもので、 opie cvs 自身に含まれる qt パッチを当てる場合には不要。 Simpad パッチを外すのは make 時に simpad 関連ヘッダファイル linux/switches.h を要求するため。
qte234-sla300 のほうは SL-A300 への対応コード。名前のまんま。

% export QTDIR=/home/src/Qt/arm/qt-2.3.5
% PATH=/opt/Embedix/tools/bin:${PATH}
% cd /home/src/Qt/arm/qt-2.3.5
% rm ../opie-cvs20030529-k4/qt/qte234-for-opie091-simpad.patch
% cat ../opie-cvs20030529-k4/qt/qt234-*patch | patch -p0
% zcat ../qte235-sla300-k4.diff.gz | patch -p1
% ./configure -qconfig qpe -depths 16,32 -xplatform linux-sla300-g++ \
              -system-jpeg -system-libpng -system-zlib -no-qvfb -no-vnc -no-xft
% emacs src/Makefile

QT_NO_FREETYPE をコメントアウトしたので libqte は libfreetype の FT_* を呼ぶようになったが、 リンクから外されているのでアプリの make の際に鬱陶しい。こっちでいれておく:

 - QT_LIBS_OPT     =   -lpng -lz -ljpeg
 + QT_LIBS_OPT     =   -lpng -lz -ljpeg -lfreetype

% cp /home/src/Qt/qt-2.3.5/bin/uic bin
% make
% strip lib/libqte*
Opie のアプリの link 段階で virtual table などが大量に undefined になる場合、 おそらく Qt の src/allmoc.cpp の作成に失敗している。 その場合は src/allmoc.cpp を消して Qt を作り直す。

それと、この段階で libqte を strip しておく。opie は libqte のタイムスタンプを見ているので、 opie を作ってから strip するとまた opie の make が始まってしまう。

opie cvs 20030529

パッチ: A300 への対応、sysinfo と、"SL-B600" を "SL-B500" に修正するくらい。 A300 以外では別にあてなくても動作的な問題はないし、 あてても A300 以外に有害な副作用があるわけではない。たぶん。

ちなみにいずれにしても opie cvs は C750 には対応していない。/proc/cpuinfo でマシンを判別してるが、 知らないマシンは SL-5500 (or 上記パッチだと SL-A300) になるので。

% export OPIEDIR=/home/src/Qt/arm/opie-cvs20030529-k4
% export QTDIR=/home/src/Qt/arm/qt-2.3.5
% export HOSTQTDIR=/usr/local/qt3
% export GSMLIBDIR=/home/src/Qt/arm/gsmlib-1.10
% zcat ../opie-cvs20030529-k4.diff.gz | patch -p1
環境設定を済ませてから make xconfig で configuration に入れることになっているが、そーなってない。 libkconfig.so がなくて途中で make xconfig に失敗する。 そのわりに先に libkconfg.so を作っておいても駄目で、一度は make xconfig してから戻ってくる。

% make xconfig
% pushd scripts/kconfig
% make libkconfg.so
% popd
% make xconfig

make xconfig てのは↓こんなの:

Linux kernel 2.5 の config もこんなんがサポートされたんだっけか ... と書きつつ kernel では普段 tcl/tk な config しか使ってないが。

make に入るまえに qmake を作成。

% pushd mkspecs
% ln -sf qws/linux-sharp-g++ default
% cd ../qmake 
% make
% popd
% make /home/src/Qt/arm/opie-cvs20030529-k4/gen.pro
これ、make gen.pro でいけそうなモンなんだが、make ./gen.pro でもダメだった。フルパス指定で make しておく。

... なんか、今やってみたらフルパス指定してもダメなんですけど(汗)。 Rules.make の中に $(TOPDIR)/gen.pro を作成する行があるので、 それを gen.pro にして make gen.pro して build 継続:

-$(TOPDIR)/gen.pro : $(TOPDIR)/.config
+gen.pro : $(TOPDIR)/.config
... うぅ、情けねぇ ...

なお、PC 用に qmake を make するときは

% pushd mkspecs
% ln -sf qws/linux-x86-g++ default
% cp qws/linux-sharp-g++/qplatformdefs.h qws/linux-x86-g++
% cd ../qmake 
% make
とした。qplatformdefs.h が linux-x86-g++ にも linux-generic-g++ にもないのに qmake 作成時に参照される。arm 特有の何かが入ってるわけではないので linux-sharp-g++ からもらってきた。 また、qt 2.3.x のと違い opie では linux-x86-g++ と linux-generic-g++ に違いがないので、どっちでも一緒。

さて、気をとりなおして一周目。20030419 の頃と違って依存性の前後関係に問題はなさげ。

% make

例によって 母艦の rpath 混入が気持ち悪いので ──

% for name in **/Makefile ; do
   if [ ! -f ${name}.org ] ; then
      mv $name ${name}.org
   fi
   sed 's#-Wl,-rpath,$(OPIEDIR)/lib##g' < ${name}.org > makefile.1
   sed 's#-Wl,-rpath,$(QTDIR)/lib##g' < makefile.1 > makefile.2
   sed 's#-Wl,-rpath,/home/src/Qt/arm/opie-cvs20030529-k4/.*##g' <  makefile.2 > ${name}
 done

としておいて make 二周目。

% pushd bin
% rm `file * | grep ELF | cut -f1 -d:`
% cd ../plugins
% rm **/*so*
% cd ../lib
% rm *so*
% popd
% make

バイナリは strip されてないので、bin や lib に入って strip しておく。

インストール
apps bin doc docs etc help i18n lib pics plugins share sounds を /opt/QtPalmtop にコピーするのは前と同じ。

なお、$OPIEDIR に /usr/local/opie を指定するなどして opie ディレクトリを移動することができるようにみえるが、 事実上 /opt/QtPalmtop 決め打ちである。 ... make 時点で /opt/QtPalmtop/lib が rpath に取り込まれたり、 opie-sh が /opt/QtPalmtop/bin/* を直叩きしていたりする。

freetype

Freetype をサポートさせてみたところ、特に速度低下もなく動いたのでいれてしまう。 11/10 に書いたのとたいしてかわりはないが、 include/freetype/config/ftoption.h での TT_CONFIG_OPTION_EMBEDDED_BITMAPS は define したままにした。 わりときゅーきょくの選択とゆーやつである:
define した場合。
特定のサイズに対して bitmap font が使われるようになり、 その領域の日本語フォントについて anti-alias できなくなるかわり文字の乱れが少なくなる。 ただし、その「特定のサイズ」とやら、実は A300 で必要になるサイズよりも大きかったりする。 一般に 12 〜 20pixels height のもので、A300 では 7 〜 11 あたりも欲しい。
undef した場合。
全領域について vector な glypth が使われるようになり、こころおきなく anti-alias が使えるが、埋め込み bitmap がある領域で品質の低下が心配。 ついでに言えば、anti-alias は normal の 8 倍のメモリを消費する。
define にしたということは日本語フォントに対して anti-alias を諦めた、ということに等しいが、 ... ま、仕方なかろ。 SDL 関連で anti-alias する時は 事前に pfaedit で embedded bitmap を除いとけば undef したのと同じことだ。

ついでに TT_CONFIG_OPTION_BYTECODE_INTERPRETER も define しといたが、 どんだけの違いがあるのかは不明。 これによる hinting 処理が意味をもってくるような領域よりも 小さいフォントしか使ってねーんじゃねーかという恐れが多分にあるのだな :-p

% apt-get source libfreetype6
% cd freetype-2.1.4
% bzip2 -d < freetype-2.1.4.tar.bz2 | tar -xv
% emacs include/freetype/config/ftoption.h
% ./configure --host=strongarm-linux
% OBJ_DIR=. LIBTOOL=libtool make

libfreetype と libqte の関係
libfreetype を build するときに参照されるヘッダは freetype ソース中のものだが、 libqte を build するときに参照する freetype 関連ヘッダは /usr/include/* のほうだ。

そして libqte 自体が TT_CONFIG_OPTION_EMBEDDED_BITMAPS を参照しているので、 libfreetype の設定を変えたら libfreetype.so.6 の入れ換えだけでなく、 /usr/include/freetype/config/ftoption.h あたりも正しく書き直し、 libqte を rebuild しなければならない。

anti-alias 絡みで libfreetype を入れ換えることはよくやるが、 ふつーそれに応じてヘッダを入れ換えたりはしないと思うので注意。
... という書き方をしているということはハマってたという自白でもあるやね (^^;

gsmlib

Opie の make xconfig で GSM 関連ツールを外そうとしても勝手に make される ── と書いていたが、最近の opie ではちゃんと config で gsm 関連を外せるようになったみたい。
以下はそういう意味では要らないかもしんないが残しておく。

gsmlib ってば、configure --host=arm-linux で cross build 出来ることになっているが、 なんか configure が途中でコケる。うぅ ...

% zcat gsmlib-1.10.tar.gz | tar -xv
% cd gsmlib-1.10
% ./configure
% for name in **/Makefile
  sed 's/CC = gcc/CC = arm-linux-gcc/g' < $name > makefile.1
  sed 's/CXX = g++/CXX = arm-linux-g++/g' < makefile.1 > $name
 fi
% mv libtools libtools.org
% sed 's#/usr/lib/ld#arm-linux-ld#g' < libtools.org > libtools
% make
真面目にやる気ないのがありあり:-p まあ make してもどーせ使わないし。

xine-lib-1

OpiePlayer2 が参照する。arm linux 向けの optimization は入っておらず、 いまんとこ -O3 で make してるだけなので video 再生としては事実上使い物にならない。 せめて X なみに Qt/Embedded の redraw が賢ければねぇ。

gsmlib と違い、configure は通るのだが、make でエラーでまくるので libxine だけ出来たとこであとは Debian sid の xine-lib からヘッダファイルだけもらって /opt/Embedix/tools/arm-linux/include/xine 下に置いた。
gsmlib と同じく、作ってもどーせ使わん。OpiePlayer2 の make テストのためだけに存在する。

% apt-get source xine-lib
% cd xine-lib-1-beta10
% ./configure --without-x --host=arm-linux
% make

opie cvs 20030419 (obsolete)

別にあてなくても動作的な問題はない (正確には、動作的に問題があるようなトコを訂正してるわけではない)。 sysinfo と、"SL-B600" を "SL-B500" に修正するくらい。

% export OPIEDIR=/home/src/Qt/arm/opie-cvs
% export QTDIR=/home/src/Qt/arm/qt-2.3.4
% export HOSTQTDIR=/usr/local/qt3
% export GSMLIBDIR=/home/src/Qt/arm/gsmlib-1.10
% pushd scripts/kconfig
% make xconfig
% make libkconfg.so
% popd
% make xconfig

make は少なくとも 2 段。

% pushd qmake 
% make
% popd
% make -i
% make
普通に流すと、libqmultikey.so が libqpickboard を要求するにもかかわらず、 libqmultikey.so を作る時点では libqpickboard が存在せず、 そしてそれを作る方法が makefile に書いてないため、libqmultikey の make で止まる。

一周目をエラー無視して流し、libqpickboard が出来たのちにもう一周回して libqmutikey を作る。

そして三周目。普通に作ると各バイナリのリンク時に -Wl,-rpath$(QTDIR) -Wl,-rpath$(OPIEDIR) を付ける。 QTDIR, OPIEDIR ともホスト環境のもので、気色悪いので外す。

ちなみにシャープのライブラリも objdump -p するとホスト環境の rpath がしっかり入っている。 ver1.1, 1.2, 1.3, 1.4 で少しずつ違い、 あ、ここで担当さんが変わったな〜とか思ったりもする。

閑話休題。make makefiles があれば makefile を先に作って〜ですむ話だが、 そーゆーのがないため一度 make して Makefile を作ってからでないと Makefile に手がいれられない。 -Wl,-rpath$(QTDIR) -Wl,-rpath$(OPIEDIR) を付けるのは qmake がやってるらしいのだが、なんかよーわからん。

% for name in **/Makefile ; do
   if [ ! -f ${name}.org ] ; then
      mv $name ${name}.org
   fi
   sed 's#-Wl,-rpath,$(OPIEDIR)/lib##g' < ${name}.org > makefile.1
   sed 's#-Wl,-rpath,$(QTDIR)/lib##g' < makefile.1 > makefile.2
   sed 's#-Wl,-rpath,/home/src/Qt/arm/opie-cvs/.*##g' <  makefile.2 > ${name}
 done
sed の 3 つ目のは、plugins の shared library に対して $(OPIEDIR)/plugins/ (を開いたもの) を -Wl,-rpath しようとするものを外している。 ちゃんと別に正しく -Wl,-rpath=/opt/QtPalmtop/plugins/ も付けてくれてるので、 $(OPIEDIR)/plugins/ は入れる必要はない。

というとこで make 三周目。

% pushd bin
% rm `file * | grep ELF | cut -f1 -d:`
% cd ../plugins
% rm **/*so*
% cd ../lib
% rm *so*
% popd
% make
リンクだけなのですぐ終わる。

OpenZaurus

ところで、opie に A/B/C への自動判別と対応が入り、 qte 側さえ A/B/C に合わせれば動くようになった。

ここで A300 と C700 は同じタッチパネルデバイスをもち、したがって C700 用の libqte は (極端に C700 向けにチューンされてたりするのでなければ) A300 でも使える。

... てことは、C700 用の OpenZaurus バイナリはそのまま A300 で動くのではないかと思うのだが、 どーだろ。


[日記へ] [目次へ]