見出し画像

[Cocoa][Swift]XCFramework

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となっている。

【関連情報】
- Cocoa.swift
- Cocoa勉強会 関東
- Cocoa練習帳

この記事が気に入ったらサポートをしてみませんか?