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 というところに 開発キットをインストールした。
まず、
を実行しよう。 こうすると、Handspring の各種ツールは使えなくなるが、 代わりに普段のツールが使えるようになる。 次に、どこかに
という記述があるはずだ。 スタート から辿れるところにある 検索などを使って 問題のポイントを探しだし、コメントアウトしてしまおう。
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
とりあえず意味は考えなくていい。 向こうしばらく、このファイルの中身を書き換えるつもりはない。
さて、必要なファイルはこれでそろった。
コマンドを実行しよう。 環境などに特に問題がなければ、 test.prc というファイルができるはずだ。
test.prc を WorkPad にインストールして、実行してみよう。 一瞬画面が真っ白になって、すぐ元に戻るはずだ。 それで正しい。「何もしないプログラム」なのだから。 画面が一瞬白くなったのは、 test.rcp で「白いウィンドウ」を作るよう指示を出したからだ。 (これは省略できない、 まぁ、「黒いウィンドウ」にすることはできるかもしれないが)
おめでとう、これで君も「WorkPad プログラマー」だ。 あとは test.c の中を埋めていけば、 しばらくの間は GUI なしのプログラムを書くことができる。
Prev 1 , 2, 3 , 4 , 5 , 6 , 7 , Next
このページに関する コメント、情報、誤りなどの情報がありましたら、 奥山 まで。