M1 MacでSimulatorのビルドにハマった
ようやく会社の開発端末がM1系Macに変わったので環境構築をしていました。
CocoaPodsのインストールに少しハマりつつ、これまではbundler経由でインストールしていたものをHomebrew経由のインストールに切り替えたことで事なきを得ました。
実機での開発環境構築自体も割とすぐに終わり、スムーズに開発できるかなと思っていたところに落とし穴がありました。
最初に結論を言っておくと、色々調べるとXcodeのBuild Settingsに
EXCLUDED_ARCHS[sdk=iphonesimulator*]: arm64
を設定すればいいみたいな記事だらけなのですが、むしろこの設定が不要でした。(恐らく過渡期では必要だったのでしょう)
※Build Settingsの記載はXcodeGenのYAMLファイルでの記載を前提にしています。
※Xcodeのバージョンは執筆時点(2022/02/09)で13.2.1 (13C100)を前提にしています。
iOS Simulator向けにビルドできない問題
独自ターゲット
Xcodeのユニットテストはシミュレーターで実行することが多いと思うのですが、シミュレーターでのビルド時に下記のようなエラーが出ました。
could not find module 'XXX' for target 'x86_64-apple-ios-simulator'; found: arm64, arm64-apple-ios-simulator
XXXは自分で作成したターゲットで、特に自分で設定をした記憶もなかったのですが、これは自分が悪かったようです。
原因はよくわかってないのですが、作成したターゲットでInfo.plistを持っていることで発生していたようなので、各ターゲットのInfo.plistを削除してXcodeのBuild Settingsで自動的にInfo.plistを生成するように変更しました。(これはユニットテストのターゲットでも同様)
GENERATE_INFOPLIST_FILE: YES
INFOPLIST_FILE:
外部ライブラリ
上記の設定をして再度ビルドしてみるとエラーのメッセージが変わりました。
The linked framework 'Pods_Base_YYYY.framework' is missing one or more architectures required by this target: x86_64.
どうやらCocoaPodsのリンクがうまくいっていないようなのですが原因がよく分かりません。
そこでXcodeのBuild Settingsを眺めていると普段開発しているターゲットのiOS Simulatorでarm64のビルドをしない設定になっていました。
ただ、こんな設定をした覚えはないので一旦手動で削除してビルドしてみます。
building for iOS Simulator, but linking in dylib built for iOS, file '/Path/To/Pods/ZZZ/ZZZ.framework/ZZZ' for architecture arm64
エラーログから原因になりそうなライブラリ名を見つけました。
ちなみにこの状態でpod installを実行するとExcluded ArchitecturesでAny iOS Simulator SDKにarm64が追加されている状態に戻ります。
該当のライブラリをPodfileから削除して再度pod installを実行するとExcluded ArchitecturesのAny iOS Simulator SDKの値が空になり、シミュレーターのビルドやユニットテストの実行も成功しました。
このライブラリは利用されている数自体も多くないので、発見自体が遅れたものと思います。
(開発元にはコンタクトを取って修正を依頼しています。)
まとめ
CocoaPods、SPMを利用している場合に、過渡期に色々必要だった設定は、現在ではほぼ不要になっており、Build Settingsの設定変更も(ほぼ)不要になっているようです。
しかし、一部の古いライブラリや利用者の少ないライブラリを使用している場合に、まだ問題が起こることはありそうです。
今回の件は同様の問題が発生したすべての人のためになるかは正直分かりませんが、原因調査の方法などが誰かの役に立てれば幸いです。
ここから先は
¥ 100
Amazonギフトカード5,000円分が当たる
この記事が気に入ったらチップで応援してみませんか?