もう少し簡単で堅牢な方法は、スクリプトの実行フェーズで「CommonCryptoModuleMap」という集約ターゲットを作成し、モジュールマップを自動的に生成し、正しいXcode / SDKパスを使用することです。
スクリプトの実行フェーズには、次のbashが含まれている必要があります。
# This if-statement means we'll only run the main script if the CommonCryptoModuleMap directory doesn't exist
# Because otherwise the rest of the script causes a full recompile for anything where CommonCrypto is a dependency
# Do a "Clean Build Folder" to remove this directory and trigger the rest of the script to run
if [ -d "${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap" ]; then
echo "${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap directory already exists, so skipping the rest of the script."
exit 0
fi
mkdir -p "${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap"
cat <<EOF > "${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap/module.modulemap"
module CommonCrypto [system] {
header "${SDKROOT}/usr/include/CommonCrypto/CommonCrypto.h"
export *
}
EOF
シェルコード${SDKROOT}
を使用するxcode-select
と、特にシステム間で異なるXcode.appパスをハードコーディングする必要がないことを意味します。特に、ベータバージョンに切り替える場合、または複数のバージョンがインストールされているCIサーバーでビルドしている場合非標準の場所で。また、SDKをハードコーディングする必要もないので、これはiOS、macOSなどで機能します。プロジェクトのソースディレクトリに何かを置く必要もありません。
このターゲットを作成した後、ライブラリ/フレームワークがターゲット依存関係アイテムでそれに依存するようにします。
これにより、フレームワークがビルドされる前にモジュールマップが生成されます。
macOSに関する注意:サポートしmacOS
ている場合はmacosx
、Supported Platforms
作成したばかりの新しい集約ターゲットのビルド設定に追加する必要があります。そうしないと、モジュールマップが正しいDebug
派生データフォルダーに残りません。フレームワーク製品。
次に、モジュールマップの親ディレクトリを${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap
Swiftセクション(SWIFT_INCLUDE_PATHS
)の下の「インポートパス」ビルド設定に追加します。
$(inherited)
プロジェクトまたはxcconfigレベルで検索パスが定義されている場合は、必ず行を追加してください。
これで終わりです。これで、 import CommonCrypto
Xcode 10のアップデート
Xcode 10にはCommonCryptoモジュールマップが同梱されており、この回避策は不要です。Xcode 9と10の両方をサポートする場合は、スクリプトの実行フェーズでモジュールマップが存在するかどうかを確認できます。たとえば、
COMMON_CRYPTO_DIR="${SDKROOT}/usr/include/CommonCrypto"
if [ -f "${COMMON_CRYPTO_DIR}/module.modulemap" ]
then
echo "CommonCrypto already exists, skipping"
else
# generate the module map, using the original code above
fi