めまぐるしくかわる opie cvs の make 手順のメモとして。
上記の二つを、この順で 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 は 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 しておく。
なお、$OPIEDIR に /usr/local/opie を指定するなどして opie ディレクトリを移動することができるようにみえるが、 事実上 /opt/QtPalmtop 決め打ちである。 ... make 時点で /opt/QtPalmtop/lib が rpath に取り込まれたり、 opie-sh が /opt/QtPalmtop/bin/* を直叩きしていたりする。
ついでに 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
そして libqte 自体が TT_CONFIG_OPTION_EMBEDDED_BITMAPS を参照しているので、 libfreetype の設定を変えたら libfreetype.so.6 の入れ換えだけでなく、 /usr/include/freetype/config/ftoption.h あたりも正しく書き直し、 libqte を rebuild しなければならない。
anti-alias 絡みで libfreetype を入れ換えることはよくやるが、
ふつーそれに応じてヘッダを入れ換えたりはしないと思うので注意。
... という書き方をしているということはハマってたという自白でもあるやね (^^;
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 してもどーせ使わないし。
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
% 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リンクだけなのですぐ終わる。
ここで A300 と C700 は同じタッチパネルデバイスをもち、したがって C700 用の libqte は (極端に C700 向けにチューンされてたりするのでなければ) A300 でも使える。
... てことは、C700 用の OpenZaurus バイナリはそのまま A300 で動くのではないかと思うのだが、 どーだろ。