Xcode 12でシミュレータを対象にビルドできない場合やること
公式にドキュメントがあるので、それを見るのがベストです。
はじめに
この記事はXcode 12, Xcode 13のワークアラウンドです。
Xcode 12もしくはXcode 13でビルドする際、CocoaPodsに関連する
Command PhaseScriptExecution failed with a nonzero exit code`、`ARCHS [@]:unbound variable
というエラーや
<ライブラリ名> not found
というエラーでプロジェクトがビルドできなくなり、実機だけはビルドして実行できるという状況の解決方法を書いています。
結論から言うと、これは外部ライブラリがarm64アーキテクチャ用ビルドを作成しようとしていて、『それが対応されてないライブラリの場合にarm64用のビルドができない』、ということではないかと思います。完璧な対応はライブラリを更新しましょう。ただ、ワークアラウンドもありますよというわけです。
ついでにXcode 12からVALID_ARCHSが非推奨になってるのも邪魔なのでそれも消したほうがいいです。Xcode13ではVALID_ARCHSは完全に使えなくなっています。
- 解決法
- ライブラリを更新してarm64もビルドできるようにする
- ワークアラウンド
- Excluded architecturesでarm64を拒否する
- M1 macでシミュレータがiOSシミュレータ用のビルドができなくなる
- RossetaでXcode起動
- M1 macでシミュレータがiOSシミュレータ用のビルドができなくなる
- Excluded architecturesでarm64を拒否する
解決法
- ライブラリを更新してarm64用のビルドができるようにしましょう
ワークアラウンド
ワークアラウンドとしてarm64ビルドをしないように設定します(あくまでしょうがないための回避策です)。
- 準備
- プロジェクトのUser-DefinedからVALID_ARCHSがあれば項目ごと完全に消す
- プロジェクトのExcluded architecturesでシミュレータのarm64を記述
- CocoaPodsからも同じくExcluded architecturesでシミュレータのarm64を記述
- もしこれでもダメなら念の為キャッシュを消してクリーンビルド
rm -rf ~/Library/Developer/Xcode/DerivedData/プロジェクト名*
rm -rf ~/Library/Caches/com.apple.dt.Xcode
このワークアラウンドではM1 macのシミュレータ用のビルドが作成できなくなります。それに対してはRossetaでXcodeを起動するというさらなるワークアラウンドもあるでしょう。
詳細
User-DefinedからVALID_ARCHSがあれば項目ごと完全に消す
Xcode -> Project -> Build settings -> User-Defined -> VALID_ARCHS
- Xcode 12から非推奨
- Xcode 12からはExcluded architecturesを使う
- ホワイトリストではなく除外リストになった
- このホワイトリストを削除してなくても辻褄があえばいいかもしれないが混乱の元なので削除
- 中途半端に空文字列だけ残っているとcocoapodsがエラーを吐く
Excluded architecturesでシミュレータのarm64を指定
Xcode -> Project -> Build settings -> Architectures -> Excluded architectures
- 各ターゲットではなく、プロジェクトを指定し Excluded architectures のシミュレータからarm64を指定して省く
- 各ターゲットはプロジェクトの設定を継承しているので上書きしないのがベストでしょう
- 各ターゲットというのはアプリのターゲットであったりテストターゲットだったり、App Extensionだったり
- Xcode 12からarm64はApple SiliconのiOSシミュレータになってる
CocoaPodsからも同じくExcluded architecturesでシミュレータのarm64を記述
Podsfileでシミュレータのarm64を除外するようにする
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
end
end
end
その他
Swift Package Managerで導入したコードについて
このやり方ではプロジェクトのターゲットとPodsのターゲットについてarm64を除外できます。しかしSwift Packageで入れたコードの設定はできておらず、Swift Package側でarm64のビルドができる場合、ややこしいことにそれを除外できないはずです。
下記のようなエラーが出るでしょう(どうやって解決しよう)。
Could not find module 'ライブラリ名' for target 'x86_64-apple-ios-simulator';found: arm64, arm64-apple-ios-simulator,
- x86_64用のが必要
- Swift Pacakgeではライブラリのarm64のビルドはつくった
参考ツイート
参考URL
Discussion