Qtアプリのセルフコンパイルの為に
ずいぶん前に作って使ってた気がするのですが、需要がありそうなのでまとめ。
moc のクロスコンパイル
moc.pro の書き換え
moc.pro を下記のように書き換えます。
- qteに含まれるソースをコンパイル対象から外す。
- 代わりにlibqteをリンクしてオブジェクトを作る。
*** moc.pro 2001-03-31 01:09:40.000000000 +0900 --- moc-e.pro 2004-02-12 13:17:15.000000000 +0900 *************** *** 8,34 **** DEPENDPATH = ../../include ../tools . OBJECTS_DIR = . MOCGEN = mocgen.cpp ! SOURCES = $$MOCGEN \ ! ../tools/qbuffer.cpp \ ! ../tools/qcollection.cpp \ ! ../tools/qcstring.cpp \ ! ../tools/qdatastream.cpp \ ! ../tools/qdatetime.cpp \ ! ../tools/qfile.cpp \ ! ../tools/qgarray.cpp \ ! ../tools/qgdict.cpp \ ! ../tools/qglist.cpp \ ! ../tools/qglobal.cpp \ ! ../tools/qgvector.cpp \ ! ../tools/qiodevice.cpp \ ! ../tools/qregexp.cpp \ ! ../tools/qstring.cpp \ ! ../tools/qtextcodec.cpp \ ! ../tools/qtextstream.cpp \ ! ../tools/qutfcodec.cpp ! ! unix:SOURCES += ../tools/qfile_unix.cpp ! ! win32:SOURCES += ../tools/qfile_win.cpp ! TARGET = moc --- 8,13 ---- DEPENDPATH = ../../include ../tools . OBJECTS_DIR = . MOCGEN = mocgen.cpp ! SOURCES = $$MOCGEN TARGET = moc + LIBS += -L$(QTDIR)/lib -lqte
コンパイル手順
- tmake
$ tmake -o makefile moc-e.pro
- make
$ make
- strip
$ arm-linux-strip moc
uicのクロスコンパイル
下記の手順を自動的に行うシェルスクリプトを書いてみました。
uicのソースディレクトリにこのスクリプトを置いて実行するとuicのバイナリが出来ます。
追加で必要なファイルの用意
下記の2ファイルをカレントディレクトリにコピーしておきます。
- qdom.cpp
- qconfig.h
qconfig.h の書き換え
カレントディレクトリにコピーした qconfig.h の中の
#define QT_NO_DOM
という記述をコメントアウトし、DOMを有効にします。
//#define QT_NO_DOM
uic.pro の書き換え
uic.pro を下記のように書き換えます。
- qdom.cpp を SOURCES に追加。
- INCLUDEPATH の先頭にカレントディレクトリを追加。
- LIBS から -lqutil を削除。
- DESTDIR をコメントアウト。
*** uic.pro 2001-06-12 20:31:44.000000000 +0900 --- uic-e.pro 2004-02-12 13:11:32.000000000 +0900 *************** *** 1,10 **** TEMPLATE = app CONFIG += qt console warn_on release HEADERS = uic.h ../shared/widgetdatabase.h ../shared/domtool.h ../integration/kdevelop/kdewidgets.h ! SOURCES = uic.cpp ../shared/widgetdatabase.cpp ../shared/domtool.cpp ../integration/kdevelop/kdewidgets.cpp TARGET = uic ! INCLUDEPATH = ../shared ../util ../../../src/3rdparty/zlib/ ! unix:LIBS += -L$(QTDIR)/lib -lqutil -L../lib win32:LIBS += $(QTDIR)/lib/qutil.lib DEFINES += UIC ! DESTDIR = $(QTDIR)/bin --- 1,10 ---- TEMPLATE = app CONFIG += qt console warn_on release HEADERS = uic.h ../shared/widgetdatabase.h ../shared/domtool.h ../integration/kdevelop/kdewidgets.h ! SOURCES = uic.cpp ../shared/widgetdatabase.cpp ../shared/domtool.cpp ../integration/kdevelop/kdewidgets.cpp qdom.cpp TARGET = uic ! INCLUDEPATH = ./ ../shared ../util ../../../src/3rdparty/zlib/ ! unix:LIBS += -L$(QTDIR)/lib -L../lib win32:LIBS += $(QTDIR)/lib/qutil.lib DEFINES += UIC ! #DESTDIR = $(QTDIR)/bin
コンパイル手順
- tmake
$ tmake -o makefile uic-e.pro
- make
$ make
- strip
$ arm-linux-strip uic
コメント
コメント等はこちらにどうぞ。
- 2004-02-15 (Sun) 01:37:37 yakty : moc,uicって書いてあったんでとりあえず両方ともクロスコンパイル手順を書いてみましたが、mocはdev-imgに入ってますねぇ…
- 2004-02-26 (Thu) 03:50:54 suzu? : 素朴な疑問なんですが、セルフでuicが必要になる場面ってあるのでしょうか?配布ソースはuiファイルから変換済みでしょうし…。
- 2004-02-26 (Thu) 07:17:46 yakty : 私は自分のアプリをたまーにセルフでコンパイルする程度ですけど、必要になる場面はありますよ。tmakeで作成したmakefileだとmake cleanで.uiから生成したソースは消えてしまいますし。
- 2004-02-27 (Fri) 06:42:34 suzu? : mocで作ったソースじゃなくてuicで作ったのが消えるんですか
- 2004-02-27 (Fri) 06:44:17 suzu? : ええと、make cleanで消えるということは、uicもtmakeのルールに組み込んで、GUIの基底クラスは毎回クリアするということですか?
- 2004-02-27 (Fri) 06:45:23 suzu? : QT開発始めたばかりなので、なにかおかしなこと言ってたらすみません(^_^;)
- 2004-02-27 (Fri) 09:30:04 yakty : progen -> tmake で作ったmakefileだと消えますよね?あ、もしかしてシャープの公開してるチュートリアルを参考にしてます?あれはやり方が良くないです…(^_^; 通常はGUI基底クラスのソースは直接編集せずに、基底クラスを継承したクラスを作ってそっちを編集するのが良いと思います。
[[#comment]]