Apple Silicon(M1) 対応の Firebase Unity SDK 作成手順

# 背景
- Firebaseが Apple Silicon 版 Unity Editor に未対応
    - https://github.com/firebase/quickstart-unity/issues/1100
- でも Apple Silicon 版 Editorはめちゃ早なので使いたい

#環境
macOS(12.2.1)
Unity(2021.3.0f1)

# 手順
## SDKのソースコード取得
幸い Firebase はオープンソースなので自分でビルド出来る
- https://github.com/firebase/firebase-unity-sdk
git clone か zipで手元に持ってくる

## 公式手順の確認
- 「Macでビルドする際に事前に実行してね」の注釈があるので、それぞれ実行する
    - https://github.com/firebase/firebase-unity-sdk#prerequisites-for-mac

## ビルド準備(オプションの確認)
- Universal Binaryを作る時は `-DCMAKE_OSX_ARCHITECTURES="arm64;x86_64"`
- Firebaseのバージョン指定は `-DFIREBASE_UNITY_SDK_VERSION=X.X.X`
    - https://github.com/firebase/firebase-unity-sdk#building

## ビルド
自分は 8.9.0 が欲しかったので、ターミナルで

```
./build_macos.sh -DFIREBASE_UNITY_SDK_VERSION=8.9.0 -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64"
```

を実行
cmakeの out-of-sourceビルドが自動で実行され、 `macos_unity` というフォルダを自動で作ってくれてそこに成果物が吐き出されます
失敗した場合、 `macos_unity` ディレクトリをまるごと消してやり直します

`build_macos.sh` を覗くとわかりますが、内部で叩いているのは `build_bash.sh` です

複数回の実行でかなり時間が掛かったので、自分は `build_bash.sh` の中の
```
    # Build the SDK
    make
```
の箇所を make -j8 に変えてしまいました (出力が若干怪しかったので、時間があるなら並列にしない方が良いかも知れません)

### なんかエラー

```
    from absl import app
ImportError: No module named absl
```
absl とやらがないらしいので入れる
実行ログを見ると `/usr/bin/python` を使用している
```
-- Found PythonInterp: /usr/bin/python (found suitable version "2.7.18", minimum required is "2.7")
```

pip をアップデートしてくれというメッセージが出たので pip も更新
pip が新しすぎて荷が重い模様なのでバージョン指定で入れた

```
% /usr/bin/python -m pip install --upgrade pip==20.3
% /usr/bin/python -m pip install absl-py
```

### なんかエラー

```
ld: warning: ignoring file /usr/local/Cellar/openssl@1.1/1.1.1n/lib/libssl.a, building for macOS-arm64 but attempting to link with file built for macOS-x86_64
ld: warning: ignoring file /usr/local/Cellar/openssl@1.1/1.1.1n/lib/libcrypto.a, building for macOS-arm64 but attempting to link with file built for macOS-x86_64
```

openssl が x86_64のしかないよって言ってる

```
% lipo -info /usr/local/Cellar/openssl@1.1/1.1.1n/lib/libssl.a
Non-fat file: /usr/local/Cellar/openssl@1.1/1.1.1n/lib/libssl.a is architecture: x86_64
% lipo -info /usr/local/Cellar/openssl@1.1/1.1.1n/lib/libcrypto.a
Non-fat file: /usr/local/Cellar/openssl@1.1/1.1.1n/lib/libcrypto.a is architecture: x86_64
```

確かに。

## OpenSSLの Universal Binary 作成
- ソースコード持ってくる
    - https://github.com/openssl/openssl/tags
- arm64用とx86_64用にディレクトリごとコピーしてそれぞれビルド
    - 参考: https://blog.andrewmadsen.com/2020/06/22/building-openssl-for.html

### arm64用のビルド

```
% ./Configure darwin64-arm64-cc --prefix="/tmp/openssl-arm" no-asm
% make
% make install
```

### x86_64用のビルド

```
% ./Configure darwin64-x86_64-cc --prefix="/tmp/openssl-x86"
% make
% make install
```

ここでも自分は make に -j8 つけました

### Universal Binary作成
```
% lipo /tmp/openssl-arm/lib/libssl.a /tmp/openssl-x86/lib/libssl.a -create -output libssl.a
```

出来たので差し替えて確認

```
% lipo -info /usr/local/Cellar/openssl@1.1/1.1.1n/lib/libssl.a
Architectures in the fat file: /usr/local/Cellar/openssl@1.1/1.1.1n/lib/libssl.a are: x86_64 arm64
```

Universal Binary になっている

libcrypto.aの方も同様に作成・差し替える

# 再度ビルド
```
./build_macos.sh -DFIREBASE_UNITY_SDK_VERSION=8.9.0 -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64"
```

# 出来た
`macos_unity` ディレクトリに成果物がある

```
% find . -name "*.bundle"
./macos_unity/database/FirebaseCppDatabase.bundle
./macos_unity/FirebaseCppApp-8_9_0.bundle
./macos_unity/crashlytics/FirebaseCppCrashlytics.bundle
./macos_unity/bin/external/src/firestore-build/external/src/grpc/src/objective-c/tests/TestCertificates.bundle
./macos_unity/firestore/FirebaseCppFirestore.bundle
./macos_unity/auth/FirebaseCppAuth.bundle
./macos_unity/storage/FirebaseCppStorage.bundle
./macos_unity/installations/FirebaseCppInstallations.bundle
./macos_unity/functions/FirebaseCppFunctions.bundle
./macos_unity/remote_config/FirebaseCppRemoteConfig.bundle
./macos_unity/dynamic_links/FirebaseCppDynamicLinks.bundle
./macos_unity/messaging/FirebaseCppMessaging.bundle
./macos_unity/analytics/FirebaseCppAnalytics.bundle

% lipo -info macos_unity/FirebaseCppApp-8_9_0.bundle
Architectures in the fat file: macos_unity/FirebaseCppApp-8_9_0.bundle are: x86_64 arm64
```
 
# 既存ファイル差し替え
自分は `.unitypackage` ではなく `.tgz` ファイルを用いて `packages/manifest.json` へ記述する方法で対応しているので、
`com.google.firebase.app-8.9.0.tgz` を展開して `FirebaseCppApp-8_9_0.bundle` を差し替えて再圧縮
他も同様

以上で動きました