Xcode12 beta での Carthage による依存ライブラリのビルドで何度も行き詰まったので、対策・回避方法についてメモします。
ここで利用している Carthage のバージョンは 0.35.0 です。
Xcode12 beta3 まで
Carthage で Alamofire のビルドが失敗してしまい、Carthageのログを確認すると次のようなエラーが出ていました。
Undefined symbols for architecture armv7: "type metadata for Swift._StringObject.Variant"
これは Alamofire/Alamofire#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 で報告されており、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
ファイルを適用するようなスクリプトを作って回避しています。
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 に対して Xcode 12 GM 版向けのワークアラウンド用スクリプトがコメントされています。
(2020/9/21追記) Carthage 0.35.1 / 0.36.0 でも解消せず
次の通り Carthage の更新がありましたが、 Carthage/Carthage#3019 は解消していません。
- 2020/9/17 : 0.35.1
- 2020/9/18 : 0.36.0
(2020/11/10追記) App Store リリース
上記の回避策で 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 でのビルドに対応されています。こちらに切り替えることで今回の問題はすべて解消することができます。以下がマイグレーション方法です。