Python の Qt(/Embedded) 用モジュールである。 PyQt 本家にバイナリがあることはあるのだが、 SL-A300 では libqte の非互換(or バグ?) のため動かない。 具体的には
が無いといって止まる。 この constructor は libqte が参照していて、実体は libqpe に入っている。 本来 libqte から qtopia への参照があるはずがなく、 実際 SL5000 系の場合は libqte からの参照はない。 A300 の libqte がヘンなんだが、 これまで libqpe を使わない生粋の qt-embedded アプリが A300 に無いので露見しなかったバグということになる。QLibrary::QLibrary(QString const &, QLibrary::Policy)
qpe を置き換えた時と同様にして QLibrary::QLibrary() だけを qtopia-free からとってきて LD_PRELOAD するのは少し難しい。 内部的に (QUnknownInterface の) virtual function を叩いているので、 virtual function table の index がずれないことを保証するためには 本物の(つまり qtopia-free でない、Sharp の手の入った) クラスの継承関係の宣言が必要になる。 いちいち libqpe 全体をリンクするというのも重そうなんだが、 まーでも、どーせ libqpe はメモリの上にあるわけだしな。
方針としては三策。
どれが正しいかは何とも言えない。たとえば 1. の方法は 実直なんだが、他の qte (not qpe) アプリでは また上の constructor が無いといって実行できない訳である。 2 or 3 の方法は解決方法そのものがマトモでない。
とりあえず 3. の方法で解決してしまったもの:
qt module を import すると同時に読みこまれる libsip.so というものがあるが、 これが内部で libqte だけを呼んでいる。 この部分でひっかかっているので、libqpe も読み込むようにした libsip に交換した。この方法に価値があるのは PyQt の make に比べ SIP の make が格段に易しいからだが、 やろうと思えば SIP の rebuild すら必要なく、libsip の中で libqte.so.2 を呼んでいる部分を libqpe.so.1 にバイナリエディットしてしまえば (libqpe は libqte を呼んでるので) libsip は両方とも読み込むようになる。
2. の方法についてはまたそのうち。本質的には 3. と変わらんし。
1. の方法はさらに二策に分かれる。
なお、上の w3m は zaurus-ja の w3m と違い、ssl に対応したため ライブラリとして libssl, libcripto を要求する。たとえば:
control ファイルの Depends: には書いておいたんだが、そういう風にしといても qinstall は 「libssl, libcripto を入れろ」とは言わないらしい (つ、つかえん ...)。Debian woody から nfs-common パッケージを拾ってきて、 その中から /usr/sbin/rpc.statd を取り出して A300 に入れる。 これは幸い libc 2.2.2 でも動く (同梱されてる mountd だったかはダメ)。
# mkdir /var/lib/nfs # /usr/sbin/rpc.statd作法的には /etc/init.d/nfs-common start と起動するのが正しいが、 そうやって動くほど本体システムは Debian 化されてない。
# mount -t nfs atropos:/home/src/SUBSYSTEM/arm /atropos # cd /atropos # chroot . /bin/zsh # mount -t proc proc /proc # apt-get install python2.2 gcc tmakeこれ以外に何が必要だったかは忘れた。 まー、こまごまといろいろ要るんで、zgcc では足りないと書いたんだけども。
-DQT_QWS_CUSTOM は SL-5000 向けのタッチパネルデバイスのための項で、 A300 には有害 ... だと思うんだが、ま、試しに除いてみたというのがほんとのところ。 TMAKE_LIBS_QT はというと、libqte に入ってるべきいくつかのクラスが libqpe に移ってたのでしょうがなく ... というのがつまり、QLibrary::QLibrary(QString const &, QLibrary::Policy) のことだけど。
A300 で libqte だけ使うアプリというものがありえない以上、 最初から -lqpe を付けてしまったほうが間違いがない。
# zcat sip-x11-gpl-snapshot-20021128.tar.gz | tar -x # zcat PyQt-x11-gpl-snapshot-20021129.tar.gz | tar -x
てとこで SIP から。
# cd sip-x11-gpl-snapshot-20021128 # python build.py -l qte
# cd sipgen # make && make install # cd ../siplib # make && make installmake からインストールまでしてしまったが、母艦環境で python2.2 を使ってないからできる暴挙である :-)
--- build.py~ Sat Nov 30 01:56:46 2002
+++ build.py Sun Dec 1 22:42:06 2002
@@ -972,7 +972,7 @@
int main(int argc,char **argv)
{
FILE *fp;
- QApplication app(argc,argv,0);
+ // QApplication app(argc,argv,0);
if ((fp = fopen("%s","w")) == NULL)
{
リモートコンソール上から動かしてるせいか、
Qt アプリにしてしまうと features が作れなくなる。
これ自体は qte でもなんでもないので、外してしまう。
/opt/Qtopia/include/qmenubar.h を 1 行修正。
void QMenuBar::goodbye(bool) が private member になっているが、protected member
であることを要求するので、(コンパイルの間だけ; 意味ねー ...) protected に。
sip/qpeapplication.sip の void dateFormatChanged(int); をコメントアウト。
Qtopia に対応する関数がもうない。qtopia-free 1.6.0 にもなかった。
それと、sipqtQMenuData をつくるために qt/Makefile の CXXFLAGS に -DINCLUDE_MENUITEM_DEF をつけておく。 /opt/Qtopia/include/qmenudata.h の中で デフォルトでは #ifdef INCLUDE_MENUITEM_DEF として何故か外されている。
そしてやっぱり build.py は A300 で動かす。
# cd PyQt-x11-gpl-snapshot-20021129 # python build.py -l qte -a QtPE_1_5_0"-a QtPE_1_5_0" をつけないと Qtopia 対応モジュールが make されない。
# make && make installDom がないので pyuic2 は出来ない。pyxml も qte に実装が足りなくて(?) 出来ない (確かに pyqt_3.4-1.0_arm.ipk にもない)。それらはほっとけばスルーされる。
ついでに上で作った w3m も。
もっとも、/usr/lib/python2.2/site-packages/ にしかファイル置いてないから、よーするに /usr/lib/python2.2/site-packages/ をカードのどこかにsymlink しておけば「本体インストール」選んでも実体はカード行きになる訳で。