Xcode12 betaでCarthageによる依存ライブラリのビルドが失敗する

Xcode12 beta での [Carthage](https://github.com/Carthage/Carthage) による依存ライブラリのビルドで何度も行き詰まったので、対策・回避方法についてメモします。

ここで利用している Carthage のバージョンは 0.35.0 です。

### Xcode12 beta3 まで

Carthage で [Alamofire](https://github.com/Alamofire/Alamofire) のビルドが失敗してしまい、Carthageのログを確認すると次のようなエラーが出ていました。

```
Undefined symbols for architecture armv7: "type metadata for Swift._StringObject.Variant"
```

これは [Alamofire/Alamofire#3240](https://github.com/Alamofire/Alamofire/issues/3240) をはじめ、さまざまなライブラリでも Issue として報告されているように Xcode12 自体の問題です。Xcode12 beta4 にて解消されました。

以降も Alamofire で失敗しますが、これはたまたま私の環境で最初にビルドされるものが Alamofire なだけで、Alamofire は悪くありません。。。

### Xcode12 beta4以降（正式版も）

beta3 での問題が解消されてホッとしたのも束の間、beta4 でもビルドに失敗。(beta5 でも同様)

(2020/8/26) Xcode12 beta6 でも同様でした。

```
*** Building scheme "Alamofire iOS" in Alamofire.xcworkspace
Build Failed
	Task failed with exit code 1:
	/usr/bin/xcrun lipo -create path/to/Library/Caches/org.carthage.CarthageKit/DerivedData/12.0_12A8189h/Alamofire/5.2.2/Build/Intermediates.noindex/ArchiveIntermediates/Alamofire\ iOS/IntermediateBuildFilesPath/UninstalledProducts/iphoneos/Alamofire.framework/Alamofire path/to/Library/Caches/org.carthage.CarthageKit/DerivedData/12.0_12A8189h/Alamofire/5.2.2/Build/Products/Release-iphonesimulator/Alamofire.framework/Alamofire -output path/to/repo/Carthage/Build/iOS/Alamofire.framework/Alamofire

This usually indicates that project itself failed to compile. Please check the xcodebuild log for more details: path/to/carthage-xcodebuild.eJCnGA.log
```

しかも Carthage のログを見ると `** BUILD SUCCEEDED **` と成功したことになっています。

これは Carthage の Issue [Carthage/Carthage#3019](https://github.com/Carthage/Carthage/issues/3019) で報告されており、Xcode12 beta5 がリリースされた現在でも引き続き議論の対象となっています。

実際には `xcrun lipo -create` コマンドで次のようなエラーが出ており、これが問題のようです。

```
the same architectures (arm64) and can't be in the same fat output file
```

Xcode12 からは Apple Silicon 搭載の Mac がサポート対象となります。つまり、 Apple Silicon 搭載 Mac 上で iOS Simulator は ARM アーキテクチャで動作するようになるんですね。Xcodeのこの変化が原因で、上記のような **同じ arm64 アーキテクチャをバイナリを含められない** というエラーとなっているようです。

ということでこの Issue の中では、iOS Simulator に arm64 アーキテクチャのバイナリを含めないようにするワークアラウンドがいくつか掲載されています。私はこの中で Carthage 実行前にこのワークアラウンドを含めた `xcconfig` ファイルを適用するようなスクリプトを作って回避しています。

```sh:carthage.sh
SCRIPT_DIR=$(cd $(dirname $0);pwd)
CARTHAGE_DIR=${SCRIPT_DIR}/Carthage
if [ ! -d ${CARTHAGE_DIR} ]; then
  mkdir ${CARTHAGE_DIR}
fi

# ワークアラウンド用の xcconfig ファイルを設定する
export XCODE_XCCONFIG_FILE=${CARTHAGE_DIR}/carthage_workaround_for_xcode12.xcconfig 
echo 'EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_simulator__NATIVE_ARCH_64_BIT_x86_64=arm64 arm64e armv7 armv7s armv6 armv8' > ${XCODE_XCCONFIG_FILE}
echo 'EXCLUDED_ARCHS=$(inherited) $(EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_$(EFFECTIVE_PLATFORM_SUFFIX)__NATIVE_ARCH_64_BIT_$(NATIVE_ARCH_64_BIT))' >> ${XCODE_XCCONFIG_FILE}

# Carthage を実行する
carthage $@
```

### 今後
今後も状況に変化があったらこちらに追記していきます。

#### (2020/9/18追記) Xcode 12 GM 版向けのスクリプト
上記の Issue [Carthage/Carthage#3019](https://github.com/Carthage/Carthage/issues/3019) に対して Xcode 12 GM 版向けのワークアラウンド用スクリプトがコメントされています。

https://github.com/Carthage/Carthage/issues/3019#issuecomment-694329329

#### (2020/9/21追記) Carthage 0.35.1 / 0.36.0 でも解消せず
次の通り Carthage の更新がありましたが、 [Carthage/Carthage#3019](https://github.com/Carthage/Carthage/issues/3019) は解消していません。

- 2020/9/17 : 0.35.1
- 2020/9/18 : 0.36.0

#### (2020/11/10追記) App Store リリース :ok:
上記の回避策で Test Flight、App Store どちらも問題なくリリースできました。

#### (2020/11/17追記) 公式の回避策ドキュメント

CarthageのリポジトリにこのXcode12の問題の回避策が README.md に掲載されています。
https://github.com/Carthage/Carthage/blob/master/Documentation/Xcode12Workaround.md

#### (2021/2/2追記) Carthage 0.37.0 リリース
Carthage 0.37.0 がリリースされました。このバージョンにより XCFramework でのビルドに対応されています。こちらに切り替えることで今回の問題はすべて解消することができます。以下がマイグレーション方法です。

https://github.com/Carthage/Carthage#building-platform-independent-xcframeworks-xcode-12-and-above