2019年01月28日

ドリームキャスト開発環境 in Cygwin64

ポリゴン表示はとりあえずひと段落しまして、こないだまで触っていたMPEG1デコーダーの速度問題も pvr_wait_ready(); を外すと全然間に合うというか早いぐらいだったので、そろそろサウンドにかかりたいと思いまして。
サウンド関係は全くノータッチだったので全然仕組みがわからないということで、Marcusさんのサンプルから勉強することにしました。

今までKallistiOSのクロスコンパイラを使っていたのですが、サウンドCPUであるARMのコンパイラの種類がMarcusさんのサンプルと違う(Marcusさんのはarm-elfでKOSはarm-eabi。eabiってなんぞ。)模様だったので、
2019/01/29追記:arm-eabiでもオプション替えたらコンパイルできました。arm-elfって単に古いだけなのでしょうか?
1.ドリームキャストのサウンドの勉強がしたい。
2.なのでKallistiOSを使う環境と棲み分けしたい。
という考えのもと、KallisiOSはCygwinにあるから、「Cygwin64に別環境つくっちゃえ!」というのが今回の話です。

参考:書籍「大熱血アセンブラ」


前置き長いけど要はCygwin64でSHとARMのクロスコンパイラをビルドしようぜ。ということです。
最近SHは下火だそうですね。ドリームキャスト互換機が出れば1000万個ぐらい出荷できるから盛り返すかもしれませんが、とりあえず今は下火だそうで、最新のGCCは不向きだそうです。ルネサスさんセガさんにプレゼンしようよ。
というわけで、以下のバージョンを使用しました。

gmp-5.1.1
mpfr-3.1.2
mpc-1.0.1
binutils-2.28
gcc-4.7.4
newlib-2.0.0


GCCはバージョン4からgmp、mpfr、mpcを先にインストールしなければいけないようです。
インストール先は「/usr/local/dc」としました。お好きな位置に変更してください。
適当にダウンロード、home辺りに解凍してビルドします。バージョンは「熱血アセンブラ」を参考にしました。

gmp-5.1.1
./configure --prefix=/usr/local/dc/gmp --enable-cxx
make
make check
make install

mpfr-3.1.2
./configure --prefix=/usr/local/dc/mpfr --with-gmp=/usr/local/dc/gmp --enable-static --disable-shared
make
make check
make install

mpc-1.0.1
./configure --prefix=/usr/local/dc/mpc --with-gmp=/usr/local/dc/gmp --with-mpfr=/usr/local/dc/mpfr --enable-static --disable-shared
make
make check
make install

「--enable-cxx」はC++有効という意味だそうです。
「--enable-static」と「--disable-shared」は ./configure を実行する際に警告されたため付けました。環境によっては必要ないのでしょうか?

次はbinutilsをインストールします。

binutils-2.28
mkdir build-sh-elf
cd build-sh-elf
../configure --target=sh-elf --prefix=/usr/local/dc/sh-elf --disable-nls
make

「--disable-nls」は国際化、つまり日本語表示しないということです。不具合でたらめんどくさいのでつけました。

最後にgccとnewlibをまとめてビルドします。二つとも解凍しておきましょう。
gccですが、4.8.x以降は共通のエラーが出てビルドできませんでした。ビルドの方法が変わっているのかもしれません。

gcc-4.7.4 newlib-2.0.0

まず、以下の三つのファイルを修正します。

./gcc/doc/gcc.texiを以下のように修正。参考:https://osmocom.org/attachments/2798/patch-gcc46-texi.diff
- 89 @tab General: @tex press@@gnu.org @end tex
+ 89 @tab General:
@tex
press@@gnu.org
@end tex
- 91 @tab Orders: @tex sales@@gnu.org @end tex
+ 91 @tab Orders:
@tex
sales@@gnu.org
@end tex

./gcc/cp/cfns.gperfに以下の行を追加。参考:https://patchwork.ozlabs.org/patch/504982/
+ 25 #ifdef __GNUC_STDC_INLINE__
__attribute__ ((__gnu_inline__))
#endif

./gcc/cp/cfns.hに以下の行を追加。
+ 56 #ifdef __GNUC_STDC_INLINE__
__attribute__ ((__gnu_inline__))
#endif


gccのフォルダ内に移動し、パスを通してからシンボリックリンクを作成します。
cd gcc-4.7.4
export LD_RUN_PATH=/usr/local/dc/gmp/lib:/usr/local/dc/mpfr/lib:/usr/local/dc/mpc/lib
ln -sf ../newlib-2.0.0/newlib .
ln -sf ../newlib-2.0.0/libgloss .

シンボリックリンクとは、擬似的にフォルダ階層を作るものだそうです。ためしに「cd newlib」と打ってみてください。gcc-4.7.4フォルダ内にnewlibフォルダなど存在しないのに移動できてしまいます。これはすごい。はい、「cd ../」で戻りましょう。
mkdir build-sh-elf
cd build-sh-elf
../configure --target=sh-elf --prefix=/usr/local/dc/sh-elf --with-gmp=/usr/local/dc/gmp --with-mpfr=/usr/local/dc/mpfr --with-mpc=/usr/local/dc/mpc --disable-nls --disable-lto --disable-libgomp --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-languages=c,c++ --with-newlib
make
make install

これでgccとnewlibが一気にビルドされます。永遠に思えるかのようなビルド時間ですがエラーが出なければこれで終わりです。
「--disable-lto」はリンク時に最適化を行わないということです。「--disable-libstdcxx-pch」はビルド時にホストのC++コンパイラを使わないということだそうで、これがないとエラーが出てビルドできませんでした。C++を使わないならいらないかと思います。
最初は「--disable-multilib」をつけていたのですが、multilibとは複数のSHシリーズに対応するのに必要なものだそうで、これがないと自作ソフトのコンパイルの時リンク先が見当たらないとか言われます。

これで終わりです。次にARMコンパイラをビルドしますが、gmp、mpfr、mpcは新しくビルドせずこのまま使えます。
ARMのコンパイラは、「sh-elf」を「arm-elf」に変更し、gccのconfigureに「--enable-obsolete」をつけましょう。つけないと怒られました。

dc-toolを「/usr/local/dc/bin/」にインストールしてから、「/home/ユーザー名/.bash_profile」に以下の行を追加しておけば、いちいちフォルダパスを打たなくても実行できるようになります。
export PATH=$PATH:/usr/local/dc/bin:/usr/local/dc/sh-elf/bin:/usr/local/dc/arm-elf/bin



よっしゃー!終わったー!
posted by たあし at 11:01| Comment(0) | ドリームキャスト開発 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: