Skip to content

Generate UniFFI bindings in CI #404

Generate UniFFI bindings in CI

Generate UniFFI bindings in CI #404

Workflow file for this run

name: Build
on:
push:
branches:
- release/*
- feature/*
- develop
- main
pull_request:
branches:
- release/*
- feature/*
- develop
- main
jobs:
build:
runs-on: macos-latest
continue-on-error: true
strategy:
matrix:
build-target:
# radix-engine-toolkit Crate
- crate: radix-engine-toolkit
target-triple: aarch64-apple-darwin
custom-linker: ""
custom-compiler: /usr/local/opt/llvm/bin/clang
custom-archiver: /usr/local/opt/llvm/bin/llvm-ar
- crate: radix-engine-toolkit
target-triple: x86_64-apple-ios
custom-linker: ""
custom-compiler: /usr/local/opt/llvm/bin/clang
custom-archiver: /usr/local/opt/llvm/bin/llvm-ar
- crate: radix-engine-toolkit
target-triple: x86_64-apple-darwin
custom-linker: ""
custom-compiler: /usr/local/opt/llvm/bin/clang
custom-archiver: /usr/local/opt/llvm/bin/llvm-ar
- crate: radix-engine-toolkit
target-triple: aarch64-apple-ios
custom-linker: ""
custom-compiler: /usr/local/opt/llvm/bin/clang
custom-archiver: /usr/local/opt/llvm/bin/llvm-ar
- crate: radix-engine-toolkit
target-triple: aarch64-apple-ios-sim
custom-linker: ""
custom-compiler: /usr/local/opt/llvm/bin/clang
custom-archiver: /usr/local/opt/llvm/bin/llvm-ar
- crate: radix-engine-toolkit
target-triple: x86_64-pc-windows-gnu
custom-linker: ""
custom-compiler: x86_64-w64-mingw32-gcc
custom-archiver: x86_64-w64-mingw32-ar
- crate: radix-engine-toolkit
target-triple: x86_64-unknown-linux-gnu
custom-linker: x86_64-unknown-linux-gnu-gcc
custom-compiler: /usr/local/opt/llvm/bin/clang
custom-archiver: /usr/local/opt/llvm/bin/llvm-ar
- crate: radix-engine-toolkit
target-triple: aarch64-unknown-linux-gnu
custom-linker: aarch64-unknown-linux-gnu-gcc
custom-compiler: aarch64-unknown-linux-gnu-gcc
custom-archiver: aarch64-unknown-linux-gnu-gcc-ar
- crate: radix-engine-toolkit
target-triple: i686-unknown-linux-gnu
custom-linker: i686-unknown-linux-gnu-gcc
custom-compiler: i686-unknown-linux-gnu-gcc
custom-archiver: i686-unknown-linux-gnu-gcc-ar
- crate: radix-engine-toolkit
target-triple: wasm32-unknown-unknown
custom-linker: ""
custom-compiler: /usr/local/opt/llvm/bin/clang
custom-archiver: /usr/local/opt/llvm/bin/llvm-ar
- crate: radix-engine-toolkit
target-triple: aarch64-linux-android
custom-linker: /usr/local/share/android-ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android21-clang
custom-compiler: /usr/local/share/android-ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android21-clang
custom-archiver: /usr/local/share/android-ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar
- crate: radix-engine-toolkit
target-triple: armv7-linux-androideabi
custom-linker: /usr/local/share/android-ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/armv7a-linux-androideabi19-clang
custom-compiler: /usr/local/share/android-ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/armv7a-linux-androideabi19-clang
custom-archiver: /usr/local/share/android-ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar
- crate: radix-engine-toolkit
target-triple: i686-linux-android
custom-linker: /usr/local/share/android-ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android19-clang
custom-compiler: /usr/local/share/android-ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android19-clang
custom-archiver: /usr/local/share/android-ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar
# radix-engine-toolkit-uniffi Crate
- crate: radix-engine-toolkit-uniffi
target-triple: aarch64-apple-darwin
custom-linker: ""
custom-compiler: /usr/local/opt/llvm/bin/clang
custom-archiver: /usr/local/opt/llvm/bin/llvm-ar
- crate: radix-engine-toolkit-uniffi
target-triple: x86_64-apple-ios
custom-linker: ""
custom-compiler: /usr/local/opt/llvm/bin/clang
custom-archiver: /usr/local/opt/llvm/bin/llvm-ar
- crate: radix-engine-toolkit-uniffi
target-triple: x86_64-apple-darwin
custom-linker: ""
custom-compiler: /usr/local/opt/llvm/bin/clang
custom-archiver: /usr/local/opt/llvm/bin/llvm-ar
- crate: radix-engine-toolkit-uniffi
target-triple: aarch64-apple-ios
custom-linker: ""
custom-compiler: /usr/local/opt/llvm/bin/clang
custom-archiver: /usr/local/opt/llvm/bin/llvm-ar
- crate: radix-engine-toolkit-uniffi
target-triple: aarch64-apple-ios-sim
custom-linker: ""
custom-compiler: /usr/local/opt/llvm/bin/clang
custom-archiver: /usr/local/opt/llvm/bin/llvm-ar
- crate: radix-engine-toolkit-uniffi
target-triple: x86_64-pc-windows-gnu
custom-linker: ""
custom-compiler: x86_64-w64-mingw32-gcc
custom-archiver: x86_64-w64-mingw32-ar
- crate: radix-engine-toolkit-uniffi
target-triple: x86_64-unknown-linux-gnu
custom-linker: x86_64-unknown-linux-gnu-gcc
custom-compiler: /usr/local/opt/llvm/bin/clang
custom-archiver: /usr/local/opt/llvm/bin/llvm-ar
- crate: radix-engine-toolkit-uniffi
target-triple: aarch64-unknown-linux-gnu
custom-linker: aarch64-unknown-linux-gnu-gcc
custom-compiler: aarch64-unknown-linux-gnu-gcc
custom-archiver: aarch64-unknown-linux-gnu-gcc-ar
- crate: radix-engine-toolkit-uniffi
target-triple: i686-unknown-linux-gnu
custom-linker: i686-unknown-linux-gnu-gcc
custom-compiler: i686-unknown-linux-gnu-gcc
custom-archiver: i686-unknown-linux-gnu-gcc-ar
- crate: radix-engine-toolkit-uniffi
target-triple: aarch64-linux-android
custom-linker: /usr/local/share/android-ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android21-clang
custom-compiler: /usr/local/share/android-ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android21-clang
custom-archiver: /usr/local/share/android-ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar
- crate: radix-engine-toolkit-uniffi
target-triple: armv7-linux-androideabi
custom-linker: /usr/local/share/android-ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/armv7a-linux-androideabi19-clang
custom-compiler: /usr/local/share/android-ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/armv7a-linux-androideabi19-clang
custom-archiver: /usr/local/share/android-ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar
- crate: radix-engine-toolkit-uniffi
target-triple: i686-linux-android
custom-linker: /usr/local/share/android-ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android19-clang
custom-compiler: /usr/local/share/android-ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android19-clang
custom-archiver: /usr/local/share/android-ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar
steps:
- uses: FranzDiebold/github-env-vars-action@v2
- name: Checkout
uses: actions/checkout@v3
- name: Install Build Dependencies
run: |
brew tap SergioBenitez/osxct
brew install llvm
brew install x86_64-unknown-linux-gnu
brew install mingw-w64
brew install --cask android-ndk
brew tap messense/macos-cross-toolchains
brew install aarch64-unknown-linux-gnu
brew install i686-unknown-linux-gnu
- name: Install Rust Toolchain
run: |
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs -o rustup.sh
chmod +x rustup.sh
./rustup.sh -y
rustup update
rustup toolchain install nightly
- name: Install Rust Targets
run: |
rustup target install ${{ matrix.build-target.target-triple }}
rustup +nightly target install ${{ matrix.build-target.target-triple }}
rustup component add rust-src --toolchain nightly-x86_64-apple-darwin
- name: Building Toolkit
run: |
(
export CURRENT_DIRECTORY=$(pwd)
export CRATE_PATH="$CURRENT_DIRECTORY/${{matrix.build-target.crate}}"
cd $CRATE_PATH
export LINKER_ENVIRONMENT_VARIABLE="CARGO_TARGET_"$(echo ${{ matrix.build-target.target-triple }} | tr '[:lower:]' '[:upper:]' | sed 's/-/_/g')"_LINKER"
if [ ! -z "${{ matrix.build-target.custom-linker }}" ]
then
export $LINKER_ENVIRONMENT_VARIABLE=${{ matrix.build-target.custom-linker }}
fi
export CC=${{ matrix.build-target.custom-compiler }}
export AR=${{ matrix.build-target.custom-archiver }}
cargo +nightly build \
-Z build-std=std,panic_abort \
-Z build-std-features=panic_immediate_abort \
--target ${{ matrix.build-target.target-triple }} \
--release
unset $LINKER_ENVIRONMENT_VARIABLE
export CC="/usr/local/opt/llvm/bin/clang"
export AR="/usr/local/opt/llvm/bin/llvm-ar"
if [ "${{matrix.build-target.crate}}" == "radix-engine-toolkit" ]; then
INCLUDE_DIRECTORY_PATH="$CRATE_PATH/target/${{ matrix.build-target.target-triple }}/release/include"
mkdir $INCLUDE_DIRECTORY_PATH
rustup default nightly
cbindgen \
--lang c \
--config cbindgen.toml \
--output "$INCLUDE_DIRECTORY_PATH/libradix_engine_toolkit.h"
rustup default stable
echo "module RadixEngineToolkit {" > "$INCLUDE_DIRECTORY_PATH/module.modulemap"
echo " umbrella header \"libradix_engine_toolkit.h\"" >> "$INCLUDE_DIRECTORY_PATH/module.modulemap"
echo " export *" >> "$INCLUDE_DIRECTORY_PATH/module.modulemap"
echo "}" >> "$INCLUDE_DIRECTORY_PATH/module.modulemap"
fi
(
BUILD_PATH="$CRATE_PATH/target/${{ matrix.build-target.target-triple }}/release"
cd $BUILD_PATH
BUILD_ARTIFACTS_PATH=$(find . -type f \( -name "*.a" -o -name "*.dylib" -o -name "*.dll" -o -name "*.so" -o -name "*.d" -o -name "*.wasm" \) -maxdepth 1)
if [ "${{matrix.build-target.crate}}" == "radix-engine-toolkit" ]; then
tar -czf "./${{ matrix.build-target.target-triple }}.tar.gz" $BUILD_ARTIFACTS_PATH ./include
else
tar -czf "./${{ matrix.build-target.target-triple }}.tar.gz" $BUILD_ARTIFACTS_PATH
fi
)
)
- name: Upload Build Artifacts
uses: actions/upload-artifact@v3
with:
name: "${{ matrix.build-target.crate }}-${{ matrix.build-target.target-triple }}.tar.gz"
path: "./${{matrix.build-target.crate}}/target/${{ matrix.build-target.target-triple }}/release/${{ matrix.build-target.target-triple }}.tar.gz"
create-uniffi-bindings:
needs: [build]
runs-on: macos-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- uses: actions/download-artifact@v3
with:
path: artifacts
- name: Extracting the Library
run: tar -xvzf radix-engine-toolkit-uniffi-x86_64-apple-darwin.tar.gz --directory="extracted"
working-directory: artifacts
- name: Generate the Bindings
run: |
cargo run \
--manifest-path="../../uniffi-bindgen/Cargo.toml" -- \
generate ../../radix-engine-toolkit-uniffi/src/radix_engine_toolkit_uniffi.udl \
--language swift \
--out-dir ./output \
--lib-file ./libradix_engine_toolkit_uniffi.a
cargo run \
--manifest-path="../../uniffi-bindgen/Cargo.toml" -- \
generate ../../radix-engine-toolkit-uniffi/src/radix_engine_toolkit_uniffi.udl \
--language kotlin \
--out-dir ./output \
--lib-file ./libradix_engine_toolkit_uniffi.a
working-directory: artifacts/extracted
- name: Compress Artifacts
run: |
tar -czf "./UniFFI-Bindings.tar.gz" ./output
working-directory: artifacts/extracted
- name: Upload Bindings
uses: actions/upload-artifact@v3
with:
name: "UniFFI-Bindings.tar.gz"
path: "./artifacts/extracted/UniFFI-Bindings.tar.gz"
build-xc-framework:
needs: [build]
runs-on: macos-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- uses: actions/download-artifact@v3
with:
path: artifacts
- name: Extract Artifacts
working-directory: artifacts
run: |
mkdir native
for d in radix-engine-toolkit-*.tar.gz; do
mv ./$d/* ./native/
done
cd native
for f in *.tar.gz; do
fn=`echo "$f" | cut -d'.' -f 1`
mkdir "$fn"
tar -xvzf "$f" --directory="$fn";
done
- name: Building XCFramework
working-directory: artifacts
run: |
cd native
# The name of the crate that we are building
CRATE_NAME="radix-engine-toolkit"
# Creating the two directories where the temporary FAT libraries will be stored
mkdir ./macos-arm64_x86_64/
mkdir ./ios-simulator-arm64_x86_64
# Creating the fat libraries
lipo -create \
"./aarch64-apple-darwin/libradix_engine_toolkit.a" \
"./x86_64-apple-darwin/libradix_engine_toolkit.a" \
-o "./macos-arm64_x86_64/libradix_engine_toolkit.a"
lipo -create \
"./aarch64-apple-ios-sim/libradix_engine_toolkit.a" \
"./x86_64-apple-ios/libradix_engine_toolkit.a" \
-o "./ios-simulator-arm64_x86_64/libradix_engine_toolkit.a"
# Copying the "include" directory from its origin into the fat library directory
cp -r ./aarch64-apple-darwin/include ./macos-arm64_x86_64/
cp -r ./aarch64-apple-ios-sim/include ./ios-simulator-arm64_x86_64/
# Creating the XC Framework
xcodebuild -create-xcframework \
-library "./aarch64-apple-ios/libradix_engine_toolkit.a" \
-headers "./aarch64-apple-ios/include" \
-library "./macos-arm64_x86_64/libradix_engine_toolkit.a" \
-headers "./macos-arm64_x86_64/include" \
-library "./ios-simulator-arm64_x86_64/libradix_engine_toolkit.a" \
-headers "./ios-simulator-arm64_x86_64/include" \
-output "./RadixEngineToolkit.xcframework"
tar -czf "./RadixEngineToolkit.xcframework.tar.gz" ./RadixEngineToolkit.xcframework
- name: Upload Build Artifacts
uses: actions/upload-artifact@v3
with:
name: "RadixEngineToolkit.xcframework.tar.gz"
path: "./artifacts/native/RadixEngineToolkit.xcframework.tar.gz"
- name: Building UniFFI XCFramework
working-directory: artifacts
run: |
cd native
# The name of the crate that we are building
CRATE_NAME="radix-engine-toolkit-uniffi"
# Creating the two directories where the temporary FAT libraries will be stored
mkdir ./macos-arm64_x86_64/
mkdir ./ios-simulator-arm64_x86_64
# Creating the fat libraries
lipo -create \
"./aarch64-apple-darwin/libradix_engine_toolkit_uniffi.a" \
"./x86_64-apple-darwin/libradix_engine_toolkit_uniffi.a" \
-o "./macos-arm64_x86_64/libradix_engine_toolkit_uniffi.a"
lipo -create \
"./aarch64-apple-ios-sim/libradix_engine_toolkit_uniffi.a" \
"./x86_64-apple-ios/libradix_engine_toolkit_uniffi.a" \
-o "./ios-simulator-arm64_x86_64/libradix_engine_toolkit_uniffi.a"
# Copying the "include" directory from its origin into the fat library directory
cp -r ./aarch64-apple-darwin/include ./macos-arm64_x86_64/
cp -r ./aarch64-apple-ios-sim/include ./ios-simulator-arm64_x86_64/
# Creating the XC Framework
xcodebuild -create-xcframework \
-library "./aarch64-apple-ios/libradix_engine_toolkit_uniffi.a" \
-headers "./aarch64-apple-ios/include" \
-library "./macos-arm64_x86_64/libradix_engine_toolkit_uniffi.a" \
-headers "./macos-arm64_x86_64/include" \
-library "./ios-simulator-arm64_x86_64/libradix_engine_toolkit_uniffi.a" \
-headers "./ios-simulator-arm64_x86_64/include" \
-output "./RadixEngineToolkitUniffi.xcframework"
tar -czf "./RadixEngineToolkitUniffi.xcframework.tar.gz" ./RadixEngineToolkitUniffi.xcframework
- name: Upload Build Artifacts
uses: actions/upload-artifact@v3
with:
name: "RadixEngineToolkitUniffi.xcframework.tar.gz"
path: "./artifacts/native/RadixEngineToolkitUniffi.xcframework.tar.gz"
build-test-kit:
needs: [build]
runs-on: macos-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Run Generator
run: cargo run
working-directory: generator
- name: Compress Generated
run: tar -czf "./test-kit.tar.gz" ./output
working-directory: generator
- name: Upload Generated Artifacts
uses: actions/upload-artifact@v3
with:
name: "test-kit.tar.gz"
path: "./generator/test-kit.tar.gz"
publish-csharp-nuget:
needs: [build]
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- uses: actions/download-artifact@v3
with:
path: artifacts
- name: Extract Artifacts
working-directory: artifacts
run: |
mkdir native
for d in radix-engine-toolkit-*.tar.gz; do
mv ./$d/* ./native/
done
cd native
for f in *.tar.gz; do
fn=`echo "$f" | cut -d'.' -f 1`
mkdir "$fn"
tar -xvzf "$f" --directory="$fn";
done
- name: Setup .NET SDK
uses: actions/setup-dotnet@5a3fa01c67e60dba8f95e2878436c7151c4b5f01
with:
dotnet-version: 7.0.x
- name: Configure Version
run: |
CI_RUN_NUMBER=${{ github.run_number }}
GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD | sed 's/\//-/g')
GIT_COMMIT=$(git log -1 --format=%h )
CORE_VERSION=$(cat radix-engine-toolkit-core/Cargo.toml | grep -e '^version' | cut -d'"' -f 2)
VERSION_SUFFIX=build.${CI_RUN_NUMBER}
VERSION=${CORE_VERSION}-${VERSION_SUFFIX}
if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then
VERSION=${CORE_VERSION}
fi
sed -i "s/\(<version>\)[^<>]*\(<\/version>\)/\1$VERSION\2/g" interop/csharp/RadixDlt.RadixEngineToolkit.Native.nuspec
echo "Configured Version: $VERSION"
- name: NuGet Pack
working-directory: interop/csharp
run: nuget pack
- name: Publish Packages
working-directory: interop/csharp
run: dotnet nuget push RadixDlt.RadixEngineToolkit.Native.*.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.NUGET_ORG_API_KEY }}