[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

cross make



鈴木(康)です。

linux(turbo linux) で NetBSD-current のクロス make 環境を作ってみました。
カーネル make までは割と気持ち良くできたんですが、lib とか sbin とかに
来て いろいろ面倒なことがわかり、挫折しました。

やっぱり、クロス環境は、NetBSD のそれも近いバージョンでないと
たいへんそうです。

以下、レポート

クロス用に作ったコマンドとコメント

addr2line  cc        config  host_gcc  lorder  objdump  strings  yacc
ar         cc1       cpp     install   make    ranlib   strip
as         cc1plus   g++     ld        mkdep   rpcgen   test
c++filt    collect2  gcc     lex       nm      size     tsort

install:
linux で GNU install が入っていたので安心していたんですが、
 -r オプションが使えない ことがわかり、結構困りました。
install は OS にバリバリ依存しているんで、make も 相当面倒そう。
とりあえず先に進めるために、-r を取る wrapper shell script でしのぎ
ました。

test:
これもたぶん、NetBSD 依存のオプション使っていると思いますが、
あまり考えずに作っています。

tsort:
クロスの libbfd を作るときに既にはまりました。
linux でも tsort あるんですが、動きが違う?

yacc,lex:
これもまあ、あまり考えずに入れています。
bison,flex は代用できないかも。

mkdep:
一応カーネル make で使うんで、作ることにしました。

rpcgen: 
librpcsvc を作るとき エラーになりました。
当然かも知れませんが、linux と NetBSD では仕様が違うんですね。

lorder:
nm のフォーマット依存なんですが、同じ elf だと 何も考えないで
使えました。例えば FreeBSD-2.2.8 の a.out の環境だと nm のフォーマットが
違うので、要注意。

その他の問題。

libc の make :

nslexer.c を nslexer.l から作りますが、
なぜか次のようになってしまいます。

lex  -P_nsyy -o/dev/stdout /home/suz/hpcmips/src/lib/libc/net/nslexer.l \
| sed -e '/YY_BUF_SIZE/s/16384/1024/' >nslexer.c
lex: could not create /dev/stdout

エラー出ても 気が付かないで先に進んでしまって、_nsyy_xx のシンボルが
ない libc が出来てしまいます。

bin/sh/mknodes.c :

はまったという程ではないんですが、

linux では、

static FILE *infp = stdin;

がエラーになりました。linux では、stdin は 

((_IO_FILE*)(&_IO_2_1_stdin_))

こんな風に define されているみたいです。
関数の戻り値?

bin/ksh

sys/cdefs.h の
 #error "No function renaming possible"
に引っかかってしまいます。

cpp を直接動かしているんで、

siglist.out: config.h sh.h siglist.in siglist.sh
        sh $(.CURDIR)/siglist.sh "$(CPP) ....

に明示的に -D__GNUC__ を入れた方が良いような気がするんですが...
# それとも cpp をちゃんと作れていないのかな?

usr.bin/vgrind:

cap_mkdb -f vgrindefs.src /home/suz/hpcmips/src/usr.bin/vgrind/vgrindefs.src

こんな風に cap_mkdb を動かそうとします。
やっぱり xxx_mkdb は、インストール後にした方が良いんじゃないでしょか。

usr.bin/file

MAGDIRF:sh=     echo $(.CURDIR)/magdir/[0-9a-z]*

という Makefile の記述ですが、CVS があると 

magic:          $(MAGFILES)
        cat $(MAGFILES) > $(.TARGET)

の cat で CVS を cat しようとします。


以上、役に立つような立たないようなレポートでした。

------------------------

ところで、カーネル make の時間なんですが、早いマシンはすごいですね。
Xeon 733Mhz という CPU で make したら、GENERIC の make が

real    2m51.318s
user    2m30.350s
sys     0m10.690s

こんな感じです。

nfs な環境で gcc を rsh できると幸せになれそうですが、
設定が難しそうなので、せめて cc1 だけでも rsh できないかなと
思いました。

たとえば、/usr/libexec/cc1 を

rsh host /usr/local/mipsel-netbsd/..../cc1 $*

とかしておいて、

cc に -pipe をつけるようにすれば、とりあえず cc1 だけは他のマシンを
使うことができそうです。

とりあえず、ng を make してみたんですが、

rsh cc1 :

real    1m30.805s
user    0m37.331s
sys     0m31.550s

local cc1: 
real    5m1.672s
user    3m39.321s
sys     1m5.187s

これだけでも 結構しあわせかも。

--
					鈴木 康司 @NECソリューションズ
					suz@hpc.bs1.fc.nec.co.jp
					TEL 042-333-6465