はじめに
みなさん待望の ABI 安定化が Swift5 でついに達成されました![]()
ついに ABI 安定化がきたか!(ABI 安定化ってなんだ?
)
ABI 安定化については下記参考
- Swift 5正式版がリリース - ABI安定化をついに達成し、アプリが大幅に小さく高速に
- Xcode,Swiftのバイナリ互換性
- 【Swift】Swift5.0のABI StabilityとSwift5.1のModule Stabilityと その先のLibrary Evolution Support
ほーん
つまり Swift のバージョンが異なるバイナリ同士をリンクできるようになったてことか![]()
Module Stability
異なるバージョンでいけるってことはこの Carthage でライブラリを導入したやつ(Xcode11.0 Swift5.1)は Xcode11.3 Swift5.1.3 でビルドできるってことか![]()
なんやて![]()
結局ターミナルでもう一度下記コマンドしないとむりでした...
carthage update --platform iOS
なんでや?と思っていたらピンポイントの質問を発見![]()
そのライブラリのビルド設定において、Module Stabilityが有効になっていないからです。
(中略)
つまり、Swift 5.0ではABI Stabilityによって異なるバージョンのコンパイラが生成したライブラリをリンクできますが、インポートできないので実質的にサードパーティのライブラリに対してはABI Stabilityの恩恵を受けることはできません。
(インポートの段階で失敗するのでリンクの段階まで到達しないため)
そういうことらしい![]()
どうやらライブラリの互換を達成するには *.swiftinterface ファイルが必要でライブラリ側の設定で BUILD_LIBRARY_FOR_DISTRIBUTION というフラグを YES にする必要があるらしい。
ほーん...まじかそんなんやってねぇ
(全部やってねぇ...)
ここを YES にして carthage update したらとりあえず framework の Modules に *.swiftinterface ファイルができました![]()
ビルド!!!
![]()
![]()
![]()
...よくわかりませんが Xcode11.0, 11.1 <-> Xcode11.2.1, 11.3 は無理でした![]()
| 前 | 後 | 結果 |
|---|---|---|
| Xcode11.0 (Swift5.1) | Xcode11.1 (Swift5.1) | |
| Xcode11.0 (Swift5.1) | Xcode11.2.1 (Swift5.1.2) | |
| Xcode11.0 (Swift5.1) | Xcode11.3 (Swift5.1.3) | |
| Xcode11.1 (Swift5.1) | Xcode11.0 (Swift5.1) | |
| Xcode11.1 (Swift5.1) | Xcode11.2.1 (Swift5.1.2) | |
| Xcode11.1 (Swift5.1) | Xcode11.3 (Swift5.1.3) | |
| Xcode11.2.1 (Swift5.1.2) | Xcode11.0 (Swift5.1) | |
| Xcode11.2.1 (Swift5.1.2) | Xcode11.1 (Swift5.1) | |
| Xcode11.2.1 (Swift5.1.2) | Xcode11.3 (Swift5.1.3) | |
| Xcode11.3 (Swift5.1.3) | Xcode11.0 (Swift5.1) | |
| Xcode11.3 (Swift5.1.3) | Xcode11.1 (Swift5.1) | |
| Xcode11.3 (Swift5.1.3) | Xcode11.2.1 (Swift5.1.2) |
でも、Xcode11.2.1(Swift5.1.2) <-> Xcode11.3(Swift5.1.3) はビルドできたので互換性はあるみたいです。
ということでライブラリを作成する際は BUILD_LIBRARY_FOR_DISTRIBUTION を YES に設定しましょう!!
※Swift のバージョンについて
ターミナルで下記コマンドで調べました
swift -version
| Xcode | Swift |
|---|---|
| 11.0 | 5.1 (swiftlang-1100.0.270.13 clang-1100.0.33.7) |
| 11.1 | 5.1 (swiftlang-1100.0.270.13 clang-1100.0.33.7) |
| 11.2.1 | 5.1.2 (swiftlang-1100.0.278 clang-1100.0.33.9) |
| 11.3 | 5.1.3 (swiftlang-1100.0.282.1 clang-1100.0.33.15) |
さいごに
早くライブラリ全部 BUILD_LIBRARY_FOR_DISTRIBUTION を YES に設定しなきゃ![]()
[iOSDC Japan 2019 リポート]「ライブラリのインポートとリンクの仕組み完全解説」というセッションを聞いてきましたこの記事とスライドもみなきゃ
(なんかわかった気になります
)