XCFrameworkの生成時にプラットフォームがわからないと言われたら
この記事では、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 コマンドが特定のバイナリのプラットフォームを識別できない時に表示されます。これは、バイナリが古いデプロイメントターゲットバージョンでビルドされている可能性があるためです。
原因の調査方法
-
otoolコマンドを使用してバイナリの情報をチェックする: バイナリにLC_BUILD_VERSIONもしくはLC_VERSION_MIN_xxxのロードコマンドが含まれているか確認します。LC_BUILD_VERSIONは新しいフォーマットで、LC_VERSION_MIN_xxxは古いリンカが生成するフォーマットです。これにより、バイナリがどのリンカーバージョンでビルドされたかがわかります。 -
ビルドログの確認: エラーが発生しているフレームワークをビルドする際のコマンドや設定を確認します。この例では、
xcframework-makerツールの使用が言及されており、問題がそのビルドプロセスに関連している可能性があります。
Note:
今回の事例は、CocoaPodsで配布されているMLKitのフレームワーク群の中に上記のロードコマンドが含まれていないものがありました。そのため、xcodebuild -create-xcframework でエラーが発生していたというのが根本的な原因です。
- デプロイメントターゲットの確認: 古いデプロイメントターゲットバージョンが問題の原因である可能性があります。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#L1315iOS Deviceなら2, iOS Simulatorなら7をそれぞれ指定します。
-
ビルドプロセスの調整: 使用しているビルドツール(この例では
xcframework-maker)を改造するか、直接のビルドコマンドを調整して、適切なデプロイメントターゲットが使用されるようにします。
結論
xcodebuild -create-xcframework コマンド中に表示されるプラットフォーム識別エラーは、古いデプロイメントターゲットバージョンやビルドプロセスの不整合に関連しています。otool と vtool コマンドを活用し、適切なビルド設定とプロセスの調整を行うことで、このような問題を効果的に解決できます。
Note:
常に
vtoolでバージョンを埋め込めばいいということを主張したいわけではありません。ビルド済みバイナリに困った時、提供元に問い合わせて最新のXcodeでビルドしてもらえる場合はその方が良いです。vtoolは最終手段として使ってください。
Discussion