😤

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

2020/10/09に公開

公式にドキュメントがあるので、それを見るのがベストです。

https://developer.apple.com/documentation/technotes/tn3117-resolving-build-errors-for-apple-silicon

はじめに

この記事は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起動

解決法

  • ライブラリを更新して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のビルドはつくった

参考ツイート

https://twitter.com/yimajo/status/1481918057685553160

参考URL

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

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

https://engineering.mercari.com/en/blog/entry/20211129-compiling-for-ios-on-apple-m1/

Discussion