2021-06-14 22:38:29 -07:00
|
|
|
#!/usr/bin/env bash
|
2021-09-25 21:17:40 -07:00
|
|
|
set -eo pipefail
|
2021-06-14 22:38:29 -07:00
|
|
|
|
2021-09-25 21:17:40 -07:00
|
|
|
# functions
|
2021-06-10 13:40:58 -07:00
|
|
|
|
2021-09-25 21:17:40 -07:00
|
|
|
## help
|
|
|
|
help()
|
|
|
|
{
|
|
|
|
# Display Help
|
2021-11-01 19:07:27 -07:00
|
|
|
echo "Build bdk-ffi and related libraries."
|
2021-09-25 21:17:40 -07:00
|
|
|
echo
|
2021-10-28 14:22:45 -07:00
|
|
|
echo "Syntax: build [-a|h|k|s]"
|
2021-09-25 21:17:40 -07:00
|
|
|
echo "options:"
|
2021-10-28 14:22:45 -07:00
|
|
|
echo "-a Android."
|
2021-09-25 21:17:40 -07:00
|
|
|
echo "-h Print this Help."
|
2021-10-12 18:22:02 -07:00
|
|
|
echo "-k Kotlin."
|
2021-10-28 14:22:45 -07:00
|
|
|
echo "-s Swift."
|
2021-09-25 21:17:40 -07:00
|
|
|
echo
|
|
|
|
}
|
2021-06-08 18:15:20 -07:00
|
|
|
|
2021-09-25 21:17:40 -07:00
|
|
|
## rust
|
|
|
|
build_rust() {
|
2021-10-12 18:22:02 -07:00
|
|
|
echo "Build Rust library"
|
2021-09-25 21:17:40 -07:00
|
|
|
cargo fmt
|
|
|
|
cargo build
|
2021-10-12 18:22:02 -07:00
|
|
|
cargo test
|
2021-09-25 21:17:40 -07:00
|
|
|
}
|
2021-06-20 18:48:48 -07:00
|
|
|
|
2021-10-12 15:24:11 -07:00
|
|
|
## copy to bdk-bdk-kotlin
|
2021-09-25 21:17:40 -07:00
|
|
|
copy_lib_kotlin() {
|
2021-10-11 23:04:18 -07:00
|
|
|
echo -n "Copy "
|
2021-09-25 21:17:40 -07:00
|
|
|
case $OS in
|
|
|
|
"Darwin")
|
|
|
|
echo -n "darwin "
|
2021-10-14 22:05:21 -07:00
|
|
|
mkdir -p bindings/bdk-kotlin/jvm/src/main/resources/darwin-x86-64
|
2021-11-01 19:07:27 -07:00
|
|
|
cp target/debug/libbdkffi.dylib bindings/bdk-kotlin/jvm/src/main/resources/darwin-x86-64
|
2021-09-25 21:17:40 -07:00
|
|
|
;;
|
|
|
|
"Linux")
|
|
|
|
echo -n "linux "
|
2021-10-14 22:05:21 -07:00
|
|
|
mkdir -p bindings/bdk-kotlin/jvm/src/main/resources/linux-x86-64
|
2021-11-01 19:07:27 -07:00
|
|
|
cp target/debug/libbdkffi.so bindings/bdk-kotlin/jvm/src/main/resources/linux-x86-64
|
2021-09-25 21:17:40 -07:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
echo "libs to kotlin sub-project"
|
|
|
|
}
|
2021-06-20 18:48:48 -07:00
|
|
|
|
2021-10-12 15:24:11 -07:00
|
|
|
## bdk-bdk-kotlin jar
|
2021-09-25 21:17:40 -07:00
|
|
|
build_kotlin() {
|
2021-10-28 00:35:09 +05:30
|
|
|
copy_lib_kotlin
|
2021-10-14 22:05:21 -07:00
|
|
|
uniffi-bindgen generate src/bdk.udl --no-format --out-dir bindings/bdk-kotlin/jvm/src/main/kotlin --language kotlin
|
2021-09-25 21:17:40 -07:00
|
|
|
}
|
2021-06-20 18:48:48 -07:00
|
|
|
|
2021-10-28 00:35:22 +05:30
|
|
|
## bdk swift
|
|
|
|
build_swift() {
|
|
|
|
uniffi-bindgen generate src/bdk.udl --no-format --out-dir bindings/bdk-swift/ --language swift
|
2021-11-01 19:07:27 -07:00
|
|
|
swiftc -module-name bdk -emit-library -o libbdkffi.dylib -emit-module -emit-module-path ./bindings/bdk-swift/ -parse-as-library -L ./target/debug/ -lbdkffi -Xcc -fmodule-map-file=./bindings/bdk-swift/bdkFFI.modulemap ./bindings/bdk-swift/bdk.swift
|
2021-11-16 22:56:31 -08:00
|
|
|
TARGET_DIR=target
|
|
|
|
BUILD_PROFILE=debug
|
2021-11-01 19:07:27 -07:00
|
|
|
STATIC_LIB_NAME=libbdkffi.a
|
2021-10-28 00:35:22 +05:30
|
|
|
|
2021-11-16 22:56:31 -08:00
|
|
|
# Build ios and ios x86_64 ios simulator binaries
|
2021-10-28 00:35:22 +05:30
|
|
|
LIBS_ARCHS=("x86_64" "arm64")
|
|
|
|
IOS_TRIPLES=("x86_64-apple-ios" "aarch64-apple-ios")
|
|
|
|
for i in "${!LIBS_ARCHS[@]}"; do
|
|
|
|
cargo build --target "${IOS_TRIPLES[${i}]}"
|
|
|
|
done
|
|
|
|
|
2021-11-16 22:56:31 -08:00
|
|
|
## Manually construct xcframework
|
|
|
|
LIB_NAME=libbdkffi.a
|
|
|
|
SWIFT_DIR="bindings/bdk-swift"
|
|
|
|
XCFRAMEWORK_NAME="bdkFFI"
|
|
|
|
XCFRAMEWORK_ROOT="$SWIFT_DIR/$XCFRAMEWORK_NAME.xcframework"
|
|
|
|
|
|
|
|
# Cleanup prior build
|
|
|
|
rm -rf "$XCFRAMEWORK_ROOT"
|
|
|
|
|
|
|
|
# Common files
|
|
|
|
XCFRAMEWORK_COMMON="$XCFRAMEWORK_ROOT/common/$XCFRAMEWORK_NAME.framework"
|
|
|
|
mkdir -p "$XCFRAMEWORK_COMMON/Modules"
|
|
|
|
cp "$SWIFT_DIR/module.modulemap" "$XCFRAMEWORK_COMMON/Modules/"
|
|
|
|
mkdir -p "$XCFRAMEWORK_COMMON/Headers"
|
|
|
|
cp "$SWIFT_DIR/bdkFFI-umbrella.h" "$XCFRAMEWORK_COMMON/Headers"
|
|
|
|
cp "$SWIFT_DIR/bdkFFI.h" "$XCFRAMEWORK_COMMON/Headers"
|
|
|
|
#mkdir -p "$XCFRAMEWORK_COMMON/$XCFRAMEWORK_NAME"
|
|
|
|
#cp "$SWIFT_DIR/bdk.swift" "$XCFRAMEWORK_COMMON/$XCFRAMEWORK_NAME"
|
|
|
|
|
|
|
|
# iOS hardware
|
|
|
|
mkdir -p "$XCFRAMEWORK_ROOT/ios-arm64"
|
|
|
|
cp -R "$XCFRAMEWORK_COMMON" "$XCFRAMEWORK_ROOT/ios-arm64/$XCFRAMEWORK_NAME.framework"
|
|
|
|
cp "$TARGET_DIR/aarch64-apple-ios/$BUILD_PROFILE/$LIB_NAME" "$XCFRAMEWORK_ROOT/ios-arm64/$XCFRAMEWORK_NAME.framework/$XCFRAMEWORK_NAME"
|
|
|
|
|
|
|
|
# iOS simulator, currently x86_64 only (need to make fat binary to add M1)
|
|
|
|
mkdir -p "$XCFRAMEWORK_ROOT/ios-arm64_x86_64-simulator"
|
|
|
|
cp -R "$XCFRAMEWORK_COMMON" "$XCFRAMEWORK_ROOT/ios-arm64_x86_64-simulator/$XCFRAMEWORK_NAME.framework"
|
|
|
|
cp "$TARGET_DIR/x86_64-apple-ios/$BUILD_PROFILE/$LIB_NAME" "$XCFRAMEWORK_ROOT/ios-arm64_x86_64-simulator/$XCFRAMEWORK_NAME.framework/$XCFRAMEWORK_NAME"
|
|
|
|
|
|
|
|
# Set up the metadata for the XCFramework as a whole.
|
|
|
|
cp "$SWIFT_DIR/Info.plist" "$XCFRAMEWORK_ROOT/Info.plist"
|
|
|
|
# TODO add license info
|
|
|
|
|
|
|
|
# Remove common
|
|
|
|
rm -rf "$XCFRAMEWORK_ROOT/common"
|
|
|
|
|
|
|
|
# Zip it all up into a bundle for distribution.
|
|
|
|
(cd $SWIFT_DIR; zip -9 -r "$XCFRAMEWORK_NAME.xcframework.zip" "$XCFRAMEWORK_NAME.xcframework")
|
|
|
|
|
|
|
|
# Cleanup build
|
|
|
|
# rm -rf "$XCFRAMEWORK_ROOT"
|
2021-10-28 00:35:22 +05:30
|
|
|
}
|
|
|
|
|
2021-09-25 21:17:40 -07:00
|
|
|
## rust android
|
|
|
|
build_android() {
|
2021-10-17 14:27:10 -07:00
|
|
|
build_kotlin
|
|
|
|
|
2021-09-25 21:17:40 -07:00
|
|
|
# If ANDROID_NDK_HOME is not set then set it to github actions default
|
|
|
|
[ -z "$ANDROID_NDK_HOME" ] && export ANDROID_NDK_HOME=$ANDROID_HOME/ndk-bundle
|
2021-10-11 23:04:18 -07:00
|
|
|
|
2021-09-25 21:17:40 -07:00
|
|
|
# Update this line accordingly if you are not building *from* darwin-x86_64 or linux-x86_64
|
|
|
|
export PATH=$PATH:$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/`uname | tr '[:upper:]' '[:lower:]'`-x86_64/bin
|
2021-10-11 23:04:18 -07:00
|
|
|
|
2021-09-25 21:17:40 -07:00
|
|
|
# Required for 'ring' dependency to cross-compile to Android platform, must be at least 21
|
|
|
|
export CFLAGS="-D__ANDROID_API__=21"
|
2021-10-11 23:04:18 -07:00
|
|
|
|
2021-09-25 21:17:40 -07:00
|
|
|
# IMPORTANT: make sure every target is not a substring of a different one. We check for them with grep later on
|
2021-11-06 00:42:32 +05:30
|
|
|
BUILD_TARGETS="${BUILD_TARGETS:-aarch64,x86_64,i686}"
|
2021-10-11 23:04:18 -07:00
|
|
|
|
2021-11-06 00:42:32 +05:30
|
|
|
mkdir -p bindings/bdk-kotlin/android/src/main/jniLibs/ bindings/bdk-kotlin/android/src/main/jniLibs/arm64-v8a bindings/bdk-kotlin/android/src/main/jniLibs/x86_64 bindings/bdk-kotlin/android/src/main/jniLibs/x86
|
2021-10-11 23:04:18 -07:00
|
|
|
|
2021-09-25 21:17:40 -07:00
|
|
|
if echo $BUILD_TARGETS | grep "aarch64"; then
|
|
|
|
CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER="aarch64-linux-android21-clang" CC="aarch64-linux-android21-clang" cargo build --target=aarch64-linux-android
|
2021-11-01 19:07:27 -07:00
|
|
|
cp target/aarch64-linux-android/debug/libbdkffi.so bindings/bdk-kotlin/android/src/main/jniLibs/arm64-v8a
|
2021-09-25 21:17:40 -07:00
|
|
|
fi
|
|
|
|
if echo $BUILD_TARGETS | grep "x86_64"; then
|
|
|
|
CARGO_TARGET_X86_64_LINUX_ANDROID_LINKER="x86_64-linux-android21-clang" CC="x86_64-linux-android21-clang" cargo build --target=x86_64-linux-android
|
2021-11-01 19:07:27 -07:00
|
|
|
cp target/x86_64-linux-android/debug/libbdkffi.so bindings/bdk-kotlin/android/src/main/jniLibs/x86_64
|
2021-09-25 21:17:40 -07:00
|
|
|
fi
|
|
|
|
if echo $BUILD_TARGETS | grep "i686"; then
|
|
|
|
CARGO_TARGET_I686_LINUX_ANDROID_LINKER="i686-linux-android21-clang" CC="i686-linux-android21-clang" cargo build --target=i686-linux-android
|
2021-11-06 00:42:32 +05:30
|
|
|
cp target/i686-linux-android/debug/libbdkffi.so bindings/bdk-kotlin/android/src/main/jniLibs/x86
|
2021-09-25 21:17:40 -07:00
|
|
|
fi
|
2021-06-20 18:48:48 -07:00
|
|
|
|
2021-10-21 23:26:34 +05:30
|
|
|
# copy sources
|
2021-11-04 17:44:02 -07:00
|
|
|
cp -R bindings/bdk-kotlin/jvm/src/main/kotlin bindings/bdk-kotlin/android/src/main
|
2021-10-21 23:26:34 +05:30
|
|
|
|
2021-10-14 22:05:21 -07:00
|
|
|
# bdk-kotlin aar
|
2021-11-06 00:23:06 +05:30
|
|
|
(cd bindings/bdk-kotlin && ./gradlew :android:build)
|
2021-09-25 21:17:40 -07:00
|
|
|
}
|
2021-06-20 18:48:48 -07:00
|
|
|
|
2021-09-25 21:17:40 -07:00
|
|
|
OS=$(uname)
|
2021-06-20 18:48:48 -07:00
|
|
|
|
2021-10-11 23:04:18 -07:00
|
|
|
if [ "$1" == "-h" ]
|
2021-09-25 21:17:40 -07:00
|
|
|
then
|
|
|
|
help
|
|
|
|
else
|
|
|
|
build_rust
|
2021-06-20 18:48:48 -07:00
|
|
|
|
2021-09-25 21:17:40 -07:00
|
|
|
while [ -n "$1" ]; do # while loop starts
|
|
|
|
case "$1" in
|
2021-10-17 14:27:10 -07:00
|
|
|
-a) build_android ;;
|
2021-09-25 21:17:40 -07:00
|
|
|
-k) build_kotlin ;;
|
2021-10-28 00:35:22 +05:30
|
|
|
-s) build_swift ;;
|
2021-09-25 21:17:40 -07:00
|
|
|
-h) help ;;
|
|
|
|
*) echo "Option $1 not recognized" ;;
|
|
|
|
esac
|
|
|
|
shift
|
|
|
|
done
|
2021-06-20 18:48:48 -07:00
|
|
|
fi
|