🧰

XCFrameworkの生成時にプラットフォームがわからないと言われたら

2024/04/10に公開

この記事では、xcodebuild -create-xcframework コマンドの使用中に遭遇する可能性がある特定のエラーに対処する方法を解説します。
このエラーは、ビルド済みフレームワークのデプロイメントバージョン設定に関連する問題から発生する可能性があります。

Note:
この記事はswift-developers-japanのDiscordサーバーでの @kateinoigakukunさんとのやり取りをもとにGPT-4が執筆をしています。誤解を招きそうなところはこのようにNoteを入れて補足しています。

環境

  • Xcode 15.3

エラーメッセージ

error: unable to determine the platform for the given binary '/path/to/MLKitBarcodeScanning.framework/MLKitBarcodeScanning'; check your deployment version settings

このエラーは、xcodebuild -create-xcframework コマンドが特定のバイナリのプラットフォームを識別できない時に表示されます。これは、バイナリが古いデプロイメントターゲットバージョンでビルドされている可能性があるためです。

原因の調査方法

  1. otool コマンドを使用してバイナリの情報をチェックする: バイナリに LC_BUILD_VERSION もしくは LC_VERSION_MIN_xxx のロードコマンドが含まれているか確認します。LC_BUILD_VERSION は新しいフォーマットで、LC_VERSION_MIN_xxx は古いリンカが生成するフォーマットです。これにより、バイナリがどのリンカーバージョンでビルドされたかがわかります。

  2. ビルドログの確認: エラーが発生しているフレームワークをビルドする際のコマンドや設定を確認します。この例では、xcframework-maker ツールの使用が言及されており、問題がそのビルドプロセスに関連している可能性があります。

Note:

今回の事例は、CocoaPodsで配布されているMLKitのフレームワーク群の中に上記のロードコマンドが含まれていないものがありました。そのため、xcodebuild -create-xcframework でエラーが発生していたというのが根本的な原因です。

  1. デプロイメントターゲットの確認: 古いデプロイメントターゲットバージョンが問題の原因である可能性があります。Xcodeの最近のバージョンでは、認識される最小デプロイメントターゲットバージョンが変更されており、古いバージョンが無視されるようになった可能性があります。

解決策

  • vtool コマンドを使用してバイナリを修正する: vtool -set-build-version コマンドを使用して、フレームワークバイナリに LC_BUILD_VERSION ロードコマンドを追加します。このコマンドは、指定されたプラットフォームと最小OSバージョン、SDKバージョンでバイナリを更新します。

Note:

vtool -set-build-version に指定している <platform> <minos> <sdk>のうち、<platform> はここに記載があります。
https://github.com/apple-oss-distributions/cctools/blob/7a5450708479bbff61527d5e0c32a3f7b7e4c1d0/include/mach-o/loader.h#L1315

iOS Deviceなら2, iOS Simulatorなら7をそれぞれ指定します。

  • ビルドプロセスの調整: 使用しているビルドツール(この例では xcframework-maker)を改造するか、直接のビルドコマンドを調整して、適切なデプロイメントターゲットが使用されるようにします。

結論

xcodebuild -create-xcframework コマンド中に表示されるプラットフォーム識別エラーは、古いデプロイメントターゲットバージョンやビルドプロセスの不整合に関連しています。otoolvtool コマンドを活用し、適切なビルド設定とプロセスの調整を行うことで、このような問題を効果的に解決できます。

Note:

常に vtool でバージョンを埋め込めばいいということを主張したいわけではありません。ビルド済みバイナリに困った時、提供元に問い合わせて最新のXcodeでビルドしてもらえる場合はその方が良いです。vtool は最終手段として使ってください。

成果物

Discussion