quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

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