Xcode で libswiftSecurity.dylib が見つからないエラーを解消する

Xcode ビルドエラー

Xcode 7.0 beta 5 で OS X アプリのプロジェクトをビルドしたところ libswiftSecurity.dylib が見つからないというエラーが発生したので、その解消方法を探してみました。


Xcode 7.0 beta 5 で OS X アプリのプロジェクトをビルドしたところ、次のようなエラーが発生してビルドに失敗してしまうようになりました。

building file list ... rsync: link_stat "/Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/libswiftSecurity.dylib" failed: No such file or directory (2)

どうやら libswiftSecurity.dylib をコピーしたいけれど見つからないみたいです。

このエラーが発生しているのは "Embed Pods Frameworks" ビルドフェイズなので、どうやら CocoaPods によって導入されたスクリプトがファイルコピーを行う中で何か失敗している様子です。

Embed Pods Framework

この Embed Pods Framework ビルドフェイズは、名前から察するに CocoaPods の Pods として導入されたフレームワークをアプリ内のバンドルに組み込む処理をするフェイズになるようです。

実際の処理内容は Pods/Targets Support Files/Pods-${PROJECT}/Pods-${PROJECT}-frameworks.sh スクリプトに記載されて、実行されている様子です。

該当すると思われる箇所

その中でも、今回のエラー周辺のログと照らし合わせると、どうやら次のスクリプト周りでエラーが発生している可能性が高そうです。

swift_runtime_libs=$(xcrun otool -LX "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/${basename}.framework/${basename}" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u  && exit ${PIPESTATUS[0]})
for lib in $swift_runtime_libs; do
  echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\""
  rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}"
  code_sign_if_enabled "${destination}/${lib}"
done

エラーの原因になっている libswiftSecurity.dylib の名前は直接的には出てこないのですけど、おそらくここで otool -L を使って、組み込むフレームワークが依存する Swift ライブラリを ${SWIFT_STDLIB_PATH}/${lib} からコピーしているように思えます。

そして実際、このコピー元のパス(今回なら具体的には /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/ )には libswiftSecurity.dylib が存在していない様子でした。

依存ライブラリの判定元

では、依存ライブラリを判定するのに使っているファイルはというと ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/${basename}.framework/${basename} になるようです。

今回の場合なら具体的には ~/Library/Developer/Xcode/DerivedData/EzWrite-fzfubagdtrrgqmewzflesgcmlxyg/Build/Products/Debug/${FULL_PRODUCT_NAME}/Contents/Frameworks の、Pods が生成したフレームワーク達のバイナリが指定されることになるようでした。

ビルドエラーを解消する

ということは、つまり以前にビルドして出来たバンドルの中に何かゴミが残っている可能性が考えられます。

そう思って単純にクリーンビルドしてみても解消されなかったんですけど、ビルドに関係する生成物が保存される Derived Data を削除してみたところ、問題なくビルドできるようになりました。


Derived Data の削除は、Xcode の Productキー を押しながら選択すると現れる Clean Build Folder... を選択することで行えます。

これでも上手くいかない場合は File Workspace Settings... から辿れる Advanced...ボタン をクリックして、そこから ProductsIntermediates が保存されている元のフォルダーを手作業で削除してみるのも良いかもしれません。