package-ios.sh (4387B)
1 #!/bin/bash 2 set -eE 3 shopt -s nullglob 4 5 handle_error() { 6 echo "$(tput bold)(!) An error has ocurred, please check the log files for more information.$(tput sgr0)" 7 exit -1 8 } 9 10 trap handle_error ERR 11 12 # Inspiration: https://github.com/stasel/WebRTC/blob/latest/scripts/build.sh 13 14 targets=( 15 iphoneos-arm64 16 iphonesimulator-arm64 17 iphonesimulator-x86_64 18 # macosx-arm64 19 # macosx-x86_64 20 ) 21 22 contains_element() { 23 local e match="$1" 24 shift 25 for e; do [[ "$e" == "$match" ]] && return 0; done 26 return 1 27 } 28 29 build_static_monolith() { 30 local folder="$1" 31 local output="$2" 32 rm -rf "${folder}/${output}" 33 # exclude libraries that were compiled for the build machine or not necessary 34 static_files=($(find "${folder}/" -name "*.[ao]" | grep -Ev 'native|qjsc')) 35 libtool -static -o "${folder}/${output}" \ 36 "${static_files[@]}" > /dev/null 2>&1 37 } 38 39 base_build_folder="build-ios" 40 build_folders=() 41 42 # Build all targets 43 build_targets() { 44 mkdir -p "${base_build_folder}" 45 46 for target in "${targets[@]}"; do 47 sdk="${target%-*}" 48 arch="${target#*-}" 49 build_folder="${base_build_folder}/${sdk}-${arch}" 50 build_folders+=("${build_folder}") 51 log_file="${base_build_folder}/package-ios-${sdk}-${arch}.log" 52 echo "$(tput bold)(!) Now building for $sdk $arch... (logs written to ${log_file})$(tput sgr0)" 53 ./cross/build-ios.sh $sdk $arch > "${log_file}" 2>&1 54 build_pids+=("$!") 55 done 56 } 57 58 include_dir="${base_build_folder}/include" 59 60 # Copy headers 61 copy_headers() { 62 [ -d "${include_dir}" ] && rm -r "${include_dir}" 63 mkdir -p "${include_dir}" 64 mkdir -p "${include_dir}/quickjs" 65 cp -r "taler_wallet_core_lib.h" "${include_dir}" 66 cp -r "quickjs/quickjs.h" "${include_dir}/quickjs" 67 cp -r "quickjs/quickjs-http.h" "${include_dir}/quickjs" 68 cp -r xcode/*.h "${include_dir}" 69 cp -r "xcode/module.modulemap" "${include_dir}" 70 } 71 72 library="FTalerWalletcore.a" 73 library_name="FTalerWalletcore" 74 75 # Package all libraries into .xcframework 76 package_frameworks() { 77 echo "$(tput bold)(!) Now generating ${library_name}.xcframework...$(tput sgr0)" 78 79 xcodebuild_flags=() 80 xcframework_dir="${base_build_folder}/${library_name}.xcframework" 81 rm -rf "${xcframework_dir}" 82 83 headers_flag=(-headers "${include_dir}") 84 85 # iphoneos 86 if contains_element "iphoneos-arm64" "${targets[@]}"; then 87 build_static_monolith "${base_build_folder}/iphoneos-arm64" "${library}" 88 xcodebuild_flags+=( 89 -library "${base_build_folder}/iphoneos-arm64/${library}" 90 "${headers_flag[@]}") 91 fi 92 93 # iphonesimulator 94 if contains_element "iphonesimulator-x86_64" "${targets[@]}" && 95 contains_element "iphonesimulator-arm64" "${targets[@]}"; then 96 build_static_monolith "${base_build_folder}/iphonesimulator-x86_64" "${library}" 97 build_static_monolith "${base_build_folder}/iphonesimulator-arm64" "${library}" 98 universal_output="${base_build_folder}/iphonesimulator-universal" 99 mkdir -p "${universal_output}" 100 lipo "${base_build_folder}/iphonesimulator-x86_64/${library}" \ 101 "${base_build_folder}/iphonesimulator-arm64/${library}" \ 102 -output "${universal_output}/${library}" -create 103 xcodebuild_flags+=( 104 -library "${universal_output}/${library}" 105 "${headers_flag[@]}") 106 fi 107 108 # macosx 109 if contains_element "macosx-x86_64" "${targets[@]}" && 110 contains_element "macosx-arm64" "${targets[@]}"; then 111 build_static_monolith "${base_build_folder}/macosx-x86_64" "${library}" 112 build_static_monolith "${base_build_folder}/macosx-arm64" "${library}" 113 universal_output="${base_build_dir}/macosx-universal" 114 mkdir -p "${universal_output}" 115 lipo "${base_build_folder}/macosx-x86_64/${library}" \ 116 "${base_build_folder}/macosx-arm64/${library}" \ 117 -output "${universal_output}/${library}" -create 118 xcodebuild_flags+=( 119 -library "${universal_output}/${library}" 120 "${headers_flag[@]}") 121 fi 122 123 xcodebuild -create-xcframework \ 124 "${xcodebuild_flags[@]}" \ 125 -output "${xcframework_dir}" 126 127 echo "$(tput bold)(!) File ${xcframework_dir} has been generated successfully!$(tput sgr0)" 128 } 129 130 build_targets 131 copy_headers 132 package_frameworks