From fea6a3d1ee2a62b2296b1706f0ba8da7096f05ce Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Sat, 30 Oct 2021 00:27:02 +0530 Subject: [PATCH] Add sections and more info --- README.md | 106 +++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 77 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index ae9b527..4542ab4 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,76 @@ -# BDK UniFFI Language Bindings +# Foreign language bindings for BDK (bdk-ffi) -## Setup Android build environment +This repository contains source code for generating foreign language bindings +for the rust library bdk for the Bitcoin Dev Kit (BDK) project. - 1. Add Android rust targets +## Supported target languages and platforms - ```sh - rustup target add x86_64-apple-darwin x86_64-unknown-linux-gnu x86_64-linux-android aarch64-linux-android armv7-linux-androideabi i686-linux-android - ``` +| Language | Platform | Status | +| --- | --- | --- | +| Kotlin | JVM | WIP | +| Kotlin | Android | WIP | +| Swift | iOS | WIP | - 2. Install Android SDK and Build-Tools for API level 30+ +## Getting Started -## Setup Swift build environment +This project uses rust. A basic knowledge of the rust ecosystem is helpful. - 1. install Swift, see ["Download Swift"](https://swift.org/download/) page - (or on Mac OSX install the latest Xcode) +### General +1. Install `uniffi-bindgen` + ```sh + cargo install uniffi_bindgen + ``` +1. See the [UniFFI User Guide](https://mozilla.github.io/uniffi-rs/) for more info -## Setup UniFFI +### Kotlin Bindings for JVM (OSX / Linux) - 1. `cargo install uniffi_bindgen` +1. Install required targets + ```sh + rustup target add x86_64-apple-darwin x86_64-unknown-linux-gnu + ``` +1. Build kotlin (JVM) bindings + ```sh + ./build.sh -k + ``` +1. Generated kotlin bindings are available at `/bindings/bdk-kotlin/` +1. A demo app is available at `/bindings/bdk-kotlin/demo/`. It uses stdin for +inputs and can be run from gradle. + ```sh + cd bindings/bdk-kotlin + ./gradlew :demo:run + ``` + +### Kotlin bindings for Android + +1. Install required targets + ```sh + rustup target add x86_64-linux-android aarch64-linux-android + armv7-linux-androideabi i686-linux-android + ``` +1. Install Android SDK and Build-Tools for API level 30+ +1. Setup `$ANDROID_NDK_HOME` and `$ANDROID_SDK_ROOT` path variables (which are +required by the build scripts) +1. Build kotlin (Android) bindings + ```sh + ./build.sh -a + ``` +2. A demo android app is available at [notmandatory/bdk-sample-app](https://github.com/notmandatory/bitcoindevkit-android-sample-app/tree/upgrade-to-bdk-ffi/) + +## Swift bindings for iOS + +1. Install the latest version of xcode, download and install the advanced tools. +1. Ensure Swift is installed +1. Install required targets + ```sh + rustup target add aarch64-apple-ios x86_64-apple-ios + ``` +1. Build swift (iOS) bindings + ```sh + ./build.sh -s + ``` +1. Example iOS app can be found in `/examples/iOS` which can be run by xcode. + +## Notes ## Adding new structs and functions @@ -25,27 +78,22 @@ See the [UniFFI User Guide](https://mozilla.github.io/uniffi-rs/) ### For pass by value objects - 1. create new rust struct with only fields that are supported UniFFI types - 2. update mapping `bdk.udl` file with new `dictionary` +1. create new rust struct with only fields that are supported UniFFI types +1. update mapping `bdk.udl` file with new `dictionary` ### For pass by reference values - 1. create wrapper rust struct/impl with only fields that are `Sync + Send` - 2. update mapping `bdk.udl` file with new `interface` +1. create wrapper rust struct/impl with only fields that are `Sync + Send` +1. update mapping `bdk.udl` file with new `interface` -### Build and test +## Goals - 1. Use `build.sh` script (TODO do it all in build.rs instead) - 2. Create tests in `bindings/bdk-kotlin` and/or `bindings/bdk-swift` - 3. Use `test.sh` to run all bindings tests +1. Language bindings should feel idiomatic in target languages/platforms +1. Adding new targets should be easy +1. Getting up and running should be easy +1. Contributing should be easy +1. Get it right, then automate -### Run kotlin demo application - -We have a kotlin demo console application which uses bdk. -It uses stdin for inputs and can be run from gradle. - -```sh -cd bindings/bdk-kotlin -./gradlew :demo:run -``` +## Thanks +This project is made possible thanks to the wonderful work on [mozilla/uniffi-rs](https://github.com/mozilla/uniffi-rs)