Xcode 12でシミュレータを対象にビルドできない場合やること

1 min読了の目安(約1700字TECH技術記事

はじめに

Xcode 12でビルドする際、CocoaPodsに関連するCommand PhaseScriptExecution failed with a nonzero exit codeARCHS [@]:unbound variableというエラーや <ライブラリ名> not foundというエラーでプロジェクトがビルドできなくなり、実機だけはビルドして実行できるという状況の解決方法を書いています。

結論から言うと、これはXcode 12からVALID_ARCHSが非推奨になってるのが原因かもしれません。

やることの結論

  • プロジェクトの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

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のmacOSになってる
    • iOSのシミュレータではないし除外する
  • 除外リストは細かく指定できるため、iOSのシミュレータからarm64を省く

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

参考URL

https://developer.apple.com/forums/thread/656509

https://stackoverflow.com/questions/63391793/xcode-12-build-target-in-wrong-order/63405201#63405201