WorkPad 用プログラムの組み方(2)

Prev 1 , 2, 3 , 4 , 5 , 6 , 7 , Next


このページの目次


最初の一歩

改めて言おう。ようこそ。WorkPad プログラミングの世界へ。

ここまで読み進める気になったあなたは、 ソフトウェア開発者として必要な前提を理解している、 と想定する。 つまり
「様々なデバイスのメリットというのはユーザーのものであって、 開発者というものはターゲットの利点ではなく欠点を知り、 その欠点をユーザーに見せないために苦労するものである」
という最も重要な事実を理解しているものと考える。 優れた技術者はターゲット環境に対する freeks になってはいけないのだ。

WorkPad に対する freeks は、先のメッセージに強い反感を感じるだろう。 よってここを読んでいることはあるまい。 ここを読んでいるあなたであれば、 これからの苦労にも耐えられるだろう。 (というかよくぞまぁ、そんな気になるものだ。私も含めて)


では、早速はじめよう。

まず、私の Handspring の開発環境はデフォルト状態にはない。 Handspring の開発キットは、自分がインストールされた場所を、 /usr/local 下に mount してしまう。 あ、'/' はディレクトリを区切る文字だ。 DOS や Windows ならば '\' なのだが、 cygwin + bash の世界では '/' なのでこれ以降はこのような書き方にする。

話を戻そう。私の Handspring の開発環境はデフォルト状態にはない。 Handspring の開発キットは、自分がインストールされた場所を /usr/local 下に mount してしまうが、 私にとってのデフォルトのツール群も /usr/local の下にある。 従って、このままでは Meadow など、私の大事なツール達が使えない。 そういう人は他にもいるかも知れない。

そこで、まずはこの現状を解消してしまおう。 この問題が発生しない人は、以下の手順は実行しなくて良い。 ただし、今後の私の説明においては、いろいろ読み替えが必要だ。 私がとったのは次のような手順だ。

あ、まず私は c:/Handspring というところに 開発キットをインストールした。

まず、

umount /usr/local

を実行しよう。 こうすると、Handspring の各種ツールは使えなくなるが、 代わりに普段のツールが使えるようになる。 次に、どこかに

mount あなたが Handspring をインストールした場所 /usr/local

という記述があるはずだ。 スタート から辿れるところにある 検索などを使って 問題のポイントを探しだし、コメントアウトしてしまおう。

Windows98/95 なら Autoexec.bat、 NT なら Control Panelシステム環境

   SET PALMOSINC=C:\Handspring\PalmTools\m68k-palmos-coff\include\PalmOS
   SET PATH=C:\Handspring\PalmTools\bin;%PATH%

を設定する。 これで、Handspring から得られたツールを「実行する」ことは可能になった。 もっともこのままではうまくコンパイルはしてくれない。

c:/Handspring/PalmTools/lib/gcc-lib/m68k-palmos-coff/2.7.2.2-kgpd-071097/specs というファイルがある。 実はこのファイルこそが、 gcc が動くために必要な各種設定を記録しているファイルである。 このファイルを変更する。

実際はこのファイル以外にも、 環境変数などで挙動を変更することは可能である。 しかし、Palm の gcc を使うために cygwin の環境をインストールしていれば、 当然 Windows 用 gcc もインストールされているはずだ。 環境変数を変更してしまうと、 この Windows 用 gcc も同じ影響をうけてしまう。 そこで、特定の gcc だけが影響をうける、この spec ファイルを変更するのだ。

変更する必要があるのは *lib: フィールドと、 *startfile: フィールドの2つだ。 (実は *cpp:にオプションを追加すると、 PALMOSINC という環境変数を指定しなくても良くなるが、 今回はそのようにはしないことにした)

変更したフィールドだけを提示すると:

*lib:
-L/Handspring/PalmTools/m68k-palmos-coff/lib/ %{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}

*startfile:
/Handspring/PalmTools/m68k-palmos-coff/lib/%{!shared:%{!g:crt0%O%s}%{g:gcrt0%O%s}}%{shared:scrt0%O%s}

これでコンパイルは可能になったが、実はまだ問題がある。

gcc は常識的に int は register size と同じで 32bit であると仮定している。 ところが、Palm 用 gcc だけは 16bit なのだ。 このため、 setjmp.h というファイルの中にある jmpbuf 構造体は、デフォルトのままでは使えない。

そこで、 /Handspring/PalmTools/m68k-palmos-coff/include/setjmp.h を変更する。変更前は:


typedef struct jmpbuf {
	unsigned int __j0;	/* 0  */
	unsigned int __j1;
	unsigned int sp;	/* 8  */
	unsigned int pc;	/* 12 */
	unsigned int __j3;
	unsigned int d2;	/* 20 */
        unsigned int d3;
        unsigned int d4;
        unsigned int d5;
        unsigned int d6;
        unsigned int d7;
        unsigned int a2;
        unsigned int a3;
        unsigned int a4;
        unsigned int a5;
        unsigned in fp;
} jmpbuf;
  

と宣言されている。これを

typedef struct jmpbuf {
	unsigned long __j0;	/* 0  */
	unsigned long __j1;
	unsigned long sp;	/* 8  */
	unsigned long pc;	/* 12 */
	unsigned long __j3;
	unsigned long d2;	/* 20 */
        unsigned long d3;
        unsigned long d4;
        unsigned long d5;
        unsigned long d6;
        unsigned long d7;
        unsigned long a2;
        unsigned long a3;
        unsigned long a4;
        unsigned long a5;
        unsigned long fp;
} jmpbuf;
  

のような宣言に変更するのだ。 setjmp/longjmp 関数自体はアセンブラで記述されており、特に問題はない。


これで、私の環境になった。 これ以降の説明はこの環境を前提として説明することとする。


まず適当なディレクトリを作ろう。 その下に必要なファイルを作成していく。 とりあえず、 /work/test とする。


最初に作るのは Makefile である。 私の環境では次のようになる。

PALMTOOLSU      = /Handspring/PalmTools

#
# The following two "include" lines are for default rules.
#
include $(PALMTOOLSU)/bin/Palm-DefaultVars.make
-include $(PALMTOOLSU)/bin/Palm-CustomVars.make

# The shell to use
SHELL           = /bin/sh
BUILDPRC        = build-prc.perl

# Compiler Flags
CFLAGS          = $(PalmCFlags) -O0

# Directory paths

# Target info
progName        = test
progDBName      = "test"
progCreator     = OKKY
progPrcFile     = $(progName).prc
objList         = $(progName).o

#
# From here comes rules for creation.
#
.PHONY : all clean

all:    $(progPrcFile)

clean::
        rm -f *.o *~

$(progPrcFile): $(progName)
        $(PALMRC) -rcp test.rcp \
                  -gccApp $(progName) \
                  -I .  \
                  -o $(progPrcFile) \
                  -name $(progDBName) -cr $(progCreator)

$(progName):    $(objList)
        $(CC) $(CFLAGS) $(objList) -o $(progName)

%.o :  %.c
        $(CC) $(CFLAGS) -S $< -o $@.s
        $(CC) $(CFLAGS) -c $< -o $@

基本的な部分については特に問題ないだろうが、 自分の環境に応じて変更すべきポイントをいくつか示そう。

PALMTOOLSU	= /Handspring/PalmTools

私の場合、/Handspring に Handspring の開発キットを インストールしている。 この場合、/Handspring/PalmTools に、 キーとなる開発ツールや include ファイルが存在する。 この引数はなによりも、 次のデフォルトルールを取り込むためである。

include $(PALMTOOLSU)/bin/Palm-DefaultVars.make
-include $(PALMTOOLSU)/bin/Palm-CustomVars.make

これは gnu-make のデフォルトルールを記述したファイルで、 Handspring の開発キットにデフォルトでついてくる。 そのデフォルトルールを読み込むためのものである。

CFLAGS		= $(PalmCFlags) -O0

CFLAGS 自体は特に問題ないだろう。 -O0 なのは、とりあえず最初の例に対してだけである。 私は普段 -O3 で使っている。 PalmCFlags は先に include した Palm-DefaultVars.make や Palm-CustomVars.make にその内容が記述されている。 ここを変更して必ず -O3 が一緒につくようにするのもいいかも知れない。

progName        = test
progDBName      = "test"
progCreator     = OKKY
progPrcFile     = $(progName).prc
objList         = $(progName).o

とりあえず、これらに関しては「おまじない」だと思っていただきたい。


次はプログラムコードだ。 Makefile では、オブジェクトファイル名を test.o にし、 test.o は test.c から作られる、としているので、 test.c というファイル名で作る。

#include <Pilot.h>
DWord
PilotMain( Word cmd, Ptr cmdPBP, Word launchFlags )
{
    return 0;
}

Workpad の場合、main() に相当する関数は PilotMain() という名前になる。 引数は3つで上記の通り。 とりあえず意味は気にしなくていいです。 どうせすぐ終了するので。

これで -O0 の意味が判ったと思う。 関数の中身がないので、 コンパイラーの最適化をかけると、 関数自体が消滅しかねないからだ。


最後に、test.rcp というファイルが必要になる。 test.rcp という名前も Makefile で指定したからである。

APPLICATION ID 1 "OKKY"
VERSION ID 1 "0.3"

FORM ID 1000 AT (2 55 156 103)
NOFRAME
MODAL
SAVEBEHIND
USABLE
BEGIN
        TITLE "test"
END

とりあえず意味は考えなくていい。 向こうしばらく、このファイルの中身を書き換えるつもりはない。


さて、必要なファイルはこれでそろった。

make

コマンドを実行しよう。 環境などに特に問題がなければ、 test.prc というファイルができるはずだ。

test.prc を WorkPad にインストールして、実行してみよう。 一瞬画面が真っ白になって、すぐ元に戻るはずだ。 それで正しい。「何もしないプログラム」なのだから。 画面が一瞬白くなったのは、 test.rcp で「白いウィンドウ」を作るよう指示を出したからだ。 (これは省略できない、 まぁ、「黒いウィンドウ」にすることはできるかもしれないが)

おめでとう、これで君も「WorkPad プログラマー」だ。 あとは test.c の中を埋めていけば、 しばらくの間は GUI なしのプログラムを書くことができる。


Prev 1 , 2, 3 , 4 , 5 , 6 , 7 , Next


change log

2000/01/28
#include <Pilot.h> の行の < > が昔はそのままだったのを、 &lt; &gt; に書き換える。こうしないと PRE の中でも 表示されないことに気がついてなかった。 ご指摘ありがとう > 徳平さん。
2000/07/30
setjmp/longjmp に関する記述を追加。こんなバグがあるとは…。

このページに関する コメント、情報、誤りなどの情報がありましたら、 奥山 まで。