2018年4月20日金曜日

PC-98のエミュレータにもなる Dosbox-X 0.82.5 が Mac でビルドできましたという話

PC-98のエミュレータでもある Dosbox-X 0.82.5 が OS X Mountain Lion (Mac OS X Version 10.8.5) 上でビルドでき、かつ動きました。その証拠がこちら:

1,2枚目はPC-98エミュレーションモードに入ったこと、3,4枚目は従来からDOSBoxの機能であるPC-DOSエミュレーションを示しています。 まあしかしDOSBoxの設定方法ともだいぶ違うようでPC-98の使いかたが全然わからん。 プロジェクトのウェブサイトはこちら、でソースコードはこちら DOSBox-X release 0.82.5 2018-04-18 23:51。 こちらのサイトでは Mac 用のバイナリも配布されていますが、おそらく Mountain Lion はサポート されておらず動きませんでした。そこで自前でビルドする必要があります。 ということで以下の通りにコンパイルできました。それでも大きな変更なく自前でビルドするだけでちゃんと動くのは大したもんだなあ。

ビルドにあたっては、配布されたソースコードの src/dos/drive_local.cpp の前処理部をじゃっかん書き足す必要がある。そのパッチを以下に示します:
--- drive_local.cpp.orig        2018-04-20 21:15:06.000000000 +0900
+++ drive_local.cpp     2018-04-20 22:04:48.000000000 +0900
@@ -31,6 +31,9 @@
 #include "inout.h"
 #ifndef WIN32
 #include <utime.h>
+# if defined(__APPLE__) || defined(__MACH__)
+# include <sys/syslimits.h>
+# endif
 #else
 #include <sys/utime.h>
 #include <sys/locking.h>
この変更がない場合, src/dos/drive_local.cppMAX_PATH が定義されていない、といってコンパイルが途中で止まる。 MAX_PATH は OS が受容できるパスの長さの最大値を示すのかもしれませんが、 Mountain Lion の場合、この値は /usr/include にある sys/syslimits.h で定義されたマクロ識別子 PATH_MAX が必要です。 上記の src/dos/drive_local.cpp では MAX_PATH の値が PATH_MAX の値だと定められていることによります。上記の変更前の状態では Windows (32bit版) でないかどうか、の条件分岐しかなく、 Windows でないがかつ Mountain Lion の場合にも utime.h を読みに行くのでしょう。しかしすくなくとも /usr/include にそんな定義は sys/syslimits.h にしかなかった。これはたぶん Linux だけが念頭にある話なんでしょうか。

※注記 なお、これはポーティングには違いないですがベストプラクティスとも思えないのでまあバッドノウハウの類なんじゃないでしょうか。ただし現時点でとくに不具合はありません。

そこで適用したコマンドは以下のとおり、ただしこれは上記パッチを当ててからの話:
$ ./autogen.sh
$ CFLAGS='-I/usr/include -I/opt/X11/include -I/opt/local/include'\
CPPFLAGS='-I/usr/include -I/opt/X11/include -I/opt/local/include'\
CC=gcc-mp-5 CXX=g++-mp-5 ./configure --disable-sdl2
$ make -j3
$ make install
フラグでヘッダファイルのインクルード先をやたら指定しているので要らないやつがあるかもしれんのですが、/usr/include は誰でも要るはずです。 ただし /opt/X11 は XQuartz だけが使用しておりもしかしたら要らんかもしれず(ここらへんはよくわかってない)、また /opt/local はMacPortsが使用しているために俺の環境ではやはり外せないわけですが、これを手で与えるのではなくて自動にできんものかしらね。 あとは、俺の環境では SDL2 が共存しているので SDL1.2 の使用を明示することが必要でした (現状ではSDL2はサポートしてないとかREADMEとかINSTALLのファイルに説明してあるので)。

とまあこのようにやると最初に掲げた画面が得られます。人によっては足りないライブラリがあると make に言われるかもしれません、俺の場合は xkbfile がないと言われたので、 MacPorts で xorg-libxkbfile をインストールしたら直ちに解決できました。

0 件のコメント:

コメントを投稿