Xcode11 ABI安定化につまずいた

# はじめに
みなさん待望の ABI 安定化が Swift5 でついに達成されました:tada:  
ついに ABI 安定化がきたか！（ABI 安定化ってなんだ？:speak_no_evil:）  
ABI 安定化については下記参考

* [Swift 5正式版がリリース - ABI安定化をついに達成し、アプリが大幅に小さく高速に](https://www.softantenna.com/wp/software/swift-5-released/)
* [Xcode,Swiftのバイナリ互換性](https://qiita.com/gamako/items/c12edf77fe0632903b77)
* [【Swift】Swift5.0のABI StabilityとSwift5.1のModule Stabilityと その先のLibrary Evolution Support](https://qiita.com/shiz/items/2da18cae04200ecbe3c4)

ほーん:thinking:つまり Swift のバージョンが異なるバイナリ同士をリンクできるようになったてことか:exclamation:

# Module Stability
異なるバージョンでいけるってことは[この Carthage でライブラリを導入したやつ](https://github.com/adventam10/TestCarthage)(Xcode11.0 Swift5.1)は Xcode11.3 Swift5.1.3 でビルドできるってことか:exclamation:

<img width="500" alt="error1" src="https://user-images.githubusercontent.com/34936885/71325064-dc1d8e00-252a-11ea-9964-3f68d5569aa8.png">

なんやて:interrobang:

結局ターミナルでもう一度下記コマンドしないとむりでした...

```
carthage update --platform iOS
```

なんでや？と思っていたらピンポイントの質問を発見:heart_eyes:

* [ABI Stability なのになぜ Module compiled with Swift 5.1 cannot be imported by the Swift 5.1.2 というエラーが起こるのでしょうか？](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?stw=2#60500)

>そのライブラリのビルド設定において、Module Stabilityが有効になっていないからです。
>
(中略)

>つまり、Swift 5.0ではABI Stabilityによって異なるバージョンのコンパイラが生成したライブラリをリンクできますが、インポートできないので実質的にサードパーティのライブラリに対してはABI Stabilityの恩恵を受けることはできません。
（インポートの段階で失敗するのでリンクの段階まで到達しないため）

そういうことらしい:open_mouth:  
どうやらライブラリの互換を達成するには *.swiftinterface ファイルが必要でライブラリ側の設定で `BUILD_LIBRARY_FOR_DISTRIBUTION` というフラグを `YES` にする必要があるらしい。  
ほーん...まじかそんなんやってねぇ:scream:（[全部](https://github.com/adventam10/TestCarthage#%E5%B0%8E%E5%85%A5%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA)やってねぇ...）

<img width="700" alt="setting" src="https://user-images.githubusercontent.com/34936885/71325067-e17ad880-252a-11ea-9c75-eea1e5199126.png">

ここを `YES` にして `carthage update` したらとりあえず framework の Modules に *.swiftinterface ファイルができました:clap:  

ビルド！！！

<img width="500" alt="error2" src="https://user-images.githubusercontent.com/34936885/71325072-f22b4e80-252a-11ea-8304-806417e63f10.png">

:hankey::poop::shit:

...よくわかりませんが Xcode11.0, 11.1 <-> Xcode11.2.1, 11.3 は無理でした:scream_cat:  

| 前 | 後 | 結果 |
| --- | --- | --- |
| Xcode11.0 (Swift5.1) | Xcode11.1 (Swift5.1) | :o: |
| Xcode11.0 (Swift5.1) | Xcode11.2.1 (Swift5.1.2) | :x: |
| Xcode11.0 (Swift5.1) | Xcode11.3 (Swift5.1.3) | :x: |
| Xcode11.1 (Swift5.1) | Xcode11.0 (Swift5.1) | :o: |
| Xcode11.1 (Swift5.1) | Xcode11.2.1 (Swift5.1.2) | :x: |
| Xcode11.1 (Swift5.1) | Xcode11.3 (Swift5.1.3) | :x: |
| Xcode11.2.1 (Swift5.1.2) | Xcode11.0 (Swift5.1) | :x: |
| Xcode11.2.1 (Swift5.1.2) | Xcode11.1 (Swift5.1) | :x: |
| Xcode11.2.1 (Swift5.1.2) | Xcode11.3 (Swift5.1.3) | :o: |
| Xcode11.3 (Swift5.1.3) | Xcode11.0 (Swift5.1) | :x: |
| Xcode11.3 (Swift5.1.3) | Xcode11.1 (Swift5.1) | :x: |
| Xcode11.3 (Swift5.1.3) | Xcode11.2.1 (Swift5.1.2) | :o: |

でも、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) |

# さいごに
早く[ライブラリ全部](https://github.com/adventam10/TestCarthage#%E5%B0%8E%E5%85%A5%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA) `BUILD_LIBRARY_FOR_DISTRIBUTION` を `YES` に設定しなきゃ:speak_no_evil:  

[[iOSDC Japan 2019 リポート]「ライブラリのインポートとリンクの仕組み完全解説」というセッションを聞いてきました](https://dev.classmethod.jp/smartphone/iphone/iosdc2019-report-library-link-import/)この記事とスライドもみなきゃ:laughing:（なんかわかった気になります:neutral_face:）

# 参考
* [Swift 5正式版がリリース - ABI安定化をついに達成し、アプリが大幅に小さく高速に](https://www.softantenna.com/wp/software/swift-5-released/)
* [Xcode,Swiftのバイナリ互換性](https://qiita.com/gamako/items/c12edf77fe0632903b77)
* [【Swift】Swift5.0のABI StabilityとSwift5.1のModule Stabilityと その先のLibrary Evolution Support](https://qiita.com/shiz/items/2da18cae04200ecbe3c4)
* [[iOSDC Japan 2019 リポート]「ライブラリのインポートとリンクの仕組み完全解説」というセッションを聞いてきました](https://dev.classmethod.jp/smartphone/iphone/iosdc2019-report-library-link-import/)