Flutter uniFFI (#510)

* Flutter uniffi

* Set on-demand resources

* Do not build non-uniffi libraries

* Change iosLibName

* Add BreezSDKLiquid as on demand resources

* Use downloaded framework

* Add Sources to published flutter package

* Set OTHER_LDFLAGS

* Add logging

* Refactor library initialization logic and throw an error if initialization fails

* Do not statically link framework on production

* Use uniFFI headers to generate FlutterBreezLiquidBindings

* Re add frb header

* Correct the library name

* Remove static_framework

* Move source header files

* Copy iOS podspecs to macOS folder

* Update version of macOS podspecs

* Remove Windows & Linux support

* Remove CMake scripts

* Remove breez_sdk_liquid.podspec from version script

* Cleanup older build scripts used by melos & just recipes

* Remove softlink & copy recipes

Add recipe descriptions

* Rename link-uniffi recipe to link-headers

Make sure headers are linked after uniffi is built
  - Remove just gen recipe
Add recipe descriptions

* Set package versions on production files as well when publishing

* Include bindings project on melos script hooks

* Flutter uniffi

* Set on-demand resources

* Do not build non-uniffi libraries

* Change iosLibName

* Add BreezSDKLiquid as on demand resources

* Use downloaded framework

* Add Sources to published flutter package

* Set OTHER_LDFLAGS

* Add logging

* Refactor library initialization logic and throw an error if initialization fails

* Do not statically link framework on production

* Use uniFFI headers to generate FlutterBreezLiquidBindings

* Re add frb header

* Correct the library name

* Remove static_framework

* Move source header files

* Copy iOS podspecs to macOS folder

* Update version of macOS podspecs

* Remove Windows & Linux support

* Remove CMake scripts

* Remove breez_sdk_liquid.podspec from version script

* Cleanup older build scripts used by melos & just recipes

* Remove softlink & copy recipes

Add recipe descriptions

* Rename link-uniffi recipe to link-headers

Make sure headers are linked after uniffi is built
  - Remove just gen recipe
Add recipe descriptions

* Set package versions on production files as well when publishing

* Include bindings project on melos script hooks

* chore: just version

* fix: remove unused files on "Set package version" step

* copy FFI header files

* [WIP] Add macOS support

* remove example app on Flutter plugin

* Link headers before running ffigen on CI workflow

* macOS: add macos/Sources folder to .gitignore

.

* macOS: Copy iOS sources to macOS sources after downloading bindings

* macOS: copy sources & framework file to macos folder on build-uniffi-swift script

* import breez_sdk_liquidFFI header on plugin file

Update flutter_breez_liquid.c

* cleanup header file artifacts

---------

Co-authored-by: Ross Savage <hello@satimoto.com>
This commit is contained in:
Erdem Yerebasmaz
2024-10-01 10:59:11 +03:00
committed by GitHub
parent 8374a1812d
commit f6fa503cb9
197 changed files with 2949 additions and 7953 deletions

View File

@@ -1,133 +0,0 @@
name: Build bindings for Flutter
on:
workflow_dispatch:
inputs:
ref:
description: 'commit/tag/branch reference'
required: true
type: string
workflow_call:
inputs:
repository:
description: 'sdk repository, defaults to current repository'
required: false
type: string
ref:
description: 'commit/tag/branch reference'
required: true
type: string
use-dummy-binaries:
description: 'If true, creates dummy binaries rather than real binaries'
required: false
type: boolean
default: false
jobs:
setup:
if: ${{ !inputs.use-dummy-binaries }}
runs-on: macOS-latest
name: Setup
steps:
- name: Disk Cleanup
run: |
echo "::group::Free space before cleanup"
df -hI
echo "::endgroup::"
echo "::group::Cleaned Files"
sudo rm -rf /Applications/Xcode_14.3.1.app
sudo rm -rf /Applications/Xcode_15.0.1.app
sudo rm -rf /Applications/Xcode_15.1.app
sudo rm -rf /Applications/Xcode_15.2.app
sudo rm -rf /Applications/Xcode_15.3.app
echo "::endgroup::"
echo "::group::Free space after cleanup"
df -hI
echo "::endgroup::"
build:
if: ${{ !inputs.use-dummy-binaries }}
needs: setup
runs-on: macOS-latest
name: Build Flutter bindings
steps:
- name: checkout
uses: actions/checkout@v4
with:
ref: ${{ inputs.ref }}
repository: ${{ inputs.repository || github.repository }}
- name: Install Protoc
uses: arduino/setup-protoc@v3
with:
version: "27.2"
repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: Install Zig
uses: goto-bus-stop/setup-zig@v2
- uses: Swatinem/rust-cache@v2
with:
workspaces: lib
- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
channel: stable
flutter-version: 3.22.3 # Pinned until resource linking issues on Android is resolved with 3.24
- run: flutter --version
- name: Set up just
uses: extractions/setup-just@v2
- name: Set up Melos
uses: bluefireteam/melos-action@v3
with:
run-bootstrap: false
- name: Initialize the workspace
working-directory: lib/bindings/langs/flutter/
run: |
just clean
just init
- name: Install flutter_rust_bridge_codegen dependencies
working-directory: lib/bindings/langs/flutter/
run: just frb
- name: Build bindings
working-directory: lib/bindings/langs/flutter/
run: just build
- name: Build language packages
working-directory: lib/bindings/langs/flutter/
run: |
melos build-apple
melos build-android
- name: Copy build output
run: |
mkdir -p dist
cp lib/bindings/langs/flutter/platform-build/android.tar.gz dist
cp lib/bindings/langs/flutter/platform-build/breez_sdk_liquid.xcframework.zip dist
- name: Archive Flutter bindings
uses: actions/upload-artifact@v4
with:
name: bindings-flutter
path: dist/*
build-dummies:
if: ${{ inputs.use-dummy-binaries }}
runs-on: macOS-latest
name: Build Flutter dummy bindings
steps:
- name: Create dummy files
run: |
touch android.tar.gz
touch breez_sdk_liquid.xcframework.zip
- name: Archive Flutter dummy bindings
uses: actions/upload-artifact@v4
with:
name: bindings-flutter
path: ./*

View File

@@ -200,6 +200,11 @@ jobs:
working-directory: lib/bindings/langs/flutter/
run: just codegen
- name: Link C Headers
working-directory: lib/bindings/langs/flutter/
if: ${{ success() || failure() }}
run: just link-headers
- name: Generate FFI bindings
working-directory: lib/bindings/langs/flutter/
if: ${{ success() || failure() }}

View File

@@ -98,11 +98,10 @@ jobs:
bindings-windows: ${{ !!needs.pre-setup.outputs.csharp-package-version || !!needs.pre-setup.outputs.golang-package-version || !!needs.pre-setup.outputs.python-package-version }}
bindings-darwin: ${{ !!needs.pre-setup.outputs.csharp-package-version || !!needs.pre-setup.outputs.golang-package-version || !!needs.pre-setup.outputs.python-package-version || !!needs.pre-setup.outputs.swift-package-version }}
bindings-linux: ${{ !!needs.pre-setup.outputs.csharp-package-version || !!needs.pre-setup.outputs.golang-package-version || !!needs.pre-setup.outputs.python-package-version }}
bindings-flutter: ${{ !!needs.pre-setup.outputs.flutter-package-version }}
bindings-android: ${{ !!needs.pre-setup.outputs.kotlin-multiplatform-package-version || !!needs.pre-setup.outputs.maven-package-version || !!needs.pre-setup.outputs.golang-package-version }}
bindings-ios: ${{ !!needs.pre-setup.outputs.kotlin-multiplatform-package-version || !!needs.pre-setup.outputs.maven-package-version || !!needs.pre-setup.outputs.swift-package-version }}
kotlin: ${{ !!needs.pre-setup.outputs.kotlin-multiplatform-package-version || !!needs.pre-setup.outputs.maven-package-version }}
swift: ${{ !!needs.pre-setup.outputs.swift-package-version }}
swift: ${{ !!needs.pre-setup.outputs.swift-package-version || !!needs.pre-setup.outputs.flutter-package-version }}
python: ${{ !!needs.pre-setup.outputs.python-package-version }}
csharp: ${{ !!needs.pre-setup.outputs.csharp-package-version }}
golang: ${{ !!needs.pre-setup.outputs.golang-package-version }}
@@ -152,15 +151,6 @@ jobs:
ref: ${{ needs.setup.outputs.ref }}
use-dummy-binaries: ${{ needs.setup.outputs.use-dummy-binaries == 'true' }}
build-bindings-flutter:
needs: setup
if: ${{ needs.setup.outputs.bindings-flutter == 'true' }}
uses: ./.github/workflows/build-bindings-flutter.yml
with:
repository: ${{ needs.setup.outputs.repository }}
ref: ${{ needs.setup.outputs.ref }}
use-dummy-binaries: ${{ needs.setup.outputs.use-dummy-binaries == 'true' }}
build-bindings-android:
needs: setup
if: ${{ needs.setup.outputs.bindings-android == 'true' }}
@@ -275,7 +265,7 @@ jobs:
publish-flutter:
needs:
- setup
- build-bindings-flutter
- build-language-bindings
- publish-dart
if: ${{ needs.setup.outputs.flutter == 'true' }}
uses: ./.github/workflows/publish-flutter.yml

View File

@@ -57,14 +57,19 @@ jobs:
run: |
rm -rf android
rm -rf ios
rm -rf macos
rm -rf lib
cp -r ../build/packages/flutter/android .
cp -r ../build/packages/flutter/ios .
cp -r ../build/packages/flutter/macos .
mv android/build.gradle.production android/build.gradle
mv ios/flutter_breez_liquid.podspec.production ios/flutter_breez_liquid.podspec
rm ios/breez_sdk_liquid.podspec
mv macos/flutter_breez_liquid.podspec.production macos/flutter_breez_liquid.podspec
cp -r ../build/packages/flutter/lib .
cp -r ../build/lib/bindings/langs/flutter/breez_sdk_liquid/include/breez_sdk_liquid.h ios/Classes
cp -r ../build/lib/bindings/langs/flutter/breez_sdk_liquid/include/breez_sdk_liquid.h macos/Classes
cp -r ../build/lib/bindings/langs/flutter/breez_sdk_liquidFFI/include/breez_sdk_liquidFFI.h ios/Classes
cp -r ../build/lib/bindings/langs/flutter/breez_sdk_liquidFFI/include/breez_sdk_liquidFFI.h macos/Classes
cp ../build/packages/flutter/analysis_options.yaml .
cp ../build/packages/flutter/pubspec.yaml .
cp ../build/packages/flutter/pubspec_overrides.yaml .
@@ -78,8 +83,19 @@ jobs:
- uses: actions/download-artifact@v4
with:
name: bindings-flutter
path: bindings/
name: bindings-swift
path: dist/ios/Sources/BreezSDKLiquid/
- name: Cleanup header file artifacts
working-directory: dist/ios/Sources/BreezSDKLiquid/
run: |
rm breez_sdk_liquidFFI.h
rm breez_sdk_liquidFFI.modulemap
- name: Copy iOS sources to macOS sources
working-directory: dist
run: |
cp -r ios/Sources/ macos/Sources/
- name: Set package version
working-directory: dist
@@ -87,15 +103,15 @@ jobs:
sed -i.bak -e 's/version:.*/version: ${{ inputs.package-version }}/' pubspec.yaml
sed -i.bak -e 's/path:.*/git:\n url: git@github.com:breez\/breez-sdk-liquid-dart.git\n ref: ${{ inputs.package-version }}/' pubspec_overrides.yaml
sed -i.bak -e "s/^version .*/version '${{ inputs.package-version }}'/" android/build.gradle
sed -i.bak -e 's/set(TagName.*/set(TagName "v${{ inputs.package-version }}")/' android/CMakeLists.txt
sed -i.bak -e "s/^version = .*/version = '${{ inputs.package-version }}'/" ios/flutter_breez_liquid.podspec
sed -i.bak -e "s/^version = .*/version = '${{ inputs.package-version }}'/" macos/flutter_breez_liquid.podspec
rm pubspec.yaml.bak
rm pubspec_overrides.yaml.bak
rm android/build.gradle.bak
rm android/CMakeLists.txt.bak
rm ios/flutter_breez_liquid.podspec.bak
rm macos/flutter_breez_liquid.podspec.bak
- name: Update version number on podspec files & CMake scripts
- name: Update version number on podspec & gradle files
working-directory: build/lib/bindings/langs/flutter/
run: bash scripts/version.sh
@@ -118,16 +134,3 @@ jobs:
git push
git tag v${{ inputs.package-version }} -m "v${{ inputs.package-version }}"
git push --tags
- name: Release and attach binary artifacts
if: ${{ inputs.publish }}
uses: softprops/action-gh-release@v2
with:
repository: breez/breez-sdk-liquid-flutter
files: |
bindings/android.tar.gz
bindings/breez_sdk_liquid.xcframework.zip
tag_name: v${{ inputs.package-version || '0.0.1' }}
generate_release_notes: false
token: ${{ secrets.SWIFT_RELEASE_TOKEN }}
prerelease: true