quickjs-tart

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

commit e5eb8195053da0f3a564f46357430525185c0579
parent 4c738383282537cffe0c7ffc81db237f78768c75
Author: Iván Ávalos <avalos@disroot.org>
Date:   Thu, 21 Aug 2025 03:57:27 +0200

new .xcframework generator script for iOS

Diffstat:
M.gitignore | 17+++++++++++------
Across/build-ios.sh | 111+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Across/package-ios.sh | 128+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mtaler_wallet_core_lib.h | 5+----
4 files changed, 251 insertions(+), 10 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -4,15 +4,20 @@ tags # compiled wallet core file taler-wallet-core-qjs.mjs taler-wallet-cli.qtart.mjs -cross/android-*.cross.txt +cross/*.cross.txt -build-* -builddir +/build-* +/build # Xcode user data *.xcodeproj/**/xcuserdata +*.xcframework +*.xcworkspace +default.profraw +.DS_Store -.env +# Gradle +/.m2 +/.gradle-cache -.m2 -.gradle-cache +.env diff --git a/cross/build-ios.sh b/cross/build-ios.sh @@ -0,0 +1,111 @@ +#!/bin/bash +set -eu + +if [ -z ${2+x} ]; then + echo "usage: $0 <SDK> <ABI>" + echo "example: $0 iphoneos arm64" + echo "example: $0 iphonesimulator arm64" + exit 1 +fi + +SDK=$1 +ABI=$2 + +case $ABI in +arm64) + ARCH="arm64" + CPU_FAMILY=aarch64 + CPU=armv8 + ENDIAN=little + ;; +x86_64) + ARCH="x86_64" + CPU_FAMILY=x86_64 + CPU=x86_64 + ENDIAN=little + ;; +*) + echo unknown ABI + exit 1 + ;; +esac + +case $SDK in +iphoneos) + MIN_OS_VERSION=${MIN_SDK_VERSION:-15.0} + TARGET_TRIPLE=$ARCH-apple-ios${MIN_OS_VERSION} + SDK_NAME="iPhoneOS" + SYSTEM='ios' + ;; +iphonesimulator) + MIN_OS_VERSION=${MIN_SDK_VERSION:-15.0} + TARGET_TRIPLE=$ARCH-apple-ios${MIN_OS_VERSION}-simulator + SDK_NAME="iPhoneSimulator" + SYSTEM='ios' + ;; +# macosx) +# MIN_OS_VERSION=${MIN_SDK_VERSION:-11.0} +# TARGET_TRIPLE=$ARCH-macosx${MIN_OS_VERSION} +# SDK_NAME="MacOSX" +# SYSTEM='darwin' +# ;; +*) + echo unknown SDK + exit 1 + ;; +esac + +PLATFORM_PATH="$(xcrun --sdk ${SDK} --show-sdk-platform-path)" +SDK_VERSION="$(xcrun --sdk ${SDK} --show-sdk-version)" +SDK_ROOT="${PLATFORM_PATH}/Developer/SDKs/${SDK_NAME}${SDK_VERSION}.sdk" +SYS_ROOT="${SDK_ROOT}" +LIB_PATH="${SYS_ROOT}/usr/lib" +INC_PATH="${SYS_ROOT}/usr/include" + +CROSSFILE=cross/ios-$SDK-$ABI.cross.txt +MIN_OS_FLAG=-m${SDK}-version-min=$MIN_OS_VERSION + +cat > $CROSSFILE <<EOF +[binaries] +c = ['xcrun', '--sdk', '$SYS_ROOT', 'clang'] +cpp = ['xcrun', '--sdk', '$SYS_ROOT', 'clang++'] +objc = ['xcrun', '--sdk', '$SYS_ROOT', 'clang'] +objcpp = ['xcrun', '--sdk', '$SYS_ROOT', 'clang++'] +ld = ['clang'] +ar = 'ar' +strip = 'strip' + +[built-in options] +c_args = ['$MIN_OS_FLAG', '-target', '$TARGET_TRIPLE', '-arch', '$ARCH', '-isysroot', '$SYS_ROOT'] +cpp_args = ['$MIN_OS_FLAG', '-target', '$TARGET_TRIPLE', '-arch', '$ARCH', '-isysroot', '$SYS_ROOT'] +c_link_args = ['$MIN_OS_FLAG', '-target', '$TARGET_TRIPLE', '-arch', '$ARCH', '-isysroot', '$SYS_ROOT'] +cpp_link_args = ['$MIN_OS_FLAG', '-target', '$TARGET_TRIPLE', '-arch', '$ARCH', '-isysroot', '$SYS_ROOT'] +objc_args = ['$MIN_OS_FLAG', '-target', '$TARGET_TRIPLE', '-arch', '$ARCH', '-isysroot', '$SYS_ROOT'] +objcpp_args = ['$MIN_OS_FLAG', '-target', '$TARGET_TRIPLE', '-arch', '$ARCH', '-isysroot', '$SYS_ROOT'] + +[properties] +root = '$SDK_ROOT' +has_function_printf = true +has_function_hfkerhisadf = false + +[host_machine] +cpu_family = '$CPU_FAMILY' +cpu = '$CPU' +endian = '$ENDIAN' +system = '$SYSTEM' + +[cmake] +CMAKE_OSX_SYSROOT='${SDK}' +EOF + +BUILD_DIR=build-${SDK}-${ARCH} + +meson setup --errorlogs \ + -Doptimization=3 \ + --includedir=${INC_PATH} \ + --libdir=${LIB_PATH} \ + --cross-file $CROSSFILE \ + --build.cmake-prefix-path=${SYS_ROOT} \ + ${BUILD_DIR} . + +ninja -v -C ${BUILD_DIR} diff --git a/cross/package-ios.sh b/cross/package-ios.sh @@ -0,0 +1,128 @@ +#!/bin/bash +set -e +trap 'kill -SIGTERM 0' EXIT + +# Inspiration: https://github.com/stasel/WebRTC/blob/latest/scripts/build.sh + +platforms=( + ios + macos +) + +targets=( + iphoneos-arm64 + iphonesimulator-arm64 + iphonesimulator-x86_64 + macosx-arm64 + macosx-x86_64 +) +libraries=( + libtalerwalletcore.dylib + subprojects/c-ares/libc_ares.dylib +) + +PLISTBUDDY_EXEC="/usr/libexec/PlistBuddy" + +plist_add_library() { + local plist=$1 + local index=$2 + local identifier=$3 + local library=$4 + local platform=$5 + local platform_variant=$6 + "$PLISTBUDDY_EXEC" -c "Add :AvailableLibraries: dict" "${plist}" + "$PLISTBUDDY_EXEC" -c "Add :AvailableLibraries:${index}:LibraryIdentifier string ${identifier}" "${plist}" + "$PLISTBUDDY_EXEC" -c "Add :AvailableLibraries:${index}:LibraryPath string ${library}" "${plist}" + "$PLISTBUDDY_EXEC" -c "Add :AvailableLibraries:${index}:SupportedArchitectures array" "${plist}" + "$PLISTBUDDY_EXEC" -c "Add :AvailableLibraries:${index}:SupportedPlatform string ${platform}" "${plist}" + if [ ! -z "$platform_variant" ]; then + "$PLISTBUDDY_EXEC" -c "Add :AvailableLibraries:${index}:SupportedPlatformVariant string ${platform_variant}" "${plist}" + fi +} + +plist_add_architecture() { + local plist=$1 + local index=$2 + local arch=$3 + "$PLISTBUDDY_EXEC" -c "Add :AvailableLibraries:${index}:SupportedArchitectures: string ${arch}" "${plist}" +} + +contains_element () { + local e match="$1" + shift + for e; do [[ "$e" == "$match" ]] && return 0; done + return 1 +} + +# Build all targets +build_folders=() + +for target in "${targets[@]}"; do + sdk="${target%-*}" + arch="${target#*-}" + build_folder=build-$sdk-$arch + build_folders+=("${build_folder}") + log_file="${build_folder}/package-ios.log" + echo [$sdk $arch] Compilation logs written to $log_file + # build all in parallel for improved speed! + ./cross/build-ios.sh $sdk $arch > "$log_file" 2>&1 "$log_file" & +done + +wait + +# Package libraries into .xcframework +for library in "${libraries[@]}"; do + xcodebuild_flags=() + for folder in "${build_folders[@]}"; do + xcodebuild_flags+=(-library "${folder}/${library}") + done + library_="${library##*/}" + basename="${library_%.dylib}" + + xcframework_dir="${basename}.xcframework" + info_plist="${xcframework_dir}/Info.plist" + rm -rf "${xcframework_dir}" + mkdir "${xcframework_dir}" + "$PLISTBUDDY_EXEC" -c "Add :CFBundlePackageType string XFWK" "${info_plist}" + "$PLISTBUDDY_EXEC" -c "Add :XCFrameworkFormatVersion string 1.0" "${info_plist}" + "$PLISTBUDDY_EXEC" -c "Add :AvailableLibraries array" "${info_plist}" + + index=0 + + if contains_element "build-iphoneos-arm64" "${build_folders[@]}"; then + lib_identifier="ios-arm64" + mkdir "${xcframework_dir}/${lib_identifier}" + plist_add_library "${info_plist}" "${index}" "${lib_identifier}" "${library_}" "ios" + plist_add_architecture "${info_plist}" "${index}" arm64 + cp -r "build-iphoneos-arm64/${library}" "${xcframework_dir}/${lib_identifier}/" + index=$((index+1)) + fi + + if contains_element "build-iphonesimulator-arm64" "${build_folders[@]}" && + contains_element "build-iphonesimulator-x86_64" "${build_folders[@]}"; then + lib_identifier="ios-x86_64_arm64-simulator" + mkdir "${xcframework_dir}/${lib_identifier}" + plist_add_library "${info_plist}" "${index}" "${lib_identifier}" "${library_}" "ios" "simulator" + plist_add_architecture "${info_plist}" "${index}" arm64 + plist_add_architecture "${info_plist}" "${index}" x86_64 + lipo "build-iphonesimulator-x86_64/${library}" \ + "build-iphonesimulator-arm64/${library}" \ + -output "${xcframework_dir}/${lib_identifier}/${library_}" \ + -create + index=$((index+1)) + fi + + if contains_element "build-macosx-arm64" "${build_folders[@]}" && + contains_element "build-macosx-x86_64" "${build_folders[@]}"; then + lib_identifier="macos-x86_64_arm64" + mkdir "${xcframework_dir}/${lib_identifier}" + plist_add_library "${info_plist}" "${index}" "${lib_identifier}" "${library_}" "macos" + plist_add_architecture "${info_plist}" "${index}" arm64 + plist_add_architecture "${info_plist}" "${index}" x86_64 + lipo "build-macosx-x86_64/${library}" \ + "build-macosx-arm64/${library}" \ + -output "${xcframework_dir}/${lib_identifier}/${library_}" \ + -create + index=$((index+1)) + fi +done diff --git a/taler_wallet_core_lib.h b/taler_wallet_core_lib.h @@ -25,11 +25,8 @@ #ifndef _TALER_WALLET_LIB_H #define _TALER_WALLET_LIB_H -#if TARGET_OS_IPHONE -#include "quickjs-http.h" -#else #include "quickjs/quickjs-http.h" -#endif + /** * Opaque handle to a Taler wallet-core instance. */