必要な環境を準備する。
- Linux環境
- まず、当然ですがLinuxの環境がいります。私の場合は VineLinux2.6 です。ほぼフルに近い状態でインストールしてあります。
- 2003/08/14現在で、すべてのアップグレードを行っています
- カーネルは 2.4.21 を自環境に合わせてコンパイルしてあります。
- 本WikiのLinux上でOSASK用バイナリを生成しようを実行して、cc1 gas2nask nask obj2bim3 bim2bin3 を準備します。(ちなみに私の場合は、/usr/bin 以下にコピーしました)
実験開始!
- まず、ソースを解凍する。
~/$ lha -x make39.lzh ~/$ cd src39 ~/src39$
- とりあえず、一発、メイクをかけてみよう。
~/src39$ make for %%i in (ankfont0 sgg00lib pcat) do make -C %%i /bin/sh: -c: line 1: syntax error near unexpected token `(a' /bin/sh: -c: line 1: `for %%i in (ankfont0 sgg00lib pcat) do make -C %%i' make: *** [ALL] エラー 2 ~/src39$
- ふむふむ・・・。どうも、makefile の56行目の for の構文が、Linuxではちょっと違うみたいだ。いろいろいじくりまわして、以下のようにするとよいことがわかった。
makefile 56行目
・ ・ ALL : for %%i in ($(SUBDIRS)) do $(MAKE) -C %%i $(MAKE) $(TARGET) ・ ・
↓
・ ・ ALL : for i in $(SUBDIRS); do $(MAKE) -C $$i; done $(MAKE) $(TARGET) ・ ・
- これでメイク再び。こんどはさっきと違うエラーが出てくる。
~/src39$ make for i in ankfont0 sgg00lib pcat; do make -C $i; done make[1]: 入ります ディレクトリ `src39/ankfont0' makefile:1: ..\depend.mak: そのようなファイルやディレクトリはありません makefile:2: ..\rules.mak: そのようなファイルやディレクトリはありません make[1]: *** ターゲット `..\rules.mak' を make するルールがありません. 中止。 make[1]: 出ます ディレクトリ `src39/ankfont0' make[1]: 入ります ディレクトリ `src39/sgg00lib' makefile:1: ..\depend.mak: そのようなファイルやディレクトリはありません makefile:2: ..\rules.mak: そのようなファイルやディレクトリはありません make[1]: *** ターゲット `..\rules.mak' を make するルールがありません. 中止。 make[1]: 出ます ディレクトリ `src39/sgg00lib' make[1]: 入ります ディレクトリ `src39/pcat' makefile:1: ..\depend.mak: そのようなファイルやディレクトリはありません makefile:2: ..\rules.mak: そのようなファイルやディレクトリはありません make[1]: *** ターゲット `..\rules.mak' を make するルールがありません. 中止。 make[1]: 出ます ディレクトリ `src39/pcat' make: *** [ALL] エラー 2 ~/src39$
- 最初に直した部分を見てもわかるが、OSASKのソースはいくつかのサブディレクトリがあり、そこに降りていってさらにそこにある makefile を実行していくようだ。(つまり、さっき直した for の部分はうまく働いているということ。)
- 上記のエラーを見ると、ankfont0/ sgg00lib/ pcat/ にある、各makefileがうまくいっていない模様。
さっそく、ankfont0/ に降りて makefile を覗いてみる。
- まず、すぐに分かったのが パス区切り文字 。元々のソースはWin32環境で書かれているので、¥と/ を入れ替えてやればいいようだ。
1行目 include ..\depend.mak 2行目 include ..\rules.mak ・ 39行目 $(DISTDIR)\$(TARGET) : $(TARGET0) ..\depend.mak 40行目 copy /y $(TARGET0) $(DISTDIR)\$(TARGET) ・ 42行目 $(TARGET0) : $(SRC) makefile ..\depend.mak ・
↓
1行目 include ../depend.mak 2行目 include ../rules.mak ・ 39行目 $(DISTDIR)\$(TARGET) : $(TARGET0) ../depend.mak 40行目 copy /y $(TARGET0) $(DISTDIR)/$(TARGET) ・ 42行目 $(TARGET0) : $(SRC) makefile ../depend.mak ・
- よし、では再びメイク。
~/src39/ankfont0/$ make txt2bin.exe ibmank0.txt ankfont0.bin make: txt2bin.exe: コマンドが見つかりませんでした make: *** [ankfont0.bin] エラー 127 ~/src39/ankfont0/$
- おや?こんどはこんなエラーが・・・
- なるほど。txt2bin.exe というコマンドが必要なのか。これ自体は、この ankfont0/ に存在するけれど、これはWin32用だよなぁ・・・・
- あ、なんだ!。ソースがあるじゃない! I.Takさんもたしか、そのままコンパイル出来るって言ってたし。そんなわけで、Linux用の txt2bin を作成。
~/src39/ankfont0/$ gcc -O2 -o txt2bin txt2bin.c ~/src39/ankfont0/$ ls cvs/ makefile newstyle.txt txt2bin.c win31.txt ibmank0.txt makefile~ txt2bin* txt2bin.exe ~/src39/ankfont0/$
- よし!OK。あとは makefile を直しておこう。
・ 42行目 txt2bin.exe $(SRC) $@ ・
↓
・ 42行目 ./txt2bin $(SRC) $@ ・
- おっと。それと、すぐ上のあたりの copy コマンドも、Linux用に修正しておく。
・ 40行目 copy /y $(TARGET0) $(DISTDIR)/$(TARGET) ・
↓
・ 40行目 cp -f $(TARGET0) $(DISTDIR)/$(TARGET) ・
- よぉし!! これで、ここはOKみたいだ。make は、特にエラーを吐くことなく、無事終了できました。
こんどは、sgg00lib!
- sgg00libもやってみよう。では、まず、移動。
~/src39/ankfont0/$ cd ../sgg00lib ~/src39/sgg00lib/$
- そんでもって、メイク。
~/src39/sgg00lib/$ make makefile:1: ..\depend.mak: そのようなファイルやディレクトリはありません makefile:2: ..\rules.mak: そのようなファイルやディレクトリはありません make: *** ターゲット `..\rules.mak' を make するルールがありません. 中止。 ~/src39/sgg00lib/$
- うん、これは簡単だ。さっきと同じで、PATH区切り文字を直そう。
1行目 include ..\depend.mak 2行目 include ..\rules.mak ・ 18行目 DIST_DIR = ..\lib ・ 34行目 %.s : %.c ..\depend.mak ・ 37行目 %.nas : %.s ..\depend.mak ・ 40行目 %.obj : %.nas ..\depend.mak ・ 43行目 %.i : %.ask makefile ..\depend.mak coffhead.ask ・ 56行目 del $(DIST_DIR)\$(TARGET)
↓
1行目 include ../depend.mak 2行目 include ../rules.mak ・ 18行目 DIST_DIR = ../lib ・ 34行目 %.s : %.c ../depend.mak ・ 37行目 %.nas : %.s ../depend.mak ・ 40行目 %.obj : %.nas ../depend.mak ・ 43行目 %.i : %.ask makefile ../depend.mak coffhead.ask ・ 56行目 del $(DIST_DIR)/$(TARGET)
- よし。・・・・おや?。この makefile にも、for が使われている。たぶん、このままでは引っかかってしまうはずだ。 for の部分も直そう。
・ 32行目 for %%i in ($(OBJS)) do echo %%i >> $(OPT) ・ ・ 56行目 for %%i in ($(OBJS)) do del %%i for %%i in ($(C_OBJS:.obj=.s)) do del %%i for %%i in ($(C_OBJS:.obj=.nas)) do del %%i for %%i in ($(C_OBJS:.obj=.lst)) do del %%i for %%i in ($(ASK_OBJS:.obj=.i)) do del %%i for %%i in ($(ASK_OBJS:.obj=.3as)) do del %%i for %%i in ($(ASK_OBJS:.obj=.nas)) do del %%i # for %%i in ($(ASK_OBJS:.obj=.asm)) do del %%i # for %%i in ($(ASK_OBJS:.obj=.obj)) do del %%i for %%i in ($(ASK_OBJS:.obj=.lst)) do del %%i # for %%i in ($(ASK_OBJS:.obj=.map)) do del %%i # del *.lst
↓
・ 32行目 for i in $(OBJS); do echo $$i >> $(OPT) ; done ・ ・ 56行目 for i in $(OBJS) ; do del %%i for i in $(C_OBJS:.obj=.s) ; do del $$i ; done for i in $(C_OBJS:.obj=.nas) ; do del $$i ; done for i in $(C_OBJS:.obj=.lst) ; do del $$i ; done for i in $(ASK_OBJS:.obj=.i) ; do del $$i ; done for i in $(ASK_OBJS:.obj=.3as) ; do del $$i ; done for i in $(ASK_OBJS:.obj=.nas) ; do del $$i ; done # for %%i in ($(ASK_OBJS:.obj=.asm)) do del %%i # for %%i in ($(ASK_OBJS:.obj=.obj)) do del $$i for i in $(ASK_OBJS:.obj=.lst) ; do del %%i ; done # for %%i in ($(ASK_OBJS:.obj=.map)) do del %%i # del *.lst
- さーて。これでいいかな? 再びメイク。
~/src39/sgg00lib/$ make echo on > sysgg00.opt for i in execcmd.obj execcmd0.obj execcmd1.obj fwinman.obj fpokon.obj fdebug.obj ; do echo $i >> sysgg00.opt ; done cpp0 -P -DPCAT -DWIN9X -o execcmd.i execcmd.ask make: cpp0: コマンドが見つかりませんでした make: *** [execcmd.i] エラー 127 ~/src39/sgg00lib/$
- ・・・あら? cpp0 が見つからないって?
- cpp0.exe 自体はもちろん存在するが、これもどうせ Win32用だ。gcc のコマンドの中で、cpp0.exe に相当するコマンドは、ええと・・・・
- たぶん、 cpp でいいと思う。(ちと自身がない)
- こいつの定義は、この makefile ではなく、ひとつ上の rules.mak に定義されている。こいつの11行目を書き換える。
- 再びメイク。
~/src39/sgg00lib/$ make golib00w out:sysgg00.lib execcmd.obj execcmd0.obj execcmd1.obj fwinman.obj fpokon.obj fdebug.obj make: golib00w: コマンドが見つかりませんでした make: *** [sysgg00.lib] エラー 127 ~/src39/sgg00lib/$
- あちゃ! これは GO のコマンドだ。えーと・・ golib00w は? ライブラリアンだと?
うーん・・・。これの代替は、おそらく linux では ld コマンドなんだろうと思うが、ちょっと自信ないなぁ・・。以下は、ちょっとあてずっぽで実験。- 例によって、I.Takさんから助け舟が!。ライブラリアンは、 ar コマンドらしい。
- まず、rules.mak
・ 31行目 GOLIB = $(BIN_PATH)golib00w ・
↓
・ 31行目 GOLIB = $(BIN_PATH)ar ・
- そんでもって、makefileの
・ 27行目 $(GOLIB) out:$@ $(OBJS) ・
↓
・ 27行目 $(GOLIB) rv $@ $(OBJS) ・
- に変更してみた。
- また、いくつかのコピーコマンドを修正
・ 28行目 copy $@ $(DIST_DIR) ・
↓
・ 28行目 cp $@ $(DIST_DIR) ・
- さて、どうなるか?
~/src39/sgg00lib/$ make cpp -P -DPCAT -DWIN9X -o execcmd.i execcmd.ask aska execcmd.i execcmd.3as ・ ・ ・ r - fwinman.obj r - fpokon.obj r - fdebug.obj cp sysgg00.lib ../lib ~/src39/sgg00lib/$
- おぉぉ? なんかイケタっぽいぞよ!!
pcatへ
- これはもう、だいたいパターンなので、まずは PATH区切り文字の掃除。
1行目 include ..\depend.mak 2行目 include ..\rules.mak ・ 29行目 %.bin : %.ask makefile ..\depend.mak ・ 39行目 $(BASE) : $(BASE_NAS) makefile ..\depend.mak
↓
1行目 include ../depend.mak 2行目 include ../rules.mak ・ 29行目 %.bin : %.ask makefile ../depend.mak ・ 39行目 $(BASE) : $(BASE_NAS) makefile ../depend.mak
- さらに、 for の部分を直しておく。
・ ・ 46行目 for %%i in ($(BASE:.exe=.lst)) do del %%i # for %%i in ($(BASE:.exe=.map)) do del %%i for %%i in ($(ASK_OBJS)) do del %%i # for %%i in ($(C_OBJS)) do del %%i for %%i in ($(ASK_OBJS:.bin=.i)) do del %%i for %%i in ($(ASK_OBJS:.bin=.3as)) do del %%i # for %%i in ($(ASK_OBJS:.bin=.asm)) do del %%i for %%i in ($(ASK_OBJS:.bin=.nas)) do del %%i # for %%i in ($(ASK_OBJS:.bin=.obj)) do del %%i for %%i in ($(ASK_OBJS:.bin=.lst)) do del %%i # for %%i in ($(ASK_OBJS:.bin=.map)) do del %%i # for %%i in ($(ASK_OBJS:.bin=.exe)) do del %%i dist_clean: # for %%i in ($(BASE:.exe=.obj)) do del %%i for %%i in ($(BASE:.exe=.lst)) do del %%i # for %%i in ($(BASE:.exe=.map)) do del %%i # for %%i in ($(ASK_OBJS)) do del %%i # for %%i in ($(C_OBJS)) do del %%i for %%i in ($(ASK_OBJS:.bin=.i)) do del %%i for %%i in ($(ASK_OBJS:.bin=.3as)) do del %%i for %%i in ($(ASK_OBJS:.bin=.nas)) do del %%i # for %%i in ($(ASK_OBJS:.bin=.asm)) do del %%i # for %%i in ($(ASK_OBJS:.bin=.obj)) do del %%i # for %%i in ($(ASK_OBJS:.bin=.lst)) do del %%i # for %%i in ($(ASK_OBJS:.bin=.map)) do del %%i # for %%i in ($(ASK_OBJS:.bin=.exe)) do del %%i
↓
・ ・ 46行目 for i in $(BASE:.exe=.lst); do del $$i ; done # for %%i in ($(BASE:.exe=.map)) do del %%i for i in $(ASK_OBJS); do del $$i ; done # for %%i in ($(C_OBJS)) do del %%i for i in $(ASK_OBJS:.bin=.i); do del $$i ;
done
for i in $(ASK_OBJS:.bin=.3as); do del $$i ; done # for %%i in ($(ASK_OBJS:.bin=.asm)) do del %%i for i in $(ASK_OBJS:.bin=.nas); do del $$i ; done # for %%i in ($(ASK_OBJS:.bin=.obj)) do del %%i for i in $(ASK_OBJS:.bin=.lst); do del $$i ; done # for %%i in ($(ASK_OBJS:.bin=.map)) do del %%i # for %%i in ($(ASK_OBJS:.bin=.exe)) do del %%i dist_clean: # for %%i in ($(BASE:.exe=.obj)) do del %%i for i in $(BASE:.exe=.lst); do del $$i ; done # for %%i in ($(BASE:.exe=.map)) do del %%i # for %%i in ($(ASK_OBJS)) do del %%i # for %%i in ($(C_OBJS)) do del %%i for i in $(ASK_OBJS:.bin=.i); do del $$i ;
done
for i in $(ASK_OBJS:.bin=.3as); do del $$i ;
done
for i in $(ASK_OBJS:.bin=.nas); do del $$i ; done # for %%i in ($(ASK_OBJS:.bin=.asm)) do del %%i # for %%i in ($(ASK_OBJS:.bin=.obj)) do del %%i # for %%i in ($(ASK_OBJS:.bin=.lst)) do del %%i # for %%i in ($(ASK_OBJS:.bin=.map)) do del %%i # for %%i in ($(ASK_OBJS:.bin=.exe)) do del %%i
- さらに、 copyコマンドも書き換えておく。
・ 37行目 copy $@ .. ・ 41行目 copy $@ .. ・
↓
・ 37行目 cp $@ .. ・ 41行目 cp $@ .. ・
- うん、これでとりあえずエラーは出なくなった。ここはOKってとこかな?
再び 親ディレクトリへ
- さて、これでやっとサブディレクトリは片付いたようだ。親ディレクトリに戻って、メイクしてみる。
~/src39/pcat/$ cd .. ~/src39/$ make for i in ankfont0 sgg00lib pcat; do make -C $i; done make[1]: 入ります ディレクトリ `src39/ankfont0' make[1]: `../ankfont0.bin' は更新済です make[1]: 出ます ディレクトリ `src39/ankfont0' make[1]: 入ります ディレクトリ `src39/sgg00lib' make[1]: `ALL' に対して行うべき事はありません。 make[1]: 出ます ディレクトリ `src39/sgg00lib' make[1]: 入ります ディレクトリ `src39/pcat' make[1]: `ALL' に対して行うべき事はありません。 make[1]: 出ます ディレクトリ `src39/pcat' make OSASK.EXE make[1]: 入ります ディレクトリ `src39' make[1]: *** `OSASK.EXE' に必要なターゲット `boot32.bin' を make するルールがありません. 中止。 make[1]: 出ます ディレクトリ `src39' make: *** [ALL] エラー 2 ~/src39/$
- ふうむ・・・。もう一歩らしい。ええと、どこかな?
・ 64行目 for %%i in ($(LINK_OBJS)) do echo %%i >> $(OSALINK_OPT) ・
↓
・ 64行目 for i in $(LINK_OBJS) ; do echo $$i >> $(OSALINK_OPT); done ・
- とりあえずこのへんを・・
- うーん・・うまくいかないなぁ・・・あれ?
- ここでふと思い出す。たしか、この makefile って、生成するOSASK.EXEをオプションで指定するんじゃなかったっけ?
- 確認してみた。やっぱし・・・。 pcat とか、vmware とか、指定するんじゃん。
~/src39/$ make pcat depend.mak:1: *** 分離記号を欠いています. 中止。 ~/src39/$
- あら?なんじゃ?これ。
- ええと・・・。はっはぁ・・・なるほど。depend.mak は、自動生成されるファイルなんだけど、これを作る構文がDOS系とちょっとちがうんだ。 makefile を修正。
・ 63行目 echo on > $(OSALINK_OPT) ・ 100行目 echo on > depend.mak ・
↓
・ 63行目 echo -n > $(OSALINK_OPT) ・ 100行目 echo -n > depend.mak ・
- これで、再びメイク。
~/src39/$ make pcat echo > depend.mak echo #DESIGN = WIN9X# Win9x style>> depend.mak echo #DESIGN = WIN31# Win3.1 style>> depend.mak echo #DESIGN = TMENU# T-OSASK>> depend.mak ・ ・ ・ echo > osalink1.opt for i in base.exe boot32.bin ankfont0.tek init.tek tapi0.tek pioneer0.tek papi0.tek winman0.tek pokon0.tek timerdrv.tek keymos0.tek fdcdrv0.tek vgadrv0.tek decode0.tek vesa8.tek vesa16.tek vesa32.tek ; do echo $i >> osalink1.opt;done make[2]: *** `OSASK.EXE' に必要なターゲット `boot32.bin' を make するルールがあ りません. 中止。 make[2]: 出ます ディレクトリ `src39' make[1]: *** [ALL] エラー 2 make[1]: 出ます ディレクトリ `src39' make: *** [pcat] エラー 2 ~/src39/$
- ふうむ・・・。これはどういうことかな???
- あぁ・・。なるほど。I.Takさんが指摘してくれた、osalink1 がないんだ。なるほど。
- tolset05のソースを持ってきて、 osalink1 をメイクしてみる。
- おひゃ! gcc -O2 -o osalink1 osalink1.c で一発じゃん。これを、/usr/bin に置いておく。
- あれえ? 結果が変わんないや。これ以外かな?
- 関係ないかもしれないけど、一箇所発見。 osalink1 は、無オプションで動かすと、OSALINK1.OPT を開こうとするらしい。Linuxの場合は大文字と小文字は区別されるから、明示的に指定してやったほうがいいようだ。
・ 60行目 $(OSALINK) ・
↓
・ 60行目 $(OSALINK) $(OSALINK_OPT) ・
- ううん・・・ちょっとクサイところがあるぞ。こっちの makefile では、例のPATH区切り文字の掃除をしてなかった。ちょっとやっておこう。
・ 127行目 %.i : %.ask .\depend.mak ・ 142行目 %.s : %.c .\depend.mak ・ 145行目 %.nas : %.s .\depend.mak ・ 148行目 %.obj : %.nas .\depend.mak ・
↓
・ 127行目 %.i : %.ask ./depend.mak ・ 142行目 %.s : %.c ./depend.mak ・ 145行目 %.nas : %.s ./depend.mak ・ 148行目 %.obj : %.nas ./depend.mak ・
- お?なんか当りっぽいぞ!。メイクが進んでいる・・・・ん???
・ ・ aska init.i init.3as naskcnv0 -l -s init.3as init.nas nask init.nas init.bin init.lst bim2bin3 -osacmp input:init.bin output:init.tek cpp -P -DPCAT -DWIN9X -o tapi0.i tapi0.ask aska tapi0.i tapi0.3as naskcnv0 -l -s tapi0.3as tapi0.nas nask tapi0.nas tapi0.bin tapi0.lst bim2bin3 -osacmp input:tapi0.bin output:tapi0.tek cpp -P -DPCAT -DWIN9X -o pioneer0.i pioneer0.ask aska pioneer0.i pioneer0.3as
- あらら、ここのところで止まっちゃってるぞ?念のため、待ってみたけど、10分待ってもそのまんま・・・・。なんじゃ?これ。 まさか、ASKAの移植ミスとかか???
- ちょっとわかってきた。*.ask から、*.i を作り出すのに cpp を指定してある。結果を見てみると、基本的には出来ているんだけど、なんかおかしな改行を吐き出しているようだ。 rules.mak の、PREPROCESSOR の指定か、PREPROCESSOR_FLAG の設定のようだ。
- うーん、原因と対策法が大体わかったけど、スマートなやり方を考えるのがちと面倒くさい。カッチョ悪いけど、以下の方法で対処。 makefile を直す。
・ ・ 128行目 %.i : %.ask ./depend.mak $(PREPROCESSOR) $(PREPROCESSOR_FLAGS) -o $*.i $< ・ ・
↓
・ ・ 128行目 %.i : %.ask ./depend.mak $(PREPROCESSOR) $(PREPROCESSOR_FLAGS) -o $*.it $< tr -d "\015" < $*.it > $*.i ; rm $*.it ・
- うーん・・・ちょっとだめだなぁ・・。どうも cpp が吐き出す *.i ファイルがおかしい。オプションをこね回していたけど、*.ask ファイルの数も少ないし、*.ask のファイルの文字コードを、全部 ecu に変更しちゃえ!。 これでとりあえず進めよう。
~/src39/$ make pcat echo -n > depend.mak echo #DESIGN = WIN9X# Win9x style>> depend.mak echo #DESIGN = WIN31# Win3.1 style>> depend.mak ・ ・ ・ nask kjpegls2.nas kjpegls2.obj kjpegls2.lst nask betaclip.nas betaclip.obj betaclip.lst nask bmp2beta.nas bmp2beta.obj bmp2beta.lst obj2bim3 @osask.rul out:winman0.bim stack:8k winman0.obj kjpegls2.obj betaclip.obj bmp2beta.obj Rule file error : unknown file format : lib/sysgg00.lib make[2]: *** [winman0.bim] エラー 7 rm boot32.nas boot32.i boot32.3as winman0.nas kjpegls2.nas kjpegls2.s make[2]: 出ます ディレクトリ `/home/hideyosi/osaskma/src39' make[1]: *** [ALL] エラー 2 make[1]: 出ます ディレクトリ `/home/hideyosi/osaskma/src39' make: *** [pcat] エラー 2
- またまた新しいエラーだなぁ。なになに? lib/sysgg00.lib のフォーマットだと?
- うむむ??。どうも最初のほうでやったコマンドの置き換えがまずかったらしいなぁ・・
・ 27行目 $(GOLIB) rv $@ $(OBJS) ・
- うむむ? この、 rv のオプションがまずいらしいなぁ。ええと?・・・
- どうも、ライブラリの形式が違っているようだなぁ。ar と golib が吐き出すファイルは中身がかなり違う。コンパイラが違うからあっているかもしれないし・・・
- うむむ・・ちょっとこれは調査しなくては・・・。
- この、ライブラリアンの形式についてだが、ちょっと思いつきで実験を行ってみた。Win32環境でコンパイルしたときに出てくる sysgg00.lib をそのまま持ってきてメイクを行ってみた。・・・え"。通った??? 。うわぁぁぁぁ!! OSASK.EXE が出来上がってしまったぞぉぉ!!
- はたして、このOSASK.EXEは、動くのだろうか・・・・
- 残念ながら、こうして出来上がったOSASKは起動することができなかった。がくぅ・・
鮮やか 軽やか!オタスケマン登場!
- そうこうしているうちに、I.TakさんやKタンから「助けにきったっぞ~!(オッタッスッケ~)」ってな具合でアドバイスが続々と。(・・・きっと、見るに見兼ねたんだろうなぁ・・・ (^^;) )
- まずは最初の。 ar の書き方を教えてもらったので、これを実践してみる。
sgg00lib/makefile
・ 27行目 $(GOLIB) rv $@ $(OBJS) ・
↓
・ 27行目 $(GOLIB) rc $@ $(OBJS) ; ranlib $@ ・
- とやってみて、コンパイルしてみる。
- ・・・うーん・・・・。残念ながら、これはまったく結果が変わらなかった・・。
- 今度は、Kタンが移植してくれた golib00 に挑戦してみる。
- おぉぉ!!! コンパイルが実に素直に通ってしまった。 OSASK.EXE が完成した!
- うぐぐぐぐ・・・・残念ながら、このOSASK.EXE も起動しない・・・
秒読み取り消し!!!
- とりあえず、コンパイルを通すことには成功したようだ。第一段階はなんとかってところか。
- さて、それでは、なぜ出来あがったOSASK.EXEが起動しないのか。その原因の追究を開始しよう。
- できあがったOSASKは、Win32で作ったもの(もちろん稼動する)と、サイズが違っている。
- まず、OSASK.EXE を作り上げているものを比べてみる。base.exe 、boot32.bin、それから *.tek だ。ええと・・どれどれ?
- base.exe
- boot32.bin
- ankfont0.tek
- decode0.tek
- fdcdrv0.tek
- init.tek
- keymos0.tek
- papi0.tek
- pioneer0.tek
- pokon0.tek ・・・・ん? こいつ、サイズが違うぞ!
- tapi0.tek
- timerdrv.tek
- vesa8.tek
- vesa16.tek
- vesa32.tek
- vgadrv0.tek
- winman0.tek ・・・・あ、これもだ!
- 上記の pokon0.tek と winman0.tek 以外は、サイズも内容も完全に同じようだ。(バイナリエディタで比較してみた。)
- うむ・・・・とりあえず、pokon0.tek と winman0.tek から調査開始だ。
- まず、Kタンの提案通り pokon0.tek と winman0.tek を、Win32で生成されたものに置き換えてコンパイルしてみた。
- ・・・あっさり動いてしまった。っということは、とりあえずは osalink1 osalink1.opt の段階では問題はないということだろうか。
- 次に、その前の段階。pokon0.bin と winman0.bin を入れ替えて見る。
- うおぉぉ!! I.Takさんの修正で動いてしまったぁぁぁ!! ひえぇぇぇ!! うちでも確認しました!!。
- ・・・つーことは・・・あれ? とりあえずこれ、成功してしまったってこと? うひゃぁぁ!!!
- なんと、Kタンが見るに見かねて GO の移植を表明???。うえぇぇ! いいんですか?忙しいのに・・・。
- えーと・・・。とりあえず、ここまでで出来上がったLinuxで作ったOSASKを公開してみようと思います。 http://hideyosi.zive.net/age/ayu1.lzh これは、ベータどころかもっと前のものなので、ベータテスター向けのお遊び公開っつーことで。マニュアルも説明もありませんし、する気もありませんのであしからず。
新展開! GO が移植された!?
- ここまでは、Linux上のCコンパイラ(gcc。私が使ってたのはVer.2.95.3)でコンパイルが行われていた。しかし、KタンがGOの移植パッチを作ってくれました。こいつのメイクして、差し替えてみよう。
- うっわぁぁ・・・。ちょっとだめだ。 GOをLinuxで動かすには、けっこう細かいチェックや修正がいりそうだ。最終的にはぜひ実現したいが、ちょっとこれは棚上げってことで、後回しにしたほうがよさそう。(せっかく作ってくれたのに、Kタン申し訳ない・・(T T) )
- シャクらしいが、「とにもかくにもとりあえず」LinuxでOSASKをコンパイルすることに成功しました。そんなわけなので、とりあえず現時点までの各種変更をまとめたパッチを作ることにします。
- えーと。そんな感じなので(どんな感じじゃ)暫定パッチを公開します。ただ、残念ながらこのパッチでは、「パッチ一発!」ってわけにはいきません。(力不足です。お恥ずかしい)
- まず、これをゲットしてください。 http://hideyosi.zive.net/age/linonosask.patch make39.lzh の横に置いておきます。
- すみません!書き忘れていましたが、上のパッチ、「PCAT」以外の部分をはしょってます。実験も行っていません。
~/$ lha -x make39.lzh ~/$ cd src39 ~/src39/$ patch -p1 < ../linonosask.patch
- っとまあ、これでパッチは完了ですが、さらに
~/src39/$ cd ankfont0 ~/src39/ankfont0/$ gcc -O2 -o txt2bin txt2bin.c ~/src39/ankfont0/$ cd .. ~/src39/$
- さて、そんなこんなで私の遊びにつきあっていただいた方々、どうもありがとうございました。とりあえず、いったんここまでにしたいと思います。っというのは、やはり GO がLinuxに移植されていないと、なにかと面倒くさいということがわかったからです。これからさっそく、GO の移植に手をつけるつもりです。
- GO がほぼ完全に移植されたら、それらをワンパックにして、「OSASKビルドセット」みたいにまとめるつもりです。そのうえで、改めて本ページを起こしなおしてみようと思っています。そうすれば、きっとRedHat系なら、 ビルドセットのRPMをポンと導入・OSASKのソースにパッチ・メイク一発! が実現できるのではないかと思います。
まとめ。 なぜ、GOの移植を待たねばならないのか? gccではだめなのか?
- まず、現時点では川合堂ブランドのソフトはほとんど問題なく移植されているようです。これは今回、OSASK本体のビルドにガンガン使用してみてほとんど問題が出なかったことからもわかります。
- しかし、Linux上でOSASK用バイナリを生成しようでもわかるとおり、cc1 をソースから起こさなくてはうまくいきません。gccのバージョン間の問題やソースの配布の際の巨大さをみれば、ちと大きな石となります。
- また、今回の移植で gccのCPP にもちょっとした問題がありました。こいつはプリプロセッサとして働いてくれるのですが、どうも改行コードがちがうとASKAがハングアップしてしまうようなコードを吐きます。バッチ処理とかで解決できるのかもしれませんが、かなり野暮ったい方法となるでしょう。
- ライブラリアンも問題です。私の調査不足かもしれませんが、 gcc の ar では、どうしてもOSASKのビルドに使えるライブラリが生成できませんでした。
- I.Takさんが発見してくれた winman0 の問題は、どうも gcc のバグのようです。
- これらを無理にこね回すより、やはり GO を移植したほうが結局スマートなのではないかと考えたからです。幸い Kタンが移植の雛形となる修正をすでに行ってくれていますのし、これを利用しない手はありません。
- ライブラリアンはarです。がんばれ! -- I.Tak. 2003-08-15 (金) 07:49:14
- ライブラリを作るのにはarとranlibを使います。 ar rc $@ $(OBJS) の直後に ranlib $@ としてください。 -- K 2003-08-16 (土) 14:06:36
- arもranlibもでかいので、即興でgolib00をstdc版にしてみました。30分で作ったのでバグがあったらごめんなさい。我ながら移植しやすかったー。 http://osask.ne.nu/golib00s.lzh (2.63KB) -- K 2003-08-16 (土) 14:59:27
- とりあえずCソース由来以外は、1バイトの差もなくwin32上でmakeしたものと同じでなくてはなりません。たとえばbase.exeやinit.tekはまったく同一のものが生成されていますか?1バイトでも違ったらどこかに問題がありますので、中間生成物を追跡して問題を発見してください。 -- K 2003-08-16 (土) 16:18:21
- pokonとwinmanが違うのは当然です。この2つはC言語で書かれていて、今回はGOの代わりにgccを使っていますからね。それ以外のものについて確認したいのですが、サイズが同じというだけではなくて、中身も同じですか? -- K 2003-08-17 (日) 11:27:26
- 仮に中身も同じだとしたら、今度はWindows上で作ったpokon.0tekとwinman0.tekを用意して、osalinkさせてみます。これでうまくいくなら、原因はpokonとwinmanだけです。その先のアドバイスは、ここまでを確認してからですね。 -- K 2003-08-17 (日) 11:30:24
- 私もAT,98,TOWNSで作って動かしましたけど, 動きませんでした。TOWNSではエラーメッセージ (CS:EIP=7:9fc, tss=3000) が出たのでwinman0のリストでも読んでみますか。 -- I.Tak. 2003-08-17 (日) 12:44:30
- ↑読みました。一部のコードがデータセグメントに入ってるようです。で、そこをcallして死亡と。obj, lst, mapはここ http://home1.catvmics.ne.jp/~msy/tak/winman0.lzh 。犯人はコンパイラかリンカか、だれか探ってください。(↑の最初の話) 7,8年前のSlackwareのarではobj2bim3が解釈できるライブラリが作れましたが, 今はarも変わってるようですね。 -- I.Tak. 2003-08-17 (日) 13:50:33
- static JPEG jpeg; という行を ルートスコープ (関数の外) に置いたら動きました。gccのミスです。 -- I.Tak. 2003-08-17 (日) 14:50:45
- gccのバグを回避するためにwinman0.cを書き直すっていうのはなんかしゃくなので、GOを移植しちゃいましょう。ということで現在作業中。多分今日中にできますので、お楽しみに。 -- K 2003-08-17 (日) 16:50:51
- とりあえずできました。[OSASK 6399]を見てください。>GO移植 -- K 2003-08-17 (日) 18:14:02
- GOがLinuxで動けば、バグ回避だけではなく1バイトも違わない全く同じOSASK.EXEができるでしょう。この方がなんとなく安心かな? -- K 2003-08-17 (日) 18:18:48
- 1バイトも違わないってありますか? -- (´_ゝ`) 2003-08-17 (日) 19:41:30
- はい、ありますよ。違うものができる理由がありませんから。 -- K 2003-08-17 (日) 20:16:08
- へぇー -- (´_ゝ`) 2003-08-17 (日) 20:23:47
- セグメンテーション違反です 。。。なんでだろう。。。 -- [[ nask fdcdrv0.nas fdcdrv0.bin fdcdrv0.lst]] 2003-08-17 (日) 20:38:54
- パッチはまだか。がんばってくださいね。pcatの中でnask fdcdrv0.nas fdcdrv0.bin fdcdrv0.lstがSegVするのが悲しいですね。なんででしょうね。 -- (´_ゝ`) 2003-08-18 (月) 10:03:23
- よく分かりませんが、そのnaskはwin32版をそのまま使っている、という初歩的なミスではないんですよね? 使用しているLinuxの正確なバージョンとかnaskのコンパイルに使ったコンパイラのバージョンとかを報告しないと、きっと誰にも答えられないと思います。それにfdcdrv0.nasが正しく生成されているのかどうかも確認が必要です。ところでfdcdrv0以外は問題なくコンパイルできているのでしょうか?・・・もっとも僕はそれら全部を教えてもらってもwin32しか分からないので答えられませんが・・・。>顔文字さん -- K 2003-08-18 (月) 10:40:37
- ええと何がしゃくだったのかを報告しておくと、gccが間違っていてwinmanは正しいのに、問題を解決するために間違っているほうを直すんじゃなくて、正しいほうを間違っているほうに合わせる、っていうのがなんかしゃくだなあ、というそれだけのことです。どうもいいことを説明してごめんなさい。とりあえず、原因が分かってどうすれば回避できるようになったかが分かったのは大きな前進です。ぜひここまでの成果をパッチにまとめてください。>hideyosiさん -- K 2003-08-18 (月) 10:47:33
- すみませんでした。Red Hat9です。naskはgcc3.2.2,2.96でコンパイルしたものどちらでも同じでした。fdcdrv0.nasはありますが、fdcdrv0.lstはないみたいです。それ以外のところは問題なくできたみたいですが。sgg00libとか。 -- (´_ゝ`) 2003-08-18 (月) 11:06:56
- 見えにくいので訂正。gcc-3.2.2でコンパイルしたもの、gcc-2.96でコンパイルしたものどちらでもだめでした。(欝 -- (´_ゝ`) 2003-08-18 (月) 11:22:39
- touchでごまかしてみたところ、vgadrv0やvesa8などでもSegVおこしました。なんでだろう。。。(鬱 -- (´_ゝ`) 2003-08-18 (月) 16:56:06
- うーんと、naskにかける.nasソースは、win32上で生成したものと同じなんでしょうか?改行コードなどバイナリとしては違っていてもテキストとして同じならいいです。もし.nasの時点で違っているなら問題はnaskではなくてそれより前にありそうです(naskcnv0とかASKAとかcpp0とか)。.nasソースが同じなら、naskの移植に失敗しているのではないでしょうか? -- K 2003-08-18 (月) 17:18:32
- win32と同じかどうかはわかりませんが、timedrv,keymos0とかは問題なくできてます -- (´_ゝ`) 2003-08-18 (月) 18:32:23
- パッチ使ったのにSegV...Red Hat9でビルドできた人いないんですか? -- (´_ゝ`) 2003-08-18 (月) 21:05:56
- えぇ!? 私のパッチでもエラーがでましたか? ううむ・・・・。そういえば、顔文字さんはたしか、ASKAの時にもエラーに悩まされておられましたね。もしかしたら、gccやライブラリの構成が違うのかなぁ・・・ -- hideyosi 2003-08-18 (月) 21:26:32
- 顔文字さん、よかったらちょっとお付き合いくださいませんか?。今後のデータにしたいんです。(うちでもRedHat導入すればいいんですが、ちょっと大きくて・・・) -- hideyosi 2003-08-18 (月) 21:28:32
- ASKA、nask,naskcnv0をgcc296でビルドしなおしてもだめでした。cppに/usr/lib/gcc-lib/i386-redhat-linux7/2.96/cpp0をつかってもだめでした。(鬱 -- (´_ゝ`) 2003-08-18 (月) 21:28:55
- ちと確認ですば、cc1は例の方法で作られましたか? 実は、私のところでもしばらく原因不明のエラーが続き、なんだろうと思ったら、パスの順序の関係で元々のcc1に当たっていたんです。例の方法で作ったcc1を、cc1xとかに変名して、rules.makを変更してみてください。 -- hideyosi 2003-08-18 (月) 21:32:54
- それと、もしよかったら、現状(メイクが途中で失敗している)のファイルのリストをいただけませんか?src39直下だけで結構です。ここに書くのはちとあれなんで、よかったら http://bbs.infoseek.co.jp/Board01?user=hideyosi_s にでも買いていただけると、どこいらへんで問題が出ているのかわかるかも・・・ -- hideyosi 2003-08-18 (月) 21:36:59
- はい。つか、pcatでmakeしてるとcc1関係なさそうなんですが。。。nask fdcdrv0.nasの事典でSegVだし。。 -- (´_ゝ`) 2003-08-18 (月) 21:37:16
- CGIに誤りがありますっていわれたので、ls -R src39はだめです。 -- (´_ゝ`) 2003-08-18 (月) 21:50:46
- http://hideyosi.zive.net/goset/goset-0.0.1-0hd1.i386.rpmがあればいいのかもしれませんが、納豆見付けた(Not Found)。。。 -- http://hideyosi.zive.net/goset/goset-0.0.1-0hd1.i386.rpm 2003-08-18 (月) 21:55:20
- ↑(´_ゝ`)です。 -- (´_ゝ`) 2003-08-18 (月) 21:55:39
- うーん・・・。たしかに、かなり不可解なエラーですね。naskやnaskconvに問題があれば、それ以前でエラーが出ていてもおかしくないし・・・ -- hideyosi 2003-08-18 (月) 22:23:02
- あら? いけね。ほんとうだ。動かしちゃったんだ。わすれてた。私が作ったgosetでよければ、あげなおしてありますのでゲットしてください。ただし、注意点。cc1を/usr/binにコピーするので、オリジナルがもしそこにあったら上書きしないように退避させておいてください。それと、大きくて恐縮ですが、これはVineでビルドしたものなので、できればsrcから再ビルドを行うことをお勧めいたします。 「LinuxでOSASKのバイナリ・・」をご覧ください。修正しておきました。 -- hideyodi 2003-08-18 (月) 22:34:06
- GOのcpp0とASKAとの相性がどうかということに関してだけはちょっと自信がないかも・・・。いやその、GOはgcc-3.2のソースをいじくって作ったので、内部構造の全てに僕の目が行き届いているわけではないのです。大丈夫でありますように!・・・まあ問題があれば、僕がGOを直せばいいだけですね。 -- K 2003-08-19 (火) 02:01:09
- 顔文字さんの報告だけでは、他の人にはどうにもできないような・・・。どうすれば解決するかということに関心が集中しているようですが、まずは問題を切り分けないと解決しないと思います。もし手元にwin32環境がなくて比較できないのなら、そちらで生成したfdcdrv0.i、fdcdrv0.3as、fdcdrv0.nasをまとめてlzhにしてアップロードしたらいいんじゃないでしょうか?そうすれば他の誰かでもチェックするところまではできます。 -- K 2003-08-19 (火) 02:50:06
- すみませんでした。以後気をつけます。いちおうlzhをうpしました。これからhideyosiさんのgosetを試してみます。 -- (´_ゝ`) 2003-08-19 (火) 09:29:20
- hideyosiさんのgosetバイナリではうまくいきました!ありがとうございます!これからgosetをリビルドして試してみます。あとはgolib00wだけ用意できればよさそうです。 -- (´_ゝ`) 2003-08-19 (火) 09:34:30
- naskの問題みたいです。/usr/bin/strip: /var/tmp/goset-0.0.1-root/usr/share/osask-examp/stx8OHJK/execcmd.obj: Invalid operation /usr/bin/strip: /var/tmp/goset-0.0.1-root/usr/share/osask-examp/stcZ1wiL/malloc.obj: Invalid operation /usr/bin/strip: /var/tmp/goset-0.0.1-root/usr/share/osask-examp/stqguY0M/memchr.obj: Invalid operation エラー: Bad exit status from /var/tmp/rpm-tmp.42565 (%install) だったので、/var/tmp/goset-0.0.1-root/usr/bin/naskwo -- (´_ゝ`) 2003-08-19 (火) 10:18:35
- をつかってみたら、SegVしました。Red Hatでビルドしたnaskはよくないみたいです。 -- 2003-08-19 (火) 10:19:06
- あ、普通にgolib00wじゃなくてgolib00でいいんですね。depend.makにARCH = pcat [改行] BOCHS = 13 と書き込んだらBochs 2.0.2で起動しましたが、エラーが発生したのでhideyosiさんのBBSに書き込ませていただきます。これから実機でも試してみます。 -- (´_ゝ`) 2003-08-19 (火) 10:31:02
- Bochsでも、起動するときとしないときがあるようです。リセットを繰り返してわかりました。(もうしわけありません。僕にはアセンブリもCもわからないので、原因は分かりません) -- (´_ゝ`) 2003-08-19 (火) 10:39:48
- 実機VAIO+iplfffで問題なく起動しました!本当にありがとうございます。naskについてはRed Hatのgccが悪いんでしょうかね。。上の/var/tmp(ryは、rpmbuild --rebuildしていたときのログです。(src.rpmの問題?) -- (´_ゝ`) 2003-08-19 (火) 11:12:34
- 意見:makefile中の、echo BOCHS = 13>> depend.mak は、echo BOCHS = 13 >> depend.makとするべきでs。13>>は、シェルが出力チャンネルと理解するため、make bochsができないという現象が発生します。もし、よろしければ次期パッチで修正していただけるとありがたいです。 -- (´_ゝ`) 2003-08-19 (火) 11:29:17
- echo #DESIGN = WIN31#なども、echo '#DESIGN = WIN31#'とするべきです。 -- (´_ゝ`) 2003-08-19 (火) 11:36:19
- Windows のコマンドプロンプトでは、>> の前にスペースを入れると、そのスペースがリダイレクト先に出力されます。またクォート"'"もそのまま出力されます。そのため意図した通りに動きません。UNIX 系と Windows 系では Makefile は分けて書くしかないと思います。 -- 小柳 2003-08-19 (火) 12:36:54
- 顔文字さん、レポートありがとうございます。やはり、どうもgccの2.95系と3.2系になにか違いがあるようですね。Vineに3.2系を導入するのはちょっと無理そうなので、RedHatの導入を決行します。(決心つきました。) -- hideyosi 2003-08-19 (火) 12:51:54
- 私もCもアセンブラも全然だめで、えらそうに書いてますが、事実上はコミュニティーの猛者に、「たすけてー!ドラエモーン!」状態です。(お恥ずかしい)でも、なんとかがんばって、LinuxやFreeBSDでイージーに動かせるようにして、コミュニティ成長の呼び水にできたらと思っています。またなにかわかったら、是非レポートよろしくお願いいたします。 -- hideyosi 2003-08-19 (火) 12:58:00
- 余談ですが、そちらは、「顔文字さん」でしょうか?それとも、「ふーん」さんでしょうか? (^^;) -- hideyosi 2003-08-19 (火) 12:59:15
- なんとよんでもよいですけど、「ふーん」ではないです。「流石兄弟」でもないです。「胴無し兄弟」でもないです。余談:あなたは「山崎渉」さんですか?(w -- (´_ゝ`) 2003-08-19 (火) 13:16:12
- 気のせいかも知れないですけど、WIN9X以外のスタイルでは、Bochsでエラーがでなかったような気がします -- (´_ゝ`) 2003-08-19 (火) 13:35:56
- hideyosiさんのnaskと僕のnaskで確認しました。nask iplfff01.asm iplfff01.bin でセグメンテーション違反です。 -- (´_ゝ`) 2003-08-19 (火) 13:43:51
- 本当に済みません。勘違いしていました。naskじゃなくてnasmでコンパイルすればよかったんですね。間違いだらけの発言ばかりして本当に済みません。 -- (´_ゝ`) 2003-08-19 (火) 13:52:10
- sedとshとpatchを駆使 (どこがじゃ) して一発パッチを作ってみました。http://home1.catvmics.ne.jp/~msy/tak/make4lin.tar.gz sedを使うので将来のmakefileにも対応できるかも。ところでこうして作ったOSASK/TWはdrvcf 0を実行するとfdcdrvがページ違反を起こす模様です。ツール群が微妙に非互換になってるようで気になるところ。cppのせいかしら。 -- I.Tak. 2003-08-20 (水) 00:07:48
- いいえ、それは違います。実は僕がsrc39aのinit.askを間違えてしまったせいです。>TOWNS版でdrvcfができない ばれなければこっそりとsrc40aに入れてしまおうと思っていたのですが・・・。すみません。 -- K 2003-08-20 (水) 00:40:49
- /.に載ったようです -- 2003-08-20 (水) 01:16:26
- URLはこちらです。 http://slashdot.jp/developers/03/08/19/1413239.shtml?topic=106 -- K 2003-08-20 (水) 01:30:56
- make4lin.tar.gzでは、txt2binにパスを通したり、$(BIN_PATH)をrules.makから除去したり、osalink1.optをOSALINK1.OPTにリネームする必要があるみたいですね。とりあえず覚書。 -- (´_ゝ`) 2003-08-20 (水) 16:21:34
- たくさんのアドバイスやレポート、ほんとうにどうもありがとうございました。とりあえず、多くの問題が解決したのと、こちらがあまりにも長くなって雑然としてしまいましたので、新しくLinuxでOSASKをビルド!という新しいページを興しました。当ページはもうすこし置いておいて、いずれ移設することにいたします。 -- hideyosi 2003-08-21 (木) 07:31:44
Counter: 440,
today: 1,
yesterday: 0
初版日時: 2003-08-15 (金) 02:13:09
最終更新: 2009-12-15 (火) 00:00:00 (JST) (349d) by lina
|
ぺージ情報 | 閲覧可 | 編集可 | |||
---|---|---|---|---|---|---|
ぺージ名 : | hideyosi/OLD/LinuxでOSASKをビルド!(秒読み) | グループ : | すべての訪問者 | グループ : | なし | |
ページ作成 : | lina | ユーザー : | すべての訪問者 | ユーザー : | なし | |
ページ別名 : | 未設定 |