2019/03/26
Xcode10.2とSwift5がリリースされ、以降はバイナリ互換性がとられるはずなので、以下の内容は古い内容となっています。関係者の方々、ありがとうございます。
以下古い内容
2018/10現在、Swiftのライブラリ、実行ファイルのバイナリはバージョン間の互換性が保証されておりません。ABI安定化がSwift5でということなので、もう少しの辛抱です。
参考: https://github.com/apple/swift/blob/master/docs/ABIStabilityManifesto.md
参考: https://swift.org/abi-stability/
とはいえ、現状どのXcodeバージョン間で互換性があるのかはっきりした情報が見つからず、ライブラリなんかを提供しているとあいまいで困るので調べてまとめました。
次の表の行と列は
- ビルドする側のswiftバージョン
- リンクしようとしたライブラリをビルドした側のswiftのバージョン
の組み合わせで、ビルドできる(OK)、ビルドエラー(NG)を書き出したものです。
Xcode | swift | 3.1 | 4.0 | 4.0.2 | 4.0.3 | 4.1 | 4.1.2 | 4.2 | 4.2.1 | 5.0 |
---|---|---|---|---|---|---|---|---|---|---|
8.3.3 | 3.1 | OK | NG | NG | NG | NG | NG | NG | NG | NG |
9.0, 9.0.1 | 4.0 | NG | OK | NG | NG | NG | NG | NG | NG | NG |
9.1 | 4.0.2 | NG | NG | OK | OK | NG | NG | NG | NG | NG |
9.2 | 4.0.3 | NG | NG | OK | OK | NG | NG | NG | NG | NG |
9.3, 9.3.1 | 4.1 | NG | NG | NG | NG | OK | OK | NG | NG | NG |
9.4, 9.4.1 | 4.1.2 | NG | NG | NG | NG | OK | OK | NG | NG | NG |
10.0 | 4.2 | NG | NG | NG | NG | NG | NG | OK | OK | NG |
10.1 | 4.2.1 | NG | NG | NG | NG | NG | NG | OK | OK | NG |
10.2 | 5.0 | NG | NG | NG | NG | NG | NG | NG | NG | OK |
まとめ
つまり、3.1から4.2.1の間では、以下のことが言えます。
- swift4.0とswift4.0.1, swift4.0.2の間は互換性がない
- それ以外は、swiftのメジャー、マイナーバージョンが同じであれば互換性がある。
- 上位互換のような、片方向の互換性がある組み合わせはない。
- 例えば「x.0のバイナリはx.1でリンクできるが、逆はできない」のようなことはない
補足
バイナリ互換性がないと何が起きるか
バイナリの互換性がないframeworkなどをリンクしようとすると、次のようなエラーが出ます。
$ swiftc ../main.swift -I . -L . -llucky
../main.swift:1:8: error: module compiled with Swift 4.0 cannot be imported in Swift 4.1.2: /Users/gamako/Documents/work/sst/project/sdk/swift-version-check/build.9.0/./lucky.swiftmodule
import lucky
ライブラリのswiftバージョンの確認方法
ライブラリフレームワークをビルドしたときのSwiftのバージョンは、xxx.swiftmodule
ファイルには文字列として入っているようなので、次の方法で強引に取得することができるようです。
$ strings arm64.swiftmodule | grep "Swift version"
4.1(4.1)/Apple Swift version 4.1 (swiftlang-902.0.48 clang-902.0.37.1)
ソースコードの互換性
バイナリの互換性と、ソースコードの互換性は別の話題です。swift4.2のコンパイラは、swift3.1書式のソースコードをコンパイルすることができます。ただし、この場合swift4.2形式でバイナリを出力するため、swift3.1でリンクすることはできません。
link
調べるのに使ったソースコード
https://github.com/gamako/swift-binary-compatibility-matrix