ブラウザウディタ:再始動1週間目の動き
進捗
こんにちは、rikkaです。
再起動宣言をしてから一週間が経ちましたので、進捗を報告します。
この一週間は、前回の挑戦分の記録をたどって思い出す日々でした。
先日の記事でも軽く触れたとおり、ブラウザの仕様や開発環境の進歩によって、前回の挑戦分のコードはそのままでは素直に動かなくなってしまっていました。
それを動くように弄りなおすというのが、ここ一週間の序盤の挑戦でした。
結論からいえば、その挑戦はうまくいきました!
つまり、これを以て前回の最新分まではリカバリーできたことになります。
まだまだ全体的に仮の実装な部分が多く、テストコードもロクに書けてないので今すぐ試して頂くというわけにはいきませんが、希望は絶えていません。
前回は報告をするにしても文面の体裁を気にして頻繁な更新を忘れてしまっていたのですが、今回は些細なことでも定期的な報告が出来ればと思っています。
以下、少し詳細な技術的なメモ等を含む感想になります。
今回の再挑戦にあたり、全体のビルド環境(Webで実行可能なアプリケーションの作成環境)を作り直しています。
基本的に、ウディタのGame.exe部分はDxLibとWindowsに依存したC++のコードで書かれており、これを極力弄らずそのままWeb向けにビルドしたいのです。
そのために前回は、CMakeをビルドツールとして使い、Emscripten(C++コードをWeb向けにビルドするためのコンパイラ/リンカ)を直接呼び出していました。
しかし今回は、これをzig言語という、ビルドツールとしても使えるプログラミング言語環境に置き換えています。
そしてzig言語は素晴しい環境なのですが、まだ発展途上なところがあり、破壊的な変更(仕様が大きく変わっていて事前に調べた関数が呼び出せなくなるなどの変更)が結構多くて、つまづきまくりました。
またEmscriptenもそれはそれでつまづきポイントがあります。
ここに書くのもどうかとは思うのですが、同じところでつまづいた人が検索して参考にでもできるように、少し詳細すぎるつまづきポイントを記録しておきます。
完全に読み飛ばして頂いて大丈夫です。
zig言語 x emscripten つまづきポイント
zig言語独自のヘッダ
zig言語は独自の、zig言語で再実装したlibcのヘッダを持っていて、標準で使うようになっています。
これがEmscripten標準のC言語実装と互換性がなく、そのまま使うと破滅します。
emscripten向けにビルドするときは、--nostdinc --nostdinc++ というコンパイラオプションをコンパイル時に指定してzig言語の標準ヘッダを抜く必要があります。
CとC++のヘッダの検索順序
↑の設定で標準ライブラリを抜くと、個別に指定しない限り標準ライブラリが使えなくなります。
そして、手動でbuild.zigにemscriptenのincludeパスを指定する必要があるのですが、この時普通にaddIncludePathすると、C++側で定義されているC言語向けヘッダが標準のC言語向けヘッダで隠蔽されてエラーが起きます。
C言語側のヘッダをaddAfterIncludePathで追加する必要があります(非優先的なincludeパスの指定)。
lib.addIncludePath(emsdkIncludeCppPath);
lib.addAfterIncludePath(emsdkIncludePath);
そもそもzig言語からのemscriptenの利用方法が分からない
sokolというゲーム基盤的なライブラリのプロジェクトが参考になります。
おわりに
以上です。
個人的なメモの要素が強くなってしまいましたが、今後もこんな感じで進めていけたらと思っています。
出来るだけ、前回のように途切れてしまわないように不要なことでも何か書いていくつもりです。
今後とも、よろしくお願いします。