Network Users' Group ``wheel'' / Dai ISHIJIMA's Page / SL Zaurus関連 /
FreeBSDでクロス開発 / クロスコンパイラを使ってみる
Hello, worldpdxmemNg-1.4.3
リンク: Ng, script, tcsh, ne, jvim, top, ntpdate

初版: 2002/12/31
最終更新日: 2003/02/10


FreeBSDでSL Zaurusのアプリ開発
クロスコンパイラを使ってみる



◎参考文献

UNIX Magazine 2003年8月号 pp.151〜158 に詳しい記事があります。
サポートページ


◎実際にコンパイルしてみよう/「Hello, world」編

さて、クロス開発に必要なソフトのインストールが終了したところで、 本当にコンパイルできるのか試してみました。 用意したのは
	#include 

	main()
	{
		printf("Hello, Embedix\n");
	}
という非常に簡単なものです。 これをとりあえず、 hello.cという名前で保存します。

クロスコンパイラは、 「クロスコンパイラインストール編」 に書いたように、 /compat/linux/opt/Embedix/tools/bin/arm-linux-gcc にあります。 そこで、

	% /compat/linux/opt/Embedix/tools/bin/arm-linux-gcc hello.c
のようにコンパイルしました。

もちろん、環境変数$PATH/compat/linux/opt/Embedix/tools/binを追加してあれば、

	% arm-linux-gcc hello.c
でもかまいません。 まぁ、しょっちゅう使うわけでもないので、 毎回、絶対パス指定で使うことにしました。

できあがったファイル (a.out) のファイル形式をテストすると、

	% file a.out
	a.out: ELF 32-bit LSB executable, ARM, version 1 (ARM),
	dynamically linked (uses shared libs), not stripped
ちゃんとARM用バイナリができています:-)

最後に、できあがったファイルを、ネットワーク経由なり、 CFメモリカードかSDメモリカードを使ってSLザウルスにうつして実行してみます。 ネットワーク経由のコピーでは、SLザウルス側でftpを使うのが簡単でしょう。 メモリカードの場合は、 CFカードは/usr/mnt.rom/cf/に、 SDカードは/usr/mnt.rom/card/にマウントされるようです。

SLザウルスにファイルをうつして実行したときのスクリーンショットを以下に。

Hello, world


◎拙作PDXMEM編

コンパイルした結果、実際に動くかどうかはわかりませんが、 「Hello, world」よりももうちょっと複雑な例として、 拙作「pdxmem v0.0」を コンパイルしてみましょう。

「pdxmem v0.0」のコンパイルには、 「ppm v0.2」と 「hpb v0.0」のソースが必要です。 これらのソースを適当なディレクトリでソースを展開します。

	% lha xet ppm02.lzh
	% lha x hpb00.lzh hpbsrc.lzh
	% lha xetf hpbsrc.lzh
	% lha xetf pdxmem00.lzh
	% patch -p1 < patch.dif
これでソースの準備ができました。 次にメイクファイルを作成します。
	% cpp -DGCCUNIX  makefile.cpp > makefile
ここで作成したメイクファイルはクロスコンパイル向けではないので、 「CC=gcc」を変更してクロスコンパイル向けのものを作成します。 これは、viなどのエディタを使って、 当該行を「CC=gcc」から 「CC=/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc」 に手で変更しても構いませんし、コマンドラインからsedを使って
	% mv makefile makefile.bak
	% sed 's+CC=gcc+CC=/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc+' < makefile.bak > makefile
としてもいいでしょう。 メイクファイルができたらあとはmakeするだけです。
	% make
	/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -c -DEUC   -Wall pdxmem.c
	pdxmem.c:521: warning: return type of `main' is not `int'
	/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -c -DEUC   -Wall chat.c
	/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -c -DEUC   -Wall tty.c
	/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc  -o pdxmem pdxmem.o     chat.o tty.o
こんな感じでコンパイルできます。


◎Ng-1.4.3 編

Ngに関する情報は「ng.html」を ご覧ください。日本語入力に関するスクリーンショットも用意してます。

さて、ここまでで「Hello, world」と「pdxmem」をコンパイルしてみましたが、 もうすこし複雑な例として、日本語エディタ「Ng-1.4.3」をコンパイルしてみます。 「Ng」はemacs互換の軽快なエディタです。 いろんな環境での動作実績があります。

まず、ソース一式 (ng-1.4.3.tar.gz) を用意して、 これを展開します。

	% tar xzvf ng-1.4.3.tar.gz
	% cd ng
次にドキュメントを熟読します。
	% more docs/README.Ng
コンパイルの手順がわかったところで、 メイクファイルの準備をします。 ドキュメントではln(1)を使ってますが、安易にcpします。
	% cp sys/sysv/Makefile .
次に、メイクファイル中のコンパイラの指定を変更しておきます。 「CC」行の右辺を「gcc」から 「/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc」にします。 ここでmakeを実行すると、
	% make
	rm -f ttydef.h
	ln sys/default/ttydef.h .
	rm -f sysdef.h
	ln sys/sysv/sysdef.h .
	rm -f chrdef.h
	ln sys/default/chrdef.h .
	/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -O   -c basic.c
のようにコンパイルが始まります。しかし、しばらくすると、
	/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -O   -c canna.c
	/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -O   -o ng basic.o dir.o dired.o shell.o version.o window.o  kinsoku.o jump.o buffer.o complt.o display.o cmode.o echo.o extend.o file.o  help.o kbd.o keymap.o line.o macro.o main.o match.o modes.o  paragraph.o random.o region.o regex.o re_search.o search.o  skg.o kanji.o undo.o word.o cinfo.o spawn.o ttyio.o tty.o ttykbd.o fileio.o canna.o   -lcurses
	/opt/Embedix/tools/arm-linux/bin/ld: cannot find -lcurses
	collect2: ld returned 1 exit status
	*** Error code 1

	Stop in /tmp/ng.
となり、実行ファイルを作成するところまでいきません。

これは、cursesライブラリのリンクに失敗していることが原因です。 そこで、SLザウルスから「libncurses.so」をコピーして カレントディレクトリに置きます。 さらにMakefileを変更して、「LIBS」行の 「-lcurses」を「-lncurses -L.」とします。 変更部分はメイクファイルの差分 (makefile.patch) を参照してください。

さて、以上のとおり、「CC」と「LIBS」を変更したMakefileを使うと 無事コンパイルすることができます。

ちなみに実行形式は ここ (ng-binary-for-sl-zaurus.tgz) です。