今回は、Swift5.0・Swift5.1 でそれぞれ対応された、ABI Stability と Module Stability について簡単にまとめてめてみたいと思います。
ABI Stability とは?
ABI Stability は異なるバージョンのコンパイラから生成されたバイナリ同士をリンクできるようにするための機能で、Swift5.0 からサポートされました。これにより、standard library や runtime library などをアプリごとに含める必要がなくなり、アプリバンドルのサイズを削減できるようになりました。
Module Stability とは?
Module Stability は異なるバージョンのコンパイラから生成された Module をコンパイル(≒インポート)できるようにするための機能で、Swift5.1 からサポートされました。これにより、Swift5.1 以降でコンパイルされた Module は、Swift5.1 以降に違うバージョンのコンパイラから正常にインポートできるようになります。ただし、これには、.swiftinterface
というモジュール記述ファイルが必要で、ライブラリ側で BUILD_LIBRARY_FOR_DISTRIBUTION
が Yes
に設定されていない場合には、.swiftinterface
が生成されず、Module Stability の恩恵を受けることができません。
余談
上記のことを踏まえて、Xcode のアップデート作業を行っていると、ライブラリのバージョンを更新していないのにも(BUILD_LIBRARY_FOR_DISTRIBUTION
が No
) 関わらず Swift5.2.2 から Swift5.2.4 では、問題なくバイナリをコンパイル・リンクできてしまいました🤔 後々調べて見ると、swift4.0
・swift4.0.1
・swift4.0.2
以外のバージョンでは(3.1~4.2.1の話)、基本的に major・minor が合っていればバイナリ互換性があるようで、今回のように Swift5.2.2 から Swift5.2.4 ではライブラリをビルドする必要がなかったようです✍️ とはいえ、major・minor のアップデートがあると、また面倒な rebuild 作業をしなくてはならないので、徐々に Module Stability を活用していきたいところです😅
https://qiita.com/gamako/items/c12edf77fe0632903b77#%E3%81%BE%E3%81%A8%E3%82%81
参考
- https://swift.org/blog/abi-stability-and-apple/
- https://forums.swift.org/t/plan-for-module-stability/14551
- https://qiita.com/shiz/items/2da18cae04200ecbe3c4
- https://ja.stackoverflow.com/questions/60498/abi-stability-%e3%81%aa%e3%81%ae%e3%81%ab%e3%81%aa%e3%81%9c-module-compiled-with-swift-5-1-cannot-be-imported-by-the-swi/60500#60500