iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
Darwinで採用されています実行形式のバイナリ・フォーマットMach-oは、一つのファイルに複数のアーキテクチャのバイナリが格納できるという素晴らしい特徴があるのですが、同じCPUで異なるシステム向けのバイナリは同時に格納できないという欠点があるようです。以前だと、これで問題はなかったのですが、例えば、iPad OS向けアプリのソースからmacOSアプリを作ることができるUIKit for Mac (Catalyst)だと、x86_64でiOSとiPhoneシミュレータ(macOS)という場合が発生して、同一ファイルに格納できないという問題が発生します。
おそらく、これの対策として用意されたのが、Xcode 11から利用できるXCFramework。簡単に説明すると複数のフレームワークを一つにできるというものだ。
具体的には、MoltenGLというライブラリはiOSとmacOS向けのフレームワークが用意されていて、これを以下のコマンドでXCFrameworkにまとめられる。
% xcodebuild -create-xcframework \
> -framework MoltenGL-0.25.0/MoltenGL/iOS/framework/MoltenGL.framework \
> -framework MoltenGL-0.25.0/MoltenGL/macOS/framework/MoltenGL.framework \
> -output MoltenGL.xcframework
xcframework successfully written out to: MoltenGL.xcframework
この中身をtreeコマンドで確認してみる。
% tree MoltenGL.xcframework
MoltenGL.xcframework
├── Info.plist
├── ios-armv7_arm64
│ └── MoltenGL.framework
│ ├── Headers
│ │ ├── MoltenGL.h
│ │ ├── mglDataTypes.h
│ │ ├── mglEnv.h
│ │ ├── mglGLKitDataTypes.h
│ │ ├── mglMetalState.h
│ │ ├── mglext.h
│ │ └── mln_env.h
│ └── MoltenGL
└── macos-x86_64
└── MoltenGL.framework
├── Headers -> Versions/Current/Headers
├── MoltenGL -> Versions/Current/MoltenGL
└── Versions
├── A
│ ├── Headers
│ │ ├── MoltenGL.h
│ │ ├── mglDataTypes.h
│ │ ├── mglEnv.h
│ │ ├── mglGLKitDataTypes.h
│ │ ├── mglMetalState.h
│ │ ├── mglext.h
│ │ └── mln_env.h
│ └── MoltenGL
└── Current -> A
10 directories, 18 files
単なるx86_64でなく、macOSのx86_64となっている。