さて、懸案の一つ、emacs のポートを片付ける。 Emacs の build が難しいのは、途中で自分自身を dump する必要があることにあった。
(気を取りなおして、) arm linux 用の定義の src/m/arm.h が emacs ソースツリーに姿をあらわすのは Debian の中の emacs20-dl からだ(本家の emacs20-dl には入ってない)。 しかし emacs 20 は大きすぎる ... X を外しても 3M バイト。 一方、mule 2.3-19.34 は X 込みで 2.4M バイト。 もっとも nemacs 18.59 は X 込みで 780k バイトなわけで、 2.4MB と 3.0MB じゃ五十歩百歩という話もないでもないけども。 ま、8MB のメモリしかもたない Psion5 では 600kB というのはそれなりに貴重だ、 というわけで mule 2.3-19.34 を動かす。 mule が重かったら nemacs も考えないといけないけど mule と nemacs を同時に持つだけのカードの余裕はないので mule を先に見ることにする。
しばらくほっとくと src/ に temacs が出来、 こいつが lisp/*.el を順繰りにバイトコンパイルし、 つづいで loadup で lisp/*.elc を吸い上げて dump して src/emacs-19.34 (mule 本体) ができる。% zcat mule-2.3-19.34-alpha01.tar.gz |tar -xv % cd mule-2.3-19.34-alpha01 % zcat ../mule2_2.3+19.34-8.diff.gz | patch -p1 % ./configure --without-x --with-canna --with-canna-includes=/usr/local/canna/include % make |& tee ../make.i386.log
ここまではソースが壊れてないことの単なる確認。次のステップに移る ──
ああ、そういう意味では ソース 45MB、中間オブジェクトに 15MB、コンパイラに都合 10MB を納めて 128MB 位のカードがあればセルフで mule を build することは出来る。 .... なんかとてつもなく遅そうだけど ....
とすればソース、オブジェクトが分離され、% cd .. % md mule-i386 % cd mule-i386 % ../mule-2.3-19.34-alpha01/configure --srcdir=/home/src/psion/emacs/mule-2.3-19.34-alpha01 --without-x --with-canna --with-canna-includes=/usr/local/canna/include
で同じように build できることになってるけど emacs の configure はそうなってなかった -_-;% make
の記述を、Makefile.in が dir の下にあるとして、srcdir=@srcdir@ VPATH=@srcdir@
のように全部書き直さないといけなかった。この状態ならsrcdir=@srcdir@/dir VPATH=@srcdir@/dir
で再び mule をつくることができる。% ../mule-2.3-19.34-alpha01/configure --srcdir=/home/src/psion/emacs/mule-2.3-19.34-alpha01 --without-x --with-canna --with-canna-includes=/usr/local/canna/include % make
しつこく i386 用の make を続けてるけど、今回の make の意義は (arm 用に make する前に) arm 固有の挙動なのかそのコンパイラの系統(クロスの gcc 2.95.2, glibc 2.1) の挙動なのかを分離することにある。 i586-linux-gnulibc2-gcc は arm-linux-gcc と同期のコンパイラ... というかなんというか、 同時期に同じソースツリーから作られた linux/i386 (glibc 2.1) 用の linux/i386 の上で動くクロスコンパイラで、 もちろん configure や Makefile がどのていどクロスに対応しているのかのチェックにも使える。% make clean % rm config.cache % CC=i586-linux-gnulibc2-gcc ../mule-2.3-19.34-alpha01/configure --srcdir=/home/src/psion/emacs/mule-2.3-19.34-alpha01 --without-x --with-canna --with-canna-includes=/usr/local/canna/include % make
ここでは movemail の make の時に -llockfile
がないといって怒られるのと、temacs のリンクの時に /usr/lib/crt1.o
が違うぞといって怒られた。
前者は -llockfile を消して、後者は正しい
/usr/local/i586-linux-gnulibc2/lib/crt1.o を指定すると通った。
... この程度ならいきなり arm 用に入っても問題なかったかも
(こらこら、冒頭のえらそーな記述はナンだったんだ?)。
さてソースツリーの下ごしらえは終った。これから arm 向けの作業に入る。
当然だけど一発で落ちる:-)% cd .. % md mule-arm % cd mule-arm % CC=arm-linux-gcc ../mule-2.3-19.34-alpha01/configure --srcdir=/home/src/psion/emacs/mule-2.3-19.34-alpha01 --build=i586-linux --host=arm-linux --without-x --with-canna
Debian の emacs20-dl から src/m/arm.h を拾って来て src/m/ にコピーし、 configure に arm-*-linux-gnu* の項を付け加える。loading cache ./config.cache checking host system type... arm-unknown-linux-gnu configure: error: Emacs hasn't been ported to `arm-unknown-linux-gnu' systems. Check `etc/MACHINES' for recognized configuration names.
たぶんどこでもいいと思うので、Acorn の下に書いておいた。 これで configure は通るようになる。+ arm-*-linux-gnu* ) + machine=arm opsys=gnu-linux + ;;
といきごんで make に入るとやっぱり make は直ちに落ちる:% CC=arm-linux-gcc ../mule-2.3-19.34-alpha01/configure --srcdir=/home/src/psion/emacs/mule-2.3-19.34-alpha01 --build=i586-linux --host=arm-linux --without-x --with-canna % make |& tee ../make.arm.log
要するに最初にコンパイルする test-distrib は i386 用に make してやらないといけないと。 となりの ../mule-i386/ から test-distrib をコピーし、make を続行する。arm-linux-gcc -D_BSD_SOURCE -DHAVE_CONFIG_H -I. -I../src -I/home/src/psion/emacs/mule-2.3-19.34-alpha01/lib-src -I/home/src/psion/emacs/mule-2.3-19.34-alpha01/lib-src/../src -O2 -o test-distrib /home/src/psion/emacs/mule-2.3-19.34-alpha01/lib-src/test-distrib.c ./test-distrib /home/src/psion/emacs/mule-2.3-19.34-alpha01/lib-src/testfile ./test-distrib: ./test-distrib: cannot execute binary file make[1]: *** [test-distrib] Error 126 make[1]: Leaving directory `/home/src/psion/emacs/mule-arm/lib-src' make: *** [lib-src] Error 2
次は movemail で -llockfile が無いと言って落ち、つづいて temacs のリンクで止まる。 ここでは例によって crt*.o の位置を /usr/lib から /usr/local/arm-linux に書き換える他、prefix-args というバイナリを 隣の mule-i386/ からもってきておく必要があるらしい。% cp ../mule-i386/lib-src/test-distrib lib-src % touch lib-src/test-distrib % make |& tee -a ../make.arm.log
と止まる。./temacs -batch -l loadup dump ./temacs: ./temacs: cannot execute binary file make[1]: *** [emacs] Error 126
カード上にいままで build してきたのと同じパス上にツリーを展開し、
と手で実行すると無事 emacs-19.34 が出来上がった。% cd src % ./temacs -batch -l loadup dump
このサイズは CFLAGS に "-O2" を指定したもので、普通にやると "-g -O" となって もう少し大きくなると思う。 もっと小さくしたいからといって strip --strip-all してはマズいらしく、 2.2MB になった、と喜んだところで起動すると segmentation fault で落ちた。% ls -l emacs* -rwxr-xr-- 1 kensyu users 2402741 Apr 2 16:30 emacs -rwxr-xr-- 1 kensyu users 2402741 Apr 2 16:30 emacs-19.34.1 -rw-r--r-- 1 kensyu users 18560 Apr 2 15:30 emacs.o
~/.emacs を母艦から持ち込んで調整するのはこれからだ。![]()