BoxedwineをEmscriptenでビルドして動かすメモ

公開:2021/01/02
更新:2021/01/04
3 min読了の目安(約2700字TECH技術記事

Boxedwine

↑ で以前紹介したLinux + x86エミュレータ。この場で試したければ公式サイトにデモが置いてある。

Emscripten移植もちゃんとメンテナンスされていて、最新版では音声等に改善がみられる。

Emscripten版

ネイティブ版は動的リコンパイラもありかなり快適に動作するが、Emscripten版は:

  • 遅い(386-16MHzくらいか)
  • 音は出る
  • DirectX (Direct3D)はまだ(後述)

という感じ。 CheerpX がデモを見る限り割と常識的な速度のx86エミュレーションを実現しているのを考えると、もうちょっと向上の余地はあるのかもしれない。

ビルド

リポジトリをチェックアウトして、 /project/emscripten/buildjs.sh を実行すれば良い。 emcc にパスを通しておく必要がある。

emscripten 2.xx 対応

ターゲットしているEmscriptenが古いので、手元では createFoldermkdir への書き換えが必要になった。

EDIT: upstreamは createPath を使ったようだ: https://github.com/danoon2/Boxedwine/commit/f35755e710cc7b63e5d666da2bb0f04fb540b654

        function buildBrowserFileSystem(writableStorage, isDropBox, homeAdapter, extraFSs, zipfs)
        {
            FS.createFolder(FS.root, 'root', true, true);
            FS.createFolder("/root", 'base', true, true);
            FS.createFolder("/root", 'files', true, true);

        function buildBrowserFileSystem(writableStorage, isDropBox, homeAdapter, extraFSs, zipfs)
        {
            FS.mkdir("/root", 511);
            FS.mkdir("/root/base", 511);
            FS.mkdir("/root/files", 511);

起動

以下をHTTPでサーブする:

boxedwine.css   boxedwine.js     boxedwine.zip       browserfs.boxedwine.js
boxedwine.html  boxedwine.wasm   boxedwine-shell.js  jszip.min.js

boxedwine.zip は、 https://sourceforge.net/projects/boxedwine/files/FileSystems/Full/v5/ からDebian10-Wine-5.0.zipをダウンロードし、リネームしておく。ファイルシステムに加えたいものがあれば、この.zipを編集することでファイルを投入できる。

( boxedwine-shell.js 側にDropbox連携等も実装されているので、ドキュメント参照 https://github.com/danoon2/Boxedwine/blob/fb3b4261dba58e9f6edc4c5e46126a691792cf3a/buildFlags.txt#L17 )

(OpenGLサポート)

BoxedwineにはOpenGLとOpenGL ESの両方のサポートが入ってはいるものの、ES側はあまりメンテナンスされていないようだ。

#if defined(BOXEDWINE_OPENGL_SDL) || defined(BOXEDWINE_OPENGLS_ES)

ここのtypo (OPENGLSOPENGL)や、拡張のwrapが不十分などの理由で正常にビルドできない。

代わりに emscripten/integrate-gl4es ブランチがあり、そちらでは gl4es (レガシOpenGLをOpenGL ESでエミュレートするもの)の統合をやっている。ただし、手元では正常に動作させることができなかった。

Emscripten自体にもレガシOpenGLのエミュレーションレイヤはあるが、多分gl4esを使った方が良い結果が得られるのではないかと思う。