Open5

Yuniframeパッケージングまつり

okuokuokuoku

今迄面倒で真面目にやってこなかったパッケージングをひととおり実装してみるテスト。

そもそもパッケージングとは何か

iOSやAndroid、macやWindowsのように、いわゆるアプリストアのあるシステムでは、アプリケーションを "パッケージ化" する必要がある。

単にC/C++ソースコードをコンパイルしてリンクするだけでは不十分で:

  • アプリケーションのアイコンや利用する機能を設定/宣言する
  • パッケージに署名する
  • ストアへの提出用にアーカイブする

といった処理を行う必要がある。

okuokuokuoku

3つのパッケージング流儀

CMakeプロジェクトを想定した場合、パッケージングの流儀は3つに分類できる。

  1. 自分でSDKのコマンドを1つ1つ呼んでパッケージしなければならない派 -- SteamやEmscriptenがここに相当する。今回は扱わず後回し。
  2. ビルドシステムに統合: CMakeで生成できるプロジェクトファイルを利用してパッケージを作成する派 -- iOSやWindows Storeがこれに相当する。iOSの場合はXcode、Windowsの場合はVisual Studioが使え、これらのプロジェクトファイルはパッケージングの制御も含めてCMakeから行える。
  3. ビルドシステムに統合: Java -- Android。AndroidのビルドシステムはJavaが前提となっているため、CMakeでは生成できない。

ReactNativeや各種ゲームエンジンはこれらを抽象化しているが、Yuniframeは素のCMakeで記述できることに重きを置いているのでそれぞれに自前で対応する必要がある。

okuokuokuoku

iOS / macOS

iOSはXcodeのプロジェクトを生成すれば良い。

https://github.com/okuoku/em2native-tests/blob/0592d8b5ca32ab33ca1966e16375e642d9b8cbb4/native/imgui/CMakeLists.txt#L113-L126

Windows(UWP)とも共通する流れとしては、 add_executable したターゲットに適切なプロパティを設定することで実行ファイルだけでなく .app (フォルダ、mac流儀ではバンドルと呼ばれる) の作成もさせることができ、Xcodeは専用のコマンドでこれを提出/インストール用の .ipa にエクスポートできる。

okuokuokuoku

Windows UWP

普通にExecutableを作れば良い。ただし、標準のリンクコマンドラインは未だに間違っているので手動でライブラリを追加する必要がある。

https://github.com/okuoku/em2native-tests/blob/0592d8b5ca32ab33ca1966e16375e642d9b8cbb4/native/imgui/CMakeLists.txt#L98-L109

一応現状の設定で最新のXbox SeriesSでも実行できることを確認した。ただ、XboxにおけるUWPはいつまで残るのか謎と言える。

https://zenn.dev/okuoku/scraps/de67e3cab959d4

UWPは地味に実行時のパーミッションチェックが厳しいようなので要注意。

https://zenn.dev/okuoku/scraps/406fbc2a9c77a8