★NetBSD/dreamcast 開発環境の構築

現在編集中


NetBSD-current/dreamcastのクロスコンパイルは、おそらくNetBSD-current/*上で やるのが一番楽なんだろうけど、手持ちに空いているマシンがないので、面倒だけど 他のOS上でやってみることにする。 試しているのは、

いまのところOpenBSD上のクロスコンパイルが一番うまくいってるかな。


1. NetBSD1.5/i386でNetBSD-curren/dreamcast

1.1. クロスコンパイラをインストール

カレントのpkgsrcにshのクロスコンパイラが含まれているので、それを コンパイル、インストールする。 このときmakeのインクロードファイルが古いままだと通らないので、 これを先にインストール。
以下、ソースを/current/usr/src以下に展開してあるものとする。

・make のインクルードファイルをインストール
# cd /current/usr/src/share/mk
# make install
1.5のものを上書きしてしまうのがまずい場合は、別ディレクトリに インストールして、makeの-mオプションでそのディレクトリを指定する ようにするという手もあるかもしれない。
・pkgsrc/cross/shel-netbsdcoffをインストール
# cd /current/pkgsrc/cross/shel-netbsdcoff
# make
# make install

1.2. configをインストール

カーネルのコンパイルには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とか

1.3. カーネルの構築

・config
# cd /current/usr/src/sys/arch/dreamcast/config
# config.current  GENEIRC
# cd ../compile/dreamcast
・クロスコンパイルのための環境設定
以下をMakefileの頭にを付加するか、環境変数として設定
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
普通にmakeできる
# make depend
# make

1.4. ユーザランドの構築

基本的には環境変数をクロスコンパイル用に正しく設定すればOK。 しかし、なぜか、yaccで書かれたのソースのコンパイルでyyparse() の宣言がないといって止まってしまうので、yyparse()の宣言を強引に付加。

・パッチ当て

以下のスクリプトypatch.awk, ypatch.shをソースツリーの頭に置いて、 ypatch.shを実行

# cd /current/usr/src 
# ./ypatch.sh
ypatch.awk:
{
	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
		}
	}
}
ypatch.sh:
#!/bin/sh
find . -name "*.y" -exec sh -c "        \
grep yyparse\(\) {} 2>&1 > /dev/null && \
echo {} &&                              \
mv {} {}.org &&                         \
awk -f ypatch.awk {}.org > {}" \;

・コンパイル

環境変数を設定してmake buildする。
例えば、

インストール先
/home/netbsd-cross/shel
オブジェクトの作成場所
/var/obj
の場合、以下のようなスクリプトを作成して実行する。

#!/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のオブジェクトを 作ろうするからだ。


2. OpenBSDでNetBSD-current/dreamcast

おなじBSDだが、意外にあっさりとはいかないが、結局はわりと簡単に できたりする(意味不明)。
netbsdのソースは、/netbsd/usr/src以下に展開されているものとする。

2.1. binutilsのインストール

binutils-2.10.1.tar.gzを適当なところから持ってきてコンパイルする。
/usr/local/cross/の下にインストールする場合は以下の通り

# ./configure --target=sh-elf32 --prefix=/usr/local/cross
# make
# make install

2.2. gccのインストール

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ファイルなどがなくてもコンパイルが一発で通るからだ。

2.3. netbsdのconfigのインストール

makeがうまくいかないので、makeを使わずにコンパイルする。 OpenBSDにない関数、getprogname(), setprogname()が使われているので 小細工が必要。

・main.cにパッチを当てる
以下をmain.cの適当なところに追加
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あたりにインストールする。

2.4. カーネルの構築

・config
# cd /netbsd/usr/src/sys/arch/dreamcast/config
# config.netbsd  GENEIRC
# cd ../compile/dreamcast
・クロスコンパイルのための環境設定
以下をMakefileの頭にを付加するか、環境変数として設定
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を実行
# make -m /netbsd/usr/src/share/mk depend
# make -m /netbsd/usr/src/share/mk
・バイナリのコンバート
必要があればバイナリをコンバートする。
例えば、raw binaryにするには
# /usr/local/cross/bin/sh-elf32-objcopy -O binary netbsd netbsd.binary

3. linuxでNetBSD-current/dreamcast

Vine linuxなマシンがあるので無謀にも挑戦

3.1. make の移植

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

3.2. mkdep の移植

# cd src/usr.bin/mkdep
# gcc -o mkdep -Dsetprogname\(x\)="" -D__RCSID\(x\)= -D__COPYRIGHT\(x\)= *.c
# cp mkdep /usr/local/cross-netbsd/bin

3.3. config の移植

# cd src/usr.sbin/config
# make -f Makefile.boot
# cp config /usr/local/cross-netbsd/bin/config

3.4. lorderのインストール

# cd src/usr.bin/lordeer
# cp lorder.sh /usr/local/cross-netbsd/bin/lorder
# chmod 744 /usr/local/cross-netbsd/bin/lorder

3.5. kernelの構築

なぜかリンカがreturn code 139でこける…


FENIX/ MEMBERS/ thomas's HOME/ memo/ netbsd/dreadmcast.html

佐藤益弘 thomas@fenix.ne.jp