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