कुछ थोड़ा सरल और अधिक मजबूत है एक "एग्रीक्रीप्टोमोड्यूलापेज़" नामक एक एग्रीगेट लक्ष्य बनाना, रन स्क्रिप्ट के चरण के साथ मॉड्यूल मैप को स्वचालित रूप से और सही Xcode / SDK पथ के साथ उत्पन्न करने के लिए:
रन स्क्रिप्ट चरण में यह बैश होना चाहिए:
# 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.app पथ की आवश्यकता नहीं है जो सिस्टम-से-सिस्टम को अलग-अलग कर सकता है, खासकर यदि आप उपयोग करते हैंxcode-select
बीटा संस्करण में स्विच करने के लिए करते हैं, या एक सीआई सर्वर पर निर्माण कर रहे हैं जहां कई संस्करण स्थापित हैं गैर-मानक स्थानों में। आपको SDK को हार्ड कोड करने की भी आवश्यकता नहीं है, इसलिए इसे iOS, macOS आदि के लिए काम करना चाहिए। आपको अपने प्रोजेक्ट के सोर्स डायरेक्टरी में बैठने की भी कोई आवश्यकता नहीं है।
इस लक्ष्य को बनाने के बाद, अपनी लाइब्रेरी / रूपरेखा को लक्ष्य निर्भरता मद के साथ उस पर निर्भर करें:
यह सुनिश्चित करेगा कि आपकी रूपरेखा तैयार होने से पहले मॉड्यूल का मानचित्र तैयार हो जाए।
macOS नोट : यदि आप macOS
अच्छी तरह से समर्थन कर रहे हैं , तो आपको macosx
अपने द्वारा Supported Platforms
बनाए गए नए कुल लक्ष्य पर बिल्ड सेटिंग में जोड़ने की आवश्यकता होगी , अन्यथा यह मॉड्यूल मैप Debug
को बाकी के साथ सही व्युत्पन्न डेटा फ़ोल्डर में नहीं रखेगा । फ्रेमवर्क उत्पादों।
अगला, ${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap
स्विफ्ट अनुभाग के तहत "आयात पथ" बिल्ड सेटिंग में मॉड्यूल मैप की मूल निर्देशिका को जोड़ें SWIFT_INCLUDE_PATHS
:
एक जोड़ने के लिए याद रखें $(inherited)
यदि आपके पास प्रोजेक्ट या xcconfig स्तर पर परिभाषित खोज पथ हैं, तो पंक्ति ।
बस, अब आपको होना चाहिए import CommonCrypto
Xcode 10 के लिए अपडेट करें
Xcode 10 अब कॉमन क्रिप्टो मॉड्यूल मैप के साथ जहाजों को इस वर्कअराउंड को अनावश्यक बनाता है। यदि आप 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