本記事について
この記事は CoreBluetoothForUnity Advent Calendar 2023 の10日目の記事です。
CoreBluetoothForUnity では以下の手順で iOS と macOS の NativePlugin をビルドしています。
- プロジェクト直下で
make plugins/build
を実行 - UnityEditor を再起動 (プラグイン再読み込みのために必要)
make plugins/build
でやってること、作り方について紹介します。
前提
本記事のやり方は keijiro さんの MEMO に書かれている方法で作られています。
本記事の内容は以下の記事の内容から派生しています。
環境
- Unity 2022.3
- CoreBluetoothForUnity 0.4.3
Xcode Project (というかワークスペース)は以下です。
workspace には CB4UNativeApp と CoreBluetoothForUnity の2つが含まれています。
CB4UNativeApp はテスト用のアプリのため、ビルドには関係がありません。
workspace 内の CoreBluetoothForUnity は SwiftPackage で、ここから NativePlugin をビルドします。
ビルドで出力するファイル
keijiro さんの MEMO にある通り、
macOS 向けには .dylib
、iOS 向けには .framework
を出力します。
dylib の出力方法
コマンドは keijiro さんのサンプルからそのまま拝借しています。
swift build -c release --arch arm64 --arch x86_64
このコマンドで dylib を生成するためには Package.swift でライブラリタイプを .dynamic
にする必要があります。
参考
framework の出力方法
こちらのコマンドは keijiro さんのサンプルを参考にしつつ、改変したものになっています。
framework/build:
xcodebuild -scheme $(BASE_NAME) -workspace $(WORKSPACE) -configuration Release -sdk iphoneos \
-destination generic/platform=iOS -derivedDataPath ./$(BUILD_DIR)/Framework build
- workspaceはなくても動くけど、あったほうがいいかなと思って入れています
- ENABLE_BITCODE は非推奨のパラメータのため削除
- 末尾に action を明示するために build を追加
- 出力先はFramework専用のディレクトリにする
そして、こちらのコマンドも同様に SwiftPackage のライブラリタイプを .dynamic
にしないと生成されません。
xcframework の中のファイルとの比較
こちらの記事では xcframework を生成し、その中の framework を取り出していました。今回は別の方法になっています。
これらは同じファイルかと思いきや framework のサイズが違いました。(75%程度に縮みました)
xcodebuild のオプションでも容量が変わるかを検証してみました。
xcframeworkの中のframework 426KB
- sdk指定なし
(生成されたフォルダの合計容量 86.4MB)
framework 649KB
- sdk指定あり
(生成されたフォルダの合計サイズ 19.3MB)
framework 324 KB
sdk指定したほうが容量減ってる。
- destination指定
容量変わらず
sdk を iphoneos にするとどうなるか
=> 最新バージョンが使われるようです。
ログ
Build settings from command line:
SDKROOT = iphoneos17.0
結論としては xcodebuild で sdk を指定するのが一番容量の小さい framework が生成できるようです。(理由はわかってないです)
Makefile でまとめて実行
やり方はそのまま Makefile をみていただくのが良いかと思います。
Xcode Project の Makefile
.env ファイルに Native Plugin を配置する絶対パスを記述しておき、ビルドしたらそのディレクトリにコピーするようにしています。
リポジトリ直下の Makefile
make -C
によってサブディレクトリの Makefile のコマンドを実行しています。
おわりに
本記事では NativePlugin のビルド方法について紹介しました。
特に library type を dynamic にしないといけないことにたどり着くまでに時間がかかりました。最終的には概ね理想通りのものができたためよかったかなと思っています。
もしもっと良いやり方をご存知でしたら教えていただけると嬉しいです!