Qtopiaアプリケーションの開発 その1 コンパイル手順
と言う訳で、セルフ開発環境がようやく整ったので、改めてQtopiaアプリケーションの作成手順を学んでいきます。
さて、ソースの解析や、ライブラリの使い方など、学ぶべきことは山程ありますが、まずは何よりも、コンパイルそのものの手順からまとめてみることにしましょう。
開発環境構築の際、動作テストとして、既に手順そのものは記載していますので、内容的には一部、そちらと重複することになりますが、確認の意味も含めて、改めてきちんと手順を追っていきます。
コンパイル(ビルド)手順
Qtopiaアプリケーションのビルドにあたっては、基本的に以下の手順を踏むことになります。
- ソースリストの作成
- progenでproject(.pro)ファイルの作成
- tmakeでMakefileを作成
- make
以下、具体的な手順です。
まずは、ソースリストを用意します。
ソースに関しては、別にQtopiaアプリケーションに限った話ではありませんが、通常は適当なテキストエディタで記述していきます。
私はZEditorを利用していますが、極端な話、標準のメモ帳でもソースの記述は可能です。
今回は、先日のセルフ開発環境構築の時に使ったソースをそのまま流用します。
# main.cpp #include#include int main (int argc, char *argv[]) { QPEApplication hello( argc , argv ); QLabel *label = new QLabel ("Hello World!",0); hello.setMainWidget(label); label->show(); return hello.exec(); }
ソースリストが用意出来たら、2.project(.pro)ファイルを作成します。
$ progen -o ./HelloQT.pro
progenはディレクトリ内のソースリストファイルを走査し、後のtmakeコマンドが参照するprojectファイルを作成します。
この際、カレントディレクトリ中のソースファイルは全てが走査の対象となり、単一のprojectファイルが生成されます。
そのため、複数のアプリケーションを開発を行っている場合は、開発アプリケーション毎に作業ディレクトリを分けて作業する必要があります。
projectファイル(.pro)が作成されたら、続いて3.tmakeを実行し、Makefileを作成します。
$ tmake -o ./Makefile ./HelloQT.pro
最後に、4.makeすることで、ソースリストのコンパイルが行われ、実行バイナリ(アプリケーション本体)が完成します。
$ make
出力されるバイナリはprojectファイル、及びMakefileで出力ファイル名が定義されているため、デフォルトのa.outでは無く、きちんとしたファイル名が付けられています。
作成されたバイナリは、コンソールから直接実行することが出来ます。
勿論、この実行バイナリは/opt/QtPalmtop/binに配置することで、ホーム画面−設定タブ−ホーム画面設定から、Qtopia上のアプリケーションとして登録することが出来ます。
基本的なQtopiaアプリケーション作成の手順は以上です。
既存のソースをビルドする
さて、今度は配布されている既存のソースから、Qtopiaアプリケーションをビルドしてみましょう。
今回は、毎度お世話になっているZEditorをソースからビルドしてみることにします。
まずは、satoshiさんのページで公開されているソースアーカイブを入手します。
ソースアーカイブは、ipkgでは無く、tarとgzipで圧縮されたファイルとなっていますので、まずはこれを適当なディレクトリに解凍します。
$ tar zxvf ./zeditor3.5.1_src.tar.gz
解凍されたファイルを確認すると、既にprojectファイル(zeditor.pro)が用意されていることが分かります。
$ ls FileDialog.cpp filedialog.h idiom.cpp idiom.h jump.cpp jump.h ls.txt main.cpp optdialog.cpp optdialog.h repdialog.cpp repdialog.h zeditor.control zeditor.cpp zeditor.desktop zeditor.h zeditor.png zeditor.pro zeditor3.5.1_src.tar.gz
このprojectファイルを基にMakefileを作成します。
$ tmake -o Makefile ./zeditor.pro
後はmake一発。
$ make
以上の手順で、バイナリパッケージで配布されているのと同等のZEditorを自分の手元で生み出すことが出来ます(^^)。
なお、今回のZEditorのビルドでは、ソースアーカイブで用意されていたprojectファイルをそのまま使いましたが、勿論自分でprojectファイルを生成することも出来ます。
$ progen -o ZEditor.pro
なお、同名のprojectファイルが既に存在していた場合は、上書きされます。
ソースアーカイブ中にprojectファイルが含まれていない場合は、上記の手順でprojectファイルを生成するところから始めることになるでしょう。
逆に、既にMakefileが存在するならば、いきなりmake一発でビルドが完了する場合もあるかと思います。
このへんは前項のコンパイル(ビルド)手順を参照しながら、現在の作業がどの段階にあるのかを確認してみて下さい。
tmakeとprogen
Qt(Qtopia)アプリケーションに限った話では無く、一般にプログラムが複雑になってくると、ソースファイルや関連モジュールは複数のファイルに分かれて記述することが多くなります。
ソースを複数に分けるのは、共通するルーチンを多数のプログラムで使い回したり、幾人かで共同開発を行う際、作業を円滑に進めるために行われますが、当然ながらその分コンパイルの手順や、ソースの管理は煩雑になっていきます。
そういった複数のソースを管理し、簡便にプログラムをビルドするツールがmakeです。
makeは単純なソースリストの管理だけでなく、異なる機種間でのコンパイル環境に対応した設定等も行うことが出来るため、CUI/GUI関わらず、既存のソースをビルドする場合、大抵ソースを解凍後、make一発、と言うのが現在のスタンダードになっています。
そういう意味では、直接ソースファイルに対して直接、cc(gcc)やc++(g++)でコンパイルを行う場面の方が今は少ないのかもしれません。
Qt(Qtopia)の開発にあたっても、このmakeを使ってアプリケーションをビルドすることが推奨されています。
tmakeとprogenはこのmakeを実行するための補助ツールです。
progenはディレクトリ中のソースファイルを検索し、tmakeを実行するために必要なテンプレート=projectファイル(.proファイル)を作成します。
# HelloQT.pro TEMPLATE = app CONFIG = qt warn_on release HEADERS = SOURCES = main.cpp INTERFACES =
この様に、実際に作成されたファイルを見てみると分かりますが、ぶっちゃけprojectファイルはただのソースファイルの一覧表に過ぎません。
tmakeはこうして出来たテンプレートファイルを基に、Makefileを作成します。
# Makefile ############################################################################# # Makefile for building ./HelloQT # Generated by tmake at 11:25, 2006/04/12 # Project: ./HelloQT # Template: app ############################################################################# ####### Compiler, tools and options CC = gcc CXX = g++ CFLAGS = -pipe -Wall -W -O2 -DNO_DEBUG CXXFLAGS= -pipe -DQT_QWS_EBX -DQT_QWS_CUSTOM -DQWS -fno-exceptions -fno-rtti -fsigned-char -DQT_NO_DRAGANDDROP -DQT_NO_PROPERTIES -Wall -W -O2 -DNO_DEBUG INCPATH = -I$(QTDIR)/include LINK = g++ LFLAGS = LIBS = $(SUBLIBS) -L$(QTDIR)/lib -lqte -lqpe MOC = $(QTDIR)/bin/moc UIC = $(QTDIR)/bin/uic TAR = tar -cf GZIP = gzip -9f ####### Files HEADERS = SOURCES = main.cpp OBJECTS = main.o INTERFACES = UICDECLS = UICIMPLS = SRCMOC = OBJMOC = DIST = TARGET = ./HelloQT INTERFACE_DECL_PATH = . ####### Implicit rules .SUFFIXES: .cpp .cxx .cc .C .c .cpp.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< .cxx.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< .cc.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< .C.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< .c.o: $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $< ####### Build rules all: $(TARGET) $(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS) moc: $(SRCMOC) tmake: Makefile Makefile: ./HelloQT.pro tmake ./HelloQT.pro -o Makefile dist: $(TAR) ./HelloQT.tar ./HelloQT.pro $(SOURCES) $(HEADERS) $(INTERFACES) $(DIST) $(GZIP) ./HelloQT.tar clean: -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS) $(TARGET) -rm -f *~ core ####### Sub-libraries ###### Combined headers ####### Compile main.o: main.cpp
Makefileでは、ターゲットとなるソースファイルの他、実際にアプリケーションをビルドするのに使われるツールや、ライブラリパス等が細かく設定されています。
Makefileも、途中で生成されたprojectファイルも、その実体はテキストで記述された設定ファイルに過ぎません。しかし、これを一から手書きで書いていくのが、大変面倒であることは言うまでも無いでしょう。
つまるところ、tmake及び、progenは、この「Makefile」を自動的に生成するためのツールな訳です。
なお、これらのツールで生成されたprojectファイル、及びMakefileをコンパイルするにあたって、さらに手作業での修正が必要になる場合があります。
これは主にクロスコンパイルで開発を行う場合で、Zaurusの実機とクロスコンパイル環境とで、ライブラリ等の依存ファイルのパスが異なるために修正が必要となります。
Zaurus実機で、セルフコンパイルを行う場合は、こういった不整合が発生することはありませんので、修正の必要は無く、そのままmake(コンパイル)を実行すればOKです。