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:
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.
*/