Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 34 additions & 9 deletions bdk-swift/build-xcframework-dev.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@

set -euo pipefail

HEADERPATH="Sources/BitcoinDevKit/BitcoinDevKitFFI.h"
MODMAPPATH="Sources/BitcoinDevKit/BitcoinDevKitFFI.modulemap"
HEADER_BASENAME="BitcoinDevKitFFI"
TARGETDIR="../bdk-ffi/target"
OUTDIR="."
NAME="bdkffi"
STATIC_LIB_NAME="lib${NAME}.a"
NEW_HEADER_DIR="../bdk-ffi/target/include"
PROFILE_DIR="debug"
SWIFT_OUT_DIR="../bdk-swift/Sources/BitcoinDevKit"
HEADER_OUT_DIR="${NEW_HEADER_DIR}/${HEADER_BASENAME}"

HOST_ARCH=$(uname -m)
if [ "$HOST_ARCH" = "arm64" ]; then
Expand All @@ -30,18 +31,42 @@ cargo build --package bdk-ffi --target "$MAC_TARGET"
cargo build --package bdk-ffi --target "$IOS_SIM_TARGET"
cargo build --package bdk-ffi --target "$IOS_DEVICE_TARGET"

UNIFFI_LIBRARY_PATH="./target/$IOS_DEVICE_TARGET/$PROFILE_DIR/lib${NAME}.dylib"
cargo run --bin uniffi-bindgen generate \
--library "./target/$IOS_DEVICE_TARGET/$PROFILE_DIR/lib${NAME}.dylib" \
--library "${UNIFFI_LIBRARY_PATH}" \
--language swift \
--out-dir ../bdk-swift/Sources/BitcoinDevKit \
--out-dir "${SWIFT_OUT_DIR}" \
--no-format

cd ../bdk-swift/ || exit
# Final xcframework structure (per-arch):
# Headers/
# <ModuleName>/
# <ModuleName>.h
# module.modulemap
rm -rf "${NEW_HEADER_DIR:?}"/*
rm -rf "${HEADER_OUT_DIR:?}"
mkdir -p "${HEADER_OUT_DIR}"
cargo run --bin uniffi-bindgen generate \
--library "${UNIFFI_LIBRARY_PATH}" \
--language swift \
--out-dir "${HEADER_OUT_DIR}" \
--no-format

# Keep the header output directory clean: xcframework headers should only contain .h + module.modulemap
find "${HEADER_OUT_DIR}" -maxdepth 1 -name '*.swift' -delete

mkdir -p "$NEW_HEADER_DIR"
mv "$HEADERPATH" "$NEW_HEADER_DIR"
mv "$MODMAPPATH" "$NEW_HEADER_DIR/module.modulemap"
echo >> "$NEW_HEADER_DIR/module.modulemap"
# Uniffi emits <basename>.modulemap; rename it to module.modulemap (expected by Apple toolchains)
if [ -f "${HEADER_OUT_DIR}/${HEADER_BASENAME}.modulemap" ]; then
mv "${HEADER_OUT_DIR}/${HEADER_BASENAME}.modulemap" "${HEADER_OUT_DIR}/module.modulemap"
fi

echo -e "\n" >> "${HEADER_OUT_DIR}/module.modulemap"

# Keep Swift sources clean: only .swift files should stay in the package Sources dir
rm -f "${SWIFT_OUT_DIR}/${HEADER_BASENAME}.h"
rm -f "${SWIFT_OUT_DIR}/${HEADER_BASENAME}.modulemap"

cd ../bdk-swift/ || exit

rm -rf "${OUTDIR}/${NAME}.xcframework"

Expand Down
38 changes: 29 additions & 9 deletions bdk-swift/build-xcframework.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,15 @@
# The results of this script can be used for locally testing your SPM package adding a local package
# to your application pointing at the bdk-swift directory.

HEADERPATH="Sources/BitcoinDevKit/BitcoinDevKitFFI.h"
MODMAPPATH="Sources/BitcoinDevKit/BitcoinDevKitFFI.modulemap"
HEADER_BASENAME="BitcoinDevKitFFI"
TARGETDIR="../bdk-ffi/target"
OUTDIR="."
RELDIR="release-smaller"
NAME="bdkffi"
STATIC_LIB_NAME="lib${NAME}.a"
NEW_HEADER_DIR="../bdk-ffi/target/include"
SWIFT_OUT_DIR="../bdk-swift/Sources/BitcoinDevKit"
HEADER_OUT_DIR="${NEW_HEADER_DIR}/${HEADER_BASENAME}"

cd ../bdk-ffi/ || exit

Expand All @@ -30,7 +31,32 @@ cargo build --package bdk-ffi --profile release-smaller --target aarch64-apple-i
cargo build --package bdk-ffi --profile release-smaller --target aarch64-apple-ios-sim

# build bdk-ffi Swift bindings and put in bdk-swift Sources
cargo run --bin uniffi-bindgen generate --library ./target/aarch64-apple-ios/release-smaller/libbdkffi.dylib --language swift --out-dir ../bdk-swift/Sources/BitcoinDevKit --no-format
UNIFFI_LIBRARY_PATH="./target/aarch64-apple-ios/${RELDIR}/lib${NAME}.dylib"
cargo run --bin uniffi-bindgen generate --library "${UNIFFI_LIBRARY_PATH}" --language swift --out-dir "${SWIFT_OUT_DIR}" --no-format

# Final xcframework structure (per-arch):
# Headers/
# <ModuleName>/
# <ModuleName>.h
# module.modulemap
rm -rf "${NEW_HEADER_DIR:?}"/*
rm -rf "${HEADER_OUT_DIR:?}"
mkdir -p "${HEADER_OUT_DIR}"
cargo run --bin uniffi-bindgen generate --library "${UNIFFI_LIBRARY_PATH}" --language swift --out-dir "${HEADER_OUT_DIR}" --no-format

# Keep the header output directory clean: xcframework headers should only contain .h + module.modulemap
find "${HEADER_OUT_DIR}" -maxdepth 1 -name '*.swift' -delete

# Uniffi emits <basename>.modulemap; rename it to module.modulemap (expected by Apple toolchains)
if [ -f "${HEADER_OUT_DIR}/${HEADER_BASENAME}.modulemap" ]; then
mv "${HEADER_OUT_DIR}/${HEADER_BASENAME}.modulemap" "${HEADER_OUT_DIR}/module.modulemap"
fi

echo -e "\n" >> "${HEADER_OUT_DIR}/module.modulemap"

# Keep Swift sources clean: only .swift files should stay in the package Sources dir
rm -f "${SWIFT_OUT_DIR}/${HEADER_BASENAME}.h"
rm -f "${SWIFT_OUT_DIR}/${HEADER_BASENAME}.modulemap"

# combine bdk-ffi static libs for aarch64 and x86_64 targets via lipo tool
mkdir -p target/lipo-ios-sim/release-smaller
Expand All @@ -40,12 +66,6 @@ lipo target/aarch64-apple-darwin/release-smaller/libbdkffi.a target/x86_64-apple

cd ../bdk-swift/ || exit

# move bdk-ffi static lib header files to temporary directory
mkdir -p "${NEW_HEADER_DIR}"
mv "${HEADERPATH}" "${NEW_HEADER_DIR}"
mv "${MODMAPPATH}" "${NEW_HEADER_DIR}/module.modulemap"
echo -e "\n" >> "${NEW_HEADER_DIR}/module.modulemap"

# remove old xcframework directory
rm -rf "${OUTDIR}/${NAME}.xcframework"

Expand Down
Loading