Network Users' Group ``wheel'' / Dai ISHIJIMA's Page / SL Zaurus関連 /
tcsh

初版: 2003/01/12
最終更新日: 2003/09/20


FreeBSDでSL Zaurusのクロスコンパイラを使う
〜 tcsh-6.10 〜



◇tcsh

SLザウルスに元々入っているシェルはbashだけですが、 これ以外のシェルが動くなら試してみたいと思うのが人情です(笑)。 csh系になじみの深い場合は特にそうでしょう。 ということで、ファイル名補完とコマンド行編集機能の追加されている tcsh (tcsh-6.10) をコンパイルしてみました。


◇さらに新しいバージョンは

本ページで解説しているのは、tcsh-6.10をFreeBSD 4.3Rで コンパイルする方法です。 これより新しいtcsh-6.12をFreeBSD 4.8Rでコンパイルする方法は、 Zaurus with Linuxを参照してください。 また、tcsh-6.12のバイナリについては、 同ページからダウンロードすることができます。


◇コンパイル

まず、FreeBSD (4.3R) のソースツリーから、 ソース一式 (/usr/src/contrib/tcsh/*) をコピーします。 ドキュメント (README) を読むと、 configure&makeでコンパイルするようです。 configureスクリプトは、 ターゲットマシンごとの差異を認識して、 適切なメイクファイルを生成するためのものです。 そのため、configureを実行するのは、ターゲットマシン上で行うのが普通です。 FreeBSD上でconfigureを実行すると、FreeBSD向けのメイクファイルが生成されます。 しかし、ここはその違いを無視して適当にやることにして、 何も考えずにconfigure&makeしてみます(爆)。 本当はこんなエエ加減なことはしないのが正しい作法です

まず、configureを動かしてみます。

	% ./configure
	creating cache ./config.cache
	checking host system type... i386-unknown-freebsd4.6.2
	<中略>
	creating Makefile
	creating config.h
当然ですが、FreeBSD向けのファイルが生成されます。

次にクロスコンパイラでコンパイルしてみます。

	% make 'CC=/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc'
	grep 'ERR_' ./sh.err.c | grep '^#define' >> sh.err.h
	gcc -E -I. -I. -D_PATH_TCSHELL='"/usr/local/bin/tcsh"'  -D_h_tc_const ./tc.const.c |
	grep 'Char STR' |  sed -e 's/Char \([a-zA-Z0-9_]*\)\[\].*/extern Char \1[];/' |
	sort >> tc.const.h
	/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -c -g -O2 -I. -I.
		-D_PATH_TCSHELL='"/usr/local/bin/tcsh"'  sh.c
	/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -c -g -O2 -I. -I.
		-D_PATH_TCSHELL='"/usr/local/bin/tcsh"'  sh.dir.c
一応スムーズにコンパイルしているようですが…

	/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -c -g -O2 -I. -I.
		-D_PATH_TCSHELL='"/usr/local/bin/tcsh"'  tc.const.c
	rm -f gethost
	/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -o gethost  -g -O2
		-I. -I. -D_PATH_TCSHELL='"/usr/local/bin/tcsh"'
		 ./gethost.c -ltermlib -lcrypt 
	/opt/Embedix/tools/arm-linux/bin/ld: cannot find -ltermlib
	collect2: ld returned 1 exit status
	*** Error code 1

	Stop in /tmp/tcsh.
gethostをコンパイルするところで止っていまいます。 これは、termlibライブラリ (libtermlib.*) が存在しないからです。 このライブラリをSLザウルスからコピーしてきて、 CCに「-L.」オプションをつけるとなんとかコンパイルはできます。
	% make 'CC=/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -L.'
	rm -f gethost
	/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -L. -o gethost
		-g -O2 -I. -I. -D_PATH_TCSHELL='"/usr/local/bin/tcsh"'
		./gethost.c -ltermlib -lcrypt 
	./gethost ./host.defs >> tc.defs.c
	./gethost: 1: Syntax error: word unexpected (expecting ")")
	*** Error code 2

	Stop in /tmp/tcsh.
しかし、コンパイルされたgethostコマンドでtc.defs.cを生成しようとした ところで止ってしまいます。SLザウルス向けのバイナリをFreeBSDで実行できる はずはありませんから、しょーがないですね。 そこで、gethostだけはFreeBSD向けにコンパイルしてみます。 さらに、FreeBSD向けにコンパイルしたgethostでtc.defs.cを生成してみます。
	% /bin/rm gethost
	% make gethost
	rm -f gethost
	gcc -o gethost  -g -O2 -I. -I. -D_PATH_TCSHELL='"/usr/local/bin/tcsh"'
		./gethost.c -ltermlib -lcrypt 
	% make tc.defs.c
	./gethost ./host.defs >> tc.defs.c
こうすればtc.defs.cを生成できます。 あまりよい方法ではありませんが(爆)。

さらに続きをコンパイルしてみます。

	% make 'CC=/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -L.'
	/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -L. -c -g -O2 -I. -I.
		-D_PATH_TCSHELL='"/usr/local/bin/tcsh"'  tc.defs.c
	中略
	/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -L. -c -g -O2 -I. -I.
		-D_PATH_TCSHELL='"/usr/local/bin/tcsh"'  tc.prompt.c
	tc.prompt.c: In function `tprintf':
	tc.prompt.c:198: warning: initialization makes pointer from integer without a cast
	tc.prompt.c:257: dereferencing pointer to incomplete type
	中略
	tc.prompt.c:493: dereferencing pointer to incomplete type
	*** Error code 1

	Stop in /tmp/tcsh.
tc.prompt.cのコンパイルでエラーになります。 これは、struct tmの型宣言ができていないことが原因なので、 tc.prompt.cの先頭に「#include <time.h>」を追加します。
	% mv tc.prompt.c tc.prompt.c.orig;
	    (echo '#include ' ; cat tc.prompt.c.orig ) > tc.prompt.c 
	% make 'CC=/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -L.'
同様のエラーがtc.sched.cのコンパイルでも発生するので、 tc.sched.cの先頭にも「#include <time.h>」を追加します。
	% mv tc.sched.c tc.sched.c.orig ;
		( echo '#include ' ; cat tc.sched.c.orig ) > tc.sched.c
	% make 'CC=/compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -L.'
これでなんとかtcshをコンパイルできました。 無事に動くんでしょうか?(笑)

ちなみに実行形式 (tcsh-6.10) は ここ (tcsh-bin-slzaurus.tgz) です。

tcsh-6.12の実行形式は Zaurus with Linuxからダウンロードしてください。