仕切り直し - Mona OS で ゴー?

適当にやっていたら収拾がつかなくなったのでリセット。

目的

GO(gcc)をMonaようにビルドする。

方針

できるだけ GO には手を入れずにがんばる。

環境

toolstdc をビルドする

まずは ReadMe にある通り toolstdc (golib00.exe sjisconv.exe gas2nask.exe nask.exe naskcnv0.exe)をビルドする。
これらのツールは Host 側で動くものなので Linux/Cygwin で動くような配慮が必要。(これはMonaの事情)


さて説明通り include/rules.gcc をベースに設定ファイル include/rules.host.mak を作る。
ターゲット依存部に書かれている Makefilemakefile にしておかないとはまるので注意。

GCC = gcc
MAKE = make
LIBRARIAN = golib00.exe
DEL = rm -f

MAKER = $(MAKE) -r
MAKEC = $(MAKE) -C
COMPILE = $(GCC) -c -Os
LINK = $(GCC) -Wl,-s
LINK_ADDLIB =

GODRV = ../drv_stdc/drv_stdc.obj
GODRVDIR = ../drv_stdc
LINKOPT_CPP0 =
LINKOPT_CC1  =
LINKOPT_CC1P =

%.o : %.c makefile ../include/rules.mak
$(COMPILE) -DIN_GCC -DHAVE_CONFIG_H -I../include -o $*.o $*.c

%.obj : %.c makefile ../include/rules.mak
$(COMPILE) -o $*.obj $*.c

次に toolstdc/makefile, nasklib/makefile 内の Makefile -> makefile と書き換える。(さっそく手を入れてしまった)

ではビルド

(cp include/rules.host.mak include/rules.mak && cd toolstdc && make)
... 略 ...
gcc -c -Os -DIN_GCC -DHAVE_CONFIG_H -I../include -o ll.o ll.c
gcc -c -Os -DIN_GCC -DHAVE_CONFIG_H -I../include -o ll_lib.o ll_lib.c
gcc -c -Os -DIN_GCC -DHAVE_CONFIG_H -I../include -o nask.o nask.c
../toolstdc/golib00.exe out:nasklib.lib ll.o ll_lib.o nask.o
unknown file type: ll.o

怒られてしまいました。嫌な予感がする。
COFF 前提でした。(了)


回避案は3つ

  • golib00 を ELF 対応
  • golib00 を ar で代替できるか試す
  • golib00 を wine で動かす

3つ目が楽そう。

toolstdc をビルドする その2

rules.host.mak を書き直す。
基本的には Mingwgcc を使えば良い。
cygwin 環境の人もいると思うので Mona のビルド時の configure 結果を利用する。

rules.host.mak 。

ifndef $(MONADIR)
export MONADIR=$(shell cd $(PWD)/../../../../../mona; pwd)
endif

SHAREDIR   = $(MONADIR)/share
include $(SHAREDIR)/configs/Makefile.inc

GCC = $(CC)
MAKE = make
LIBRARIAN = wine ../toolstdc/golib00.exe
DEL = rm -f

MAKER = $(MAKE) -r
MAKEC = $(MAKE) -C
COMPILE = $(GCC) -c -Os
LINK = $(GCC) -Wl,-s
LINK_ADDLIB =

GODRV = ../drv_stdc/drv_stdc.obj
GODRVDIR = ../drv_stdc
LINKOPT_CPP0 =
LINKOPT_CC1  =
LINKOPT_CC1P =

%.o : %.c makefile ../include/rules.mak
$(COMPILE) -DIN_GCC -DHAVE_CONFIG_H -I../include -o $*.o $*.c

%.obj : %.c makefile ../include/rules.mak
$(COMPILE) -o $*.obj $*.c

ポイントは $(CC) を利用する部分と、wine で golib00.exe を動かしている部分。
レッツビルド。

(cp include/rules.host.mak include/rules.mak && cd toolstdc && make)
...
/usr/bin/i586-mingw32msvc-gcc -c -Os -DIN_GCC -DHAVE_CONFIG_H -I../include -o malloc.o malloc.c
malloc.c:3:20: GO_lib.h: No such file or directory
malloc.c:7: error: syntax error before "size"

ちゃんとクロスコンパイラが使われていることが分かる。
出ているエラーは大文字小文字問題。
go_lib/malloc.c, realloc.c で GO_lib.h を go_lib.h に直す。
ついでに go_lib/makefileMakefile -> makefile と修正。

無事 toolstdc がビルドできました。

% ls -la toolstdc
合計 133
drwxr-xr-x  2 taro taro   432 2007-12-26 00:42 .
drwx------ 20 taro taro   632 2007-12-26 00:03 ..
-rw-r--r--  1 taro taro  3118 2003-11-12 00:51 gas2nask.c
-rwxr-xr-x  1 taro taro 15872 2007-12-26 00:42 gas2nask.exe
-rw-r--r--  1 taro taro  2000 2003-11-12 00:51 golib00.c
-rwxr-xr-x  1 taro taro  9216 2007-12-26 00:42 golib00.exe
-rw-r--r--  1 taro taro   597 2007-12-26 00:11 makefile
-rw-r--r--  1 taro taro  1840 2003-11-10 21:53 nask.c
-rwxr-xr-x  1 taro taro 50176 2007-12-26 00:42 nask.exe
-rw-r--r--  1 taro taro  3459 2007-12-26 00:42 nask.obj
-rw-r--r--  1 taro taro  2539 2003-11-10 22:03 naskcnv0.c
-rwxr-xr-x  1 taro taro  8192 2007-12-26 00:42 naskcnv0.exe
-rw-r--r--  1 taro taro  4404 2007-12-26 00:42 naskcnv0.obj
-rw-r--r--  1 taro taro  1823 2003-11-10 21:43 sjisconv.c
-rwxr-xr-x  1 taro taro  6144 2007-12-26 00:42 sjisconv.exe