package-ios.sh (7385B)
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 case $(arch) in 15 i386) ARCH=x86_64 ;; 16 arm64) ARCH=arm64 ;; 17 esac 18 19 targets=( 20 iphoneos-arm64 21 iphonesimulator-"${ARCH}" 22 # macosx-arm64 23 # macosx-x86_64 24 ) 25 26 contains_element() { 27 local e match="$1" 28 shift 29 for e; do [[ "$e" == "$match" ]] && return 0; done 30 return 1 31 } 32 33 build_static_monolith() { 34 local folder="$1" 35 local output="$2" 36 rm -rf "${folder}/${output}" 37 # exclude libraries that were compiled for the build machine or not necessary 38 static_files=($(find "${folder}/" -name "*.[ao]" | grep -Ev 'native|qjsc')) 39 libtool -static -o "${folder}/${output}" \ 40 "${static_files[@]}" > /dev/null 2>&1 41 } 42 43 base_build_folder="build-ios" 44 build_folders=() 45 46 # Build all targets 47 build_targets() { 48 mkdir -p "${base_build_folder}" 49 50 for target in "${targets[@]}"; do 51 sdk="${target%-*}" 52 arch="${target#*-}" 53 build_folder="${base_build_folder}/${sdk}-${arch}" 54 build_folders+=("${build_folder}") 55 log_file="${base_build_folder}/package-ios-${sdk}-${arch}.log" 56 echo "$(tput bold)(!) Now building for $sdk $arch... (logs written to ${log_file})$(tput sgr0)" 57 ./cross/build-ios.sh $sdk $arch > "${log_file}" 2>&1 58 build_pids+=("$!") 59 done 60 } 61 62 include_dir="${base_build_folder}/include" 63 64 # Copy headers 65 copy_headers() { 66 [ -d "${include_dir}" ] && rm -r "${include_dir}" 67 mkdir -p "${include_dir}" 68 mkdir -p "${include_dir}/quickjs" 69 cp -r "taler_wallet_core_lib.h" "${include_dir}" 70 cp -r "quickjs/quickjs.h" "${include_dir}/quickjs" 71 cp -r "quickjs/quickjs-http.h" "${include_dir}/quickjs" 72 cp -r xcode/*.h "${include_dir}" 73 cp -r "xcode/module.modulemap" "${include_dir}" 74 } 75 76 library="FTalerWalletcore.a" 77 library_name="FTalerWalletcore" 78 79 # Package all libraries into .xcframework 80 package_frameworks() { 81 echo "$(tput bold)(!) Now generating ${library_name}.xcframework...$(tput sgr0)" 82 83 xcodebuild_flags=() 84 xcframework_dir="${base_build_folder}/${library_name}.xcframework" 85 rm -rf "${xcframework_dir}" 86 87 headers_flag=(-headers "${include_dir}") 88 89 # iphoneos 90 if contains_element "iphoneos-arm64" "${targets[@]}"; then 91 build_static_monolith "${base_build_folder}/iphoneos-arm64" "${library}" 92 xcodebuild_flags+=( 93 -library "${base_build_folder}/iphoneos-arm64/${library}" 94 "${headers_flag[@]}") 95 fi 96 97 # iphonesimulator 98 if contains_element "iphonesimulator-x86_64" "${targets[@]}" && 99 ! contains_element "iphonesimulator-arm64" "${targets[@]}"; then 100 build_static_monolith "${base_build_folder}/iphonesimulator-x86_64" "${library}" 101 universal_output="${base_build_folder}/iphonesimulator-universal" 102 mkdir -p "${universal_output}" 103 cp "${base_build_folder}/iphonesimulator-x86_64/${library}" \ 104 "${universal_output}/${library}" 105 xcodebuild_flags+=( 106 -library "${universal_output}/${library}" 107 "${headers_flag[@]}") 108 elif ! contains_element "iphonesimulator-x86_64" "${targets[@]}" && 109 contains_element "iphonesimulator-arm64" "${targets[@]}"; then 110 build_static_monolith "${base_build_folder}/iphonesimulator-arm64" "${library}" 111 universal_output="${base_build_folder}/iphonesimulator-universal" 112 mkdir -p "${universal_output}" 113 cp "${base_build_folder}/iphonesimulator-arm64/${library}" \ 114 "${universal_output}/${library}" 115 xcodebuild_flags+=( 116 -library "${universal_output}/${library}" 117 "${headers_flag[@]}") 118 elif contains_element "iphonesimulator-x86_64" "${targets[@]}" && 119 contains_element "iphonesimulator-arm64" "${targets[@]}"; then 120 build_static_monolith "${base_build_folder}/iphonesimulator-x86_64" "${library}" 121 build_static_monolith "${base_build_folder}/iphonesimulator-arm64" "${library}" 122 universal_output="${base_build_folder}/iphonesimulator-universal" 123 mkdir -p "${universal_output}" 124 lipo "${base_build_folder}/iphonesimulator-x86_64/${library}" \ 125 "${base_build_folder}/iphonesimulator-arm64/${library}" \ 126 -output "${universal_output}/${library}" -create 127 xcodebuild_flags+=( 128 -library "${universal_output}/${library}" 129 "${headers_flag[@]}") 130 fi 131 132 # macosx 133 if contains_element "macosx-x86_64" "${targets[@]}" && 134 ! contains_element "macosx-arm64" "${targets[@]}"; then 135 build_static_monolith "${base_build_folder}/macosx-x86_64" "${library}" 136 universal_output="${base_build_folder}/macosx-universal" 137 mkdir -p "${universal_output}" 138 cp "${base_build_folder}/macosx-x86_64/${library}" \ 139 "${universal_output}/${library}" 140 xcodebuild_flags+=( 141 -library "${universal_output}/${library}" 142 "${headers_flag[@]}") 143 elif ! contains_element "macosx-x86_64" "${targets[@]}" && 144 contains_element "macosx-arm64" "${targets[@]}"; then 145 build_static_monolith "${base_build_folder}/macosx-arm64" "${library}" 146 universal_output="${base_build_folder}/macosx-universal" 147 mkdir -p "${universal_output}" 148 cp "${base_build_folder}/macosx-arm64/${library}" \ 149 "${universal_output}/${library}" 150 xcodebuild_flags+=( 151 -library "${universal_output}/${library}" 152 "${headers_flag[@]}") 153 elif contains_element "macosx-x86_64" "${targets[@]}" && 154 contains_element "macosx-arm64" "${targets[@]}"; then 155 build_static_monolith "${base_build_folder}/macosx-x86_64" "${library}" 156 build_static_monolith "${base_build_folder}/macosx-arm64" "${library}" 157 universal_output="${base_build_folder}/macosx-universal" 158 mkdir -p "${universal_output}" 159 lipo "${base_build_folder}/macosx-x86_64/${library}" \ 160 "${base_build_folder}/macosx-arm64/${library}" \ 161 -output "${universal_output}/${library}" -create 162 xcodebuild_flags+=( 163 -library "${universal_output}/${library}" 164 "${headers_flag[@]}") 165 fi 166 167 xcodebuild -create-xcframework \ 168 "${xcodebuild_flags[@]}" \ 169 -output "${xcframework_dir}" 170 171 # quick dirty workaround: point Info.plist to correct simulator path 172 # when building for only one architecture, because xcodebuild sucks 173 174 if contains_element "iphonesimulator-x86_64" "${targets[@]}" && 175 ! contains_element "iphonesimulator-arm64" "${targets[@]}"; then 176 plist_file="${xcframework_dir}/Info.plist" 177 sed -i '' 's/ios-arm64_x86_64-simulator/ios-x86_64-simulator/g' "${plist_file}" 178 elif ! contains_element "iphonesimulator-x86_64" "${targets[@]}" && 179 contains_element "iphonesimulator-arm64" "${targets[@]}"; then 180 plist_file="${xcframework_dir}/Info.plist" 181 sed -i '' 's/ios-arm64_x86_64-simulator/ios-arm64-simulator/g' "${plist_file}" 182 fi 183 184 echo "$(tput bold)(!) File ${xcframework_dir} has been generated successfully!$(tput sgr0)" 185 } 186 187 build_targets 188 copy_headers 189 package_frameworks