-
-
Save felix-schwarz/c61c0f7d9ab60f53ebb0 to your computer and use it in GitHub Desktop.
| #!/bin/bash | |
| # This script downloads and builds the iOS, tvOS and Mac openSSL libraries with Bitcode enabled | |
| # Credits: | |
| # https://github.com/st3fan/ios-openssl | |
| # https://github.com/x2on/OpenSSL-for-iPhone/blob/master/build-libssl.sh | |
| # https://gist.github.com/foozmeat/5154962 | |
| # Peter Steinberger, PSPDFKit GmbH, @steipete. | |
| # Felix Schwarz, IOSPIRIT GmbH, @felix_schwarz. | |
| set -e | |
| usage () | |
| { | |
| echo "usage: $0 [iOS SDK version (defaults to latest)] [tvOS SDK version (defaults to latest)] [OS X minimum deployment target (defaults to 10.7)]" | |
| exit 127 | |
| } | |
| if [ $1 -e "-h" ]; then | |
| usage | |
| fi | |
| if [ -z $1 ]; then | |
| IOS_SDK_VERSION="" #"9.1" | |
| IOS_MIN_SDK_VERSION="8.0" | |
| TVOS_SDK_VERSION="" #"9.0" | |
| TVOS_MIN_SDK_VERSION="9.0" | |
| OSX_DEPLOYMENT_TARGET="10.7" | |
| else | |
| IOS_SDK_VERSION=$1 | |
| TVOS_SDK_VERSION=$2 | |
| OSX_DEPLOYMENT_TARGET=$3 | |
| fi | |
| OPENSSL_VERSION="openssl-1.0.2d" | |
| DEVELOPER=`xcode-select -print-path` | |
| buildMac() | |
| { | |
| ARCH=$1 | |
| echo "Building ${OPENSSL_VERSION} for ${ARCH}" | |
| TARGET="darwin-i386-cc" | |
| if [[ $ARCH == "x86_64" ]]; then | |
| TARGET="darwin64-x86_64-cc" | |
| fi | |
| export CC="${BUILD_TOOLS}/usr/bin/clang -fembed-bitcode -mmacosx-version-min=${OSX_DEPLOYMENT_TARGET}" | |
| pushd . > /dev/null | |
| cd "${OPENSSL_VERSION}" | |
| ./Configure no-asm ${TARGET} --openssldir="/tmp/${OPENSSL_VERSION}-${ARCH}" &> "/tmp/${OPENSSL_VERSION}-${ARCH}.log" | |
| make >> "/tmp/${OPENSSL_VERSION}-${ARCH}.log" 2>&1 | |
| make install_sw >> "/tmp/${OPENSSL_VERSION}-${ARCH}.log" 2>&1 | |
| make clean >> "/tmp/${OPENSSL_VERSION}-${ARCH}.log" 2>&1 | |
| popd > /dev/null | |
| } | |
| buildIOS() | |
| { | |
| ARCH=$1 | |
| pushd . > /dev/null | |
| cd "${OPENSSL_VERSION}" | |
| if [[ "${ARCH}" == "i386" || "${ARCH}" == "x86_64" ]]; then | |
| PLATFORM="iPhoneSimulator" | |
| else | |
| PLATFORM="iPhoneOS" | |
| sed -ie "s!static volatile sig_atomic_t intr_signal;!static volatile intr_signal;!" "crypto/ui/ui_openssl.c" | |
| fi | |
| export $PLATFORM | |
| export CROSS_TOP="${DEVELOPER}/Platforms/${PLATFORM}.platform/Developer" | |
| export CROSS_SDK="${PLATFORM}${IOS_SDK_VERSION}.sdk" | |
| export BUILD_TOOLS="${DEVELOPER}" | |
| export CC="${BUILD_TOOLS}/usr/bin/gcc -fembed-bitcode -arch ${ARCH}" | |
| echo "Building ${OPENSSL_VERSION} for ${PLATFORM} ${IOS_SDK_VERSION} ${ARCH}" | |
| if [[ "${ARCH}" == "x86_64" ]]; then | |
| ./Configure no-asm darwin64-x86_64-cc --openssldir="/tmp/${OPENSSL_VERSION}-iOS-${ARCH}" &> "/tmp/${OPENSSL_VERSION}-iOS-${ARCH}.log" | |
| else | |
| ./Configure iphoneos-cross --openssldir="/tmp/${OPENSSL_VERSION}-iOS-${ARCH}" &> "/tmp/${OPENSSL_VERSION}-iOS-${ARCH}.log" | |
| fi | |
| # add -isysroot to CC= | |
| sed -ie "s!^CFLAG=!CFLAG=-isysroot ${CROSS_TOP}/SDKs/${CROSS_SDK} -miphoneos-version-min=${IOS_MIN_SDK_VERSION} !" "Makefile" | |
| make >> "/tmp/${OPENSSL_VERSION}-iOS-${ARCH}.log" 2>&1 | |
| make install_sw >> "/tmp/${OPENSSL_VERSION}-iOS-${ARCH}.log" 2>&1 | |
| make clean >> "/tmp/${OPENSSL_VERSION}-iOS-${ARCH}.log" 2>&1 | |
| popd > /dev/null | |
| } | |
| buildTVOS() | |
| { | |
| ARCH=$1 | |
| pushd . > /dev/null | |
| cd "${OPENSSL_VERSION}" | |
| if [[ "${ARCH}" == "i386" || "${ARCH}" == "x86_64" ]]; then | |
| PLATFORM="AppleTVSimulator" | |
| else | |
| PLATFORM="AppleTVOS" | |
| sed -ie "s!static volatile sig_atomic_t intr_signal;!static volatile intr_signal;!" "crypto/ui/ui_openssl.c" | |
| fi | |
| export $PLATFORM | |
| export CROSS_TOP="${DEVELOPER}/Platforms/${PLATFORM}.platform/Developer" | |
| export CROSS_SDK="${PLATFORM}${TVOS_SDK_VERSION}.sdk" | |
| export BUILD_TOOLS="${DEVELOPER}" | |
| export CC="${BUILD_TOOLS}/usr/bin/gcc -fembed-bitcode -arch ${ARCH}" | |
| echo "Building ${OPENSSL_VERSION} for ${PLATFORM} ${TVOS_SDK_VERSION} ${ARCH}" | |
| # Patch apps/speed.c to not use fork() since it's not available on tvOS | |
| LANG=C sed -i -- 's/define HAVE_FORK 1/define HAVE_FORK 0/' "./apps/speed.c" | |
| # Patch Configure to build for tvOS, not iOS | |
| LANG=C sed -i -- 's/D\_REENTRANT\:iOS/D\_REENTRANT\:tvOS/' "./Configure" | |
| chmod u+x ./Configure | |
| if [[ "${ARCH}" == "x86_64" ]]; then | |
| ./Configure no-asm darwin64-x86_64-cc --openssldir="/tmp/${OPENSSL_VERSION}-tvOS-${ARCH}" &> "/tmp/${OPENSSL_VERSION}-tvOS-${ARCH}.log" | |
| else | |
| ./Configure iphoneos-cross --openssldir="/tmp/${OPENSSL_VERSION}-tvOS-${ARCH}" &> "/tmp/${OPENSSL_VERSION}-tvOS-${ARCH}.log" | |
| fi | |
| # add -isysroot to CC= | |
| sed -ie "s!^CFLAG=!CFLAG=-isysroot ${CROSS_TOP}/SDKs/${CROSS_SDK} -mtvos-version-min=${TVOS_MIN_SDK_VERSION} !" "Makefile" | |
| make >> "/tmp/${OPENSSL_VERSION}-tvOS-${ARCH}.log" 2>&1 | |
| make install_sw >> "/tmp/${OPENSSL_VERSION}-tvOS-${ARCH}.log" 2>&1 | |
| make clean >> "/tmp/${OPENSSL_VERSION}-tvOS-${ARCH}.log" 2>&1 | |
| popd > /dev/null | |
| } | |
| echo "Cleaning up" | |
| rm -rf include/openssl/* lib/* | |
| mkdir -p lib | |
| mkdir -p include/openssl/ | |
| rm -rf "/tmp/${OPENSSL_VERSION}-*" | |
| rm -rf "/tmp/${OPENSSL_VERSION}-*.log" | |
| rm -rf "${OPENSSL_VERSION}" | |
| if [ ! -e ${OPENSSL_VERSION}.tar.gz ]; then | |
| echo "Downloading ${OPENSSL_VERSION}.tar.gz" | |
| curl -O https://www.openssl.org/source/${OPENSSL_VERSION}.tar.gz | |
| else | |
| echo "Using ${OPENSSL_VERSION}.tar.gz" | |
| fi | |
| echo "Unpacking openssl" | |
| tar xfz "${OPENSSL_VERSION}.tar.gz" | |
| buildMac "x86_64" | |
| echo "Copying headers" | |
| cp /tmp/${OPENSSL_VERSION}-x86_64/include/openssl/* include/openssl/ | |
| echo "Building Mac libraries" | |
| lipo \ | |
| "/tmp/${OPENSSL_VERSION}-x86_64/lib/libcrypto.a" \ | |
| -create -output lib/libcrypto_Mac.a | |
| lipo \ | |
| "/tmp/${OPENSSL_VERSION}-x86_64/lib/libssl.a" \ | |
| -create -output lib/libssl_Mac.a | |
| buildIOS "armv7" | |
| buildIOS "arm64" | |
| buildIOS "x86_64" | |
| buildIOS "i386" | |
| echo "Building iOS libraries" | |
| lipo \ | |
| "/tmp/${OPENSSL_VERSION}-iOS-armv7/lib/libcrypto.a" \ | |
| "/tmp/${OPENSSL_VERSION}-iOS-i386/lib/libcrypto.a" \ | |
| -create -output lib/libcrypto_iOS.a | |
| lipo \ | |
| "/tmp/${OPENSSL_VERSION}-iOS-armv7/lib/libssl.a" \ | |
| "/tmp/${OPENSSL_VERSION}-iOS-i386/lib/libssl.a" \ | |
| -create -output lib/libssl_iOS.a | |
| echo "Adding 64-bit libraries" | |
| lipo \ | |
| "lib/libcrypto_iOS.a" \ | |
| "/tmp/${OPENSSL_VERSION}-iOS-arm64/lib/libcrypto.a" \ | |
| "/tmp/${OPENSSL_VERSION}-iOS-x86_64/lib/libcrypto.a" \ | |
| -create -output lib/libcrypto_iOS.a | |
| lipo \ | |
| "lib/libssl_iOS.a" \ | |
| "/tmp/${OPENSSL_VERSION}-iOS-arm64/lib/libssl.a" \ | |
| "/tmp/${OPENSSL_VERSION}-iOS-x86_64/lib/libssl.a" \ | |
| -create -output lib/libssl_iOS.a | |
| buildTVOS "arm64" | |
| buildTVOS "x86_64" | |
| echo "Building tvOS libraries" | |
| lipo \ | |
| "/tmp/${OPENSSL_VERSION}-tvOS-arm64/lib/libcrypto.a" \ | |
| "/tmp/${OPENSSL_VERSION}-tvOS-x86_64/lib/libcrypto.a" \ | |
| -create -output lib/libcrypto_tvOS.a | |
| lipo \ | |
| "/tmp/${OPENSSL_VERSION}-tvOS-arm64/lib/libssl.a" \ | |
| "/tmp/${OPENSSL_VERSION}-tvOS-x86_64/lib/libssl.a" \ | |
| -create -output lib/libssl_tvOS.a | |
| echo "Cleaning up" | |
| rm -rf /tmp/${OPENSSL_VERSION}-* | |
| rm -rf ${OPENSSL_VERSION} | |
| echo "Done" |
@vgoltv I just added those two lines to the beginning of the script, and it worked perfectly. Thank you!
Using this approach, I modified the script to build OpenSSL + libcurl for Mac, iOS and tvOS. https://github.com/jasonacox/Build-OpenSSL-cURL
Thanks guys!
build fail for 1.1.0c with message:
LD_LIBRARY_PATH=.: /usr/bin/clang -fembed-bitcode -mmacosx-version-min=10.7 -DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSLDIR="/tmp/openssl-1.1.0c-x86_64" -DENGINESDIR="/usr/local/lib/engines-1.1" -O3 -D_REENTRANT -arch x86_64 -DL_ENDIAN -Wall -fPIC -arch x86_64 -bundle -o engines/capi.dylib engines/e_capi.o -Wl,-search_paths_first -L. -lcrypto
ld: -bundle and -bitcode_bundle (Xcode setting ENABLE_BITCODE=YES) cannot be used together
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [link_dso.darwin] Error 1
make[1]: *** [engines/capi.dylib] Error 2
make: *** [all] Error 2
Possible to give answer to my STO question about creating Framework from Terminal:
This works for 1.1.1b, but I'm getting a file was built for archive which is not the architecture being linked (arm64)
@klische you able to resolve the architecture errors?
Tried running this script on macOS 10.13.6 (Xcode version 10.1), and it fails:
...
Building iOS libraries
Adding 64-bit libraries
Building openssl-1.0.2d for AppleTVOS arm64
sed: RE error: illegal byte sequence
Need to update this to stop building some architectures like armv7 and i386
to fix possible error:
sed: RE error: illegal byte sequence
it is better to add to .bash_profile :
export LC_CTYPE=C
export LANG=C