Xcodeの『building for iOS Simulator, but linking …』エラーに対処するツールを作ったのでご紹介

5021 ワード

こんにちは、あらさん( )です。
食洗機に分岐水栓つけたら快適すぎて唐揚げ食べる頻度が高くなりました。

何を作ったのか

Apple Silicon Mac(M1 Mac)のXcodeを利用してプロジェクトを実機向けとシミュレータ向けにビルドすると,実機向けにはビルドが成功するのにシミュレータ向けにビルドする場合には『building for iOS Simulator, but linking in object file built for iOS, for architecture arm64』というエラーによりビルドが失敗します。
これは内部で利用しているライブラリがApple Silicon MacのXcodeで利用されるSimulatorに対応していないためです。

具体的に言うとRosetta2で動かしたXcodeではIntel Macと同様にXcodeとSimulatorがx86_64のアーキテクチャの上で動くのに対して,通常の起動方法ではApple Silicon Macの場合はXcodeとSimulatorはarm64のアーキテクチャの上で動きます。内部で利用しているライブラリを見るとarm64の実機向けビルドとx86_64のシミュレータ向けビルドが同梱されている場合に上記のエラーが発生します。Rosetta2を使うとx86_64のシミュレータ向けビルドが使えるためシミュレータ向けビルドを使えるのに対して,通常の起動ではarm64のシミュレータ向けビルドが見つからないため失敗してしまいます。

これに対処する方法はarm64のシミュレータ向けビルドを用意することなのですが,これがかなり難しいです。何かのツールの依存関係でビルド済みライブラリが存在している場合はこれをarm64のシミュレータ向けビルドにする必要があります。ここで今までのワークフローではarm64の実機向けビルドとx86_64のシミュレータ向けビルドを同梱していたのですが,arm64の実機向けとarm64のシミュレータ向けビルドは同梱できません。xcframeworkを利用して同梱する必要があります。

また,ソースコードが存在していればarm64のシミュレータ向けビルドを手元で作成すれば良いのですが,もしない場合にはビルド元にシミュレータ向けビルドも提供してもらわなければなりません。利用する際にはシミュレータ向けと実機向けを選択するときに都度2つのライブラリどちらかを見るようにワークフローを組み直す,または提供元にxcframworkを提供してもらってプロジェクトに組み込む必要があります。

これに対して,xcframeworkをframeworkから生成するツールが存在していました。ただし,ワークフローの組み換えが必要で煩雑です。そこでライブラリ自体を動的に選択できるツールを作成しました。