現在編集中
NetBSD-current/dreamcastのクロスコンパイルは、おそらくNetBSD-current/*上で やるのが一番楽なんだろうけど、手持ちに空いているマシンがないので、面倒だけど 他のOS上でやってみることにする。 試しているのは、
カレントのpkgsrcにshのクロスコンパイラが含まれているので、それを
コンパイル、インストールする。
このときmakeのインクロードファイルが古いままだと通らないので、
これを先にインストール。
以下、ソースを/current/usr/src以下に展開してあるものとする。
# cd /current/usr/src/share/mk # make install1.5のものを上書きしてしまうのがまずい場合は、別ディレクトリに インストールして、makeの-mオプションでそのディレクトリを指定する ようにするという手もあるかもしれない。
# cd /current/pkgsrc/cross/shel-netbsdcoff # make # make install
カーネルのコンパイルにはconfigが必要なのでインストールする。
NetBSD1.5にはない関数setprogname(), getprogname()を使用しているので、
main.c に以下を加えてごまかして、make
void setprogname(char *name) { setproctitle(name); } char *getprogname() { extern char *__progname; return __progname; }
適当に名前を変えて /usr/local/bin あたりにインストールする。 たとえばconfig.currentとか
# cd /current/usr/src/sys/arch/dreamcast/config # config.current GENEIRC # cd ../compile/dreamcast
BINDIR= /usr/pkg/cross/sh-coffnetbsd/bin/ AR= ${BINDIR}ar AS= ${BINDIR}as CC= ${BINDIR}gcc LD= ${BINDIR}ld NM= ${BINDIR}nm RANLIB= ${BINDIR}ranlib SIZE= ${BINDIR}size STRIP= ${BINDIR}strip
# make depend # make
基本的には環境変数をクロスコンパイル用に正しく設定すればOK。 しかし、なぜか、yaccで書かれたのソースのコンパイルでyyparse() の宣言がないといって止まってしまうので、yyparse()の宣言を強引に付加。
以下のスクリプトypatch.awk, ypatch.shをソースツリーの頭に置いて、 ypatch.shを実行
# cd /current/usr/src # ./ypatch.sh
{ print $0 if (done == 0) { if ($1 == "%%") x++ if (x == 2) { print "static int yyparse(void);" done = 1 next } if ($1 == "%{") { print "static int yyparse(void);" done = 1 next } } }
#!/bin/sh find . -name "*.y" -exec sh -c " \ grep yyparse\(\) {} 2>&1 > /dev/null && \ echo {} && \ mv {} {}.org && \ awk -f ypatch.awk {}.org > {}" \;
環境変数を設定してmake buildする。
例えば、
#!/bin/sh export DESTDIR=/home/netbsd-cross/shel export MACHINE=dreamcast export MACHINE_ARCH=sh3el export MACHINE_CPU=sh3 export MKOBJDIRS=yes export MAKEOBJDIRPREFIX=/var/obj export ENDIAN=-EL export CROSS=/usr/pkg/cross/bin/shel-netbsdcoff- export AR=$CROSS\ar export AS=$CROSS\as export CC=$CROSS\cc export CXX=$CROSS\c++ export LD=$CROSS\ld export NM=$CROSS\nm export RANLIB=$CROSS\ranlib export SIZE=$CROSS\size export STRIP=$CROSS\strip export OBJCOPY=$CROSS\objcopy export CFLAGS=-Wa,-little export CXXFLAGS=-Wa,-little export ASFLAGS=-little make build
ASFLAGSなどにlittle endianのオブジェクトを作成するオプションを 与えているのは、インストールしたasがなぜかbig endianのオブジェクトを 作ろうするからだ。
おなじBSDだが、意外にあっさりとはいかないが、結局はわりと簡単に
できたりする(意味不明)。
netbsdのソースは、/netbsd/usr/src以下に展開されているものとする。
binutils-2.10.1.tar.gzを適当なところから持ってきてコンパイルする。
/usr/local/cross/の下にインストールする場合は以下の通り
# ./configure --target=sh-elf32 --prefix=/usr/local/cross # make # make install
gcc-core-2.95.3.tar.gzを適当なところから持ってきてコンパイルする。
/usr/local/cross/の下にインストールする場合は以下の通り。
# ./configure --target=sh-elf32 --with-newlib --prefix=/usr/local/cross # make # make install
configureで--with-newlibを指定しているが、newlibをインストールするわけではない。 このオプションを指定すると、副作用として、includeファイルなどがなくてもコンパイルが一発で通るからだ。
makeがうまくいかないので、makeを使わずにコンパイルする。 OpenBSDにない関数、getprogname(), setprogname()が使われているので 小細工が必要。
void setprogname(char *name) { setproctitle(name); } char *getprogname() { extern char *__progname; return __progname; }
# cd /netbsd/usr/src/usr.sbin/config # yacc -d gram.y # mv y.tab.c gram.c # mv y.tab.h gram.h # lex scan.l # gcc -c *.c # gcc -o config.netbsd *.o/usr/local/binあたりにインストールする。
# cd /netbsd/usr/src/sys/arch/dreamcast/config # config.netbsd GENEIRC # cd ../compile/dreamcast
BINDIR= /usr/local/cross/bin/sh-elf32- AR= ${BINDIR}ar AS= ${BINDIR}as -little CC= ${BINDIR}gcc -Wa,-little LD= ${BINDIR}ld -EL NM= ${BINDIR}nm RANLIB= ${BINDIR}ranlib SIZE= ${BINDIR}size STRIP= ${BINDIR}strip
# make -m /netbsd/usr/src/share/mk depend # make -m /netbsd/usr/src/share/mk
# /usr/local/cross/bin/sh-elf32-objcopy -O binary netbsd netbsd.binary
Vine linuxなマシンがあるので無謀にも挑戦
make の make にも bsd の make が必要なので、make を使わないでコンパイルする。
BSDのMakefileはインクルードファイルを指定することが多いが、これの
デフォルトのインクルードパスが/usr/share/mkになっているので、
/usr/local/cross-netbsd/share/mkに変更する。
# cd src/usr.bin/make # gcc -D_PATH_DEFSYSPATH=\"/usr/local/cross-netbsd/share/mk\" -D__RCSID\(x\)="" -D__COPYRIGHT\(x\)="" -c *.c # cd lst.lib # gcc -I.. \"-D_PATH_DEFSYSPATH=/usr/local/cross-netbsd/share/mk\" -D__RCSID\(x\)="" -D__COPYRIGHT\(\)="" -c *.c # cd .. # gcc -o make *.o lst.lib/*.o # mkdir -p /usr/local/cross-netbsd/bin/ # cp make /usr/local/cross-netbsd/bin/make # mkdir /usr
makeのインクルードファイルをインストールする。
# cd src/share/mk # mkdir -p /usr/local/cross-netbsd/share/mk # cp *.mk /usr/local/cross-netbsd/share/mk
# cd src/usr.bin/mkdep # gcc -o mkdep -Dsetprogname\(x\)="" -D__RCSID\(x\)= -D__COPYRIGHT\(x\)= *.c # cp mkdep /usr/local/cross-netbsd/bin
# cd src/usr.sbin/config # make -f Makefile.boot # cp config /usr/local/cross-netbsd/bin/config
# cd src/usr.bin/lordeer # cp lorder.sh /usr/local/cross-netbsd/bin/lorder # chmod 744 /usr/local/cross-netbsd/bin/lorder
なぜかリンカがreturn code 139でこける…
FENIX/ MEMBERS/ thomas's HOME/ memo/ netbsd/dreadmcast.html
佐藤益弘 thomas@fenix.ne.jp