name: Build Native Plugin
on:
push:
branches: [main]
env:
CARGO_TERM_COLOR: always
PLUGINS: Packages/com.farukcan.ratatui.unity/Plugins
jobs:
build-macos-ios:
name: macOS + iOS
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust targets
run: |
rustup target add \
aarch64-apple-darwin x86_64-apple-darwin \
aarch64-apple-ios x86_64-apple-ios \
aarch64-apple-ios-sim
- name: Cache Cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock', '.cargo/config.toml', 'rust-toolchain.toml') }}
- name: Build macOS Universal
run: |
cargo build --release --target aarch64-apple-darwin
cargo build --release --target x86_64-apple-darwin
mkdir -p $PLUGINS/macOS
lipo -create \
target/aarch64-apple-darwin/release/libratatui_unity.dylib \
target/x86_64-apple-darwin/release/libratatui_unity.dylib \
-output $PLUGINS/macOS/libratatui_unity.bundle
- name: Build iOS XCFramework
run: |
cargo build --release --target aarch64-apple-ios
cargo build --release --target x86_64-apple-ios
cargo build --release --target aarch64-apple-ios-sim
lipo -create \
target/x86_64-apple-ios/release/libratatui_unity.a \
target/aarch64-apple-ios-sim/release/libratatui_unity.a \
-output target/libratatui_unity_sim.a
xcodebuild -create-xcframework \
-library target/aarch64-apple-ios/release/libratatui_unity.a \
-library target/libratatui_unity_sim.a \
-output $PLUGINS/iOS/ratatui_unity.xcframework
- uses: actions/upload-artifact@v4
with:
name: plugin-macos-ios
path: |
${{ env.PLUGINS }}/macOS/
${{ env.PLUGINS }}/iOS/
build-windows:
name: Windows x86_64
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust target
run: rustup target add x86_64-pc-windows-msvc
- name: Cache Cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock', '.cargo/config.toml', 'rust-toolchain.toml') }}
- name: Build Windows DLL
run: |
cargo build --release --target x86_64-pc-windows-msvc
New-Item -ItemType Directory -Force -Path "$env:PLUGINS\Windows\x86_64"
Copy-Item "target\x86_64-pc-windows-msvc\release\ratatui_unity.dll" `
"$env:PLUGINS\Windows\x86_64\"
- uses: actions/upload-artifact@v4
with:
name: plugin-windows
path: ${{ env.PLUGINS }}/Windows/
build-linux-android:
name: Linux x86_64 + Android
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install cross
env:
RUSTUP_TOOLCHAIN: stable
run: cargo install cross --git https://github.com/cross-rs/cross
- name: Install Rust targets
run: |
rustup target add \
x86_64-unknown-linux-gnu \
aarch64-linux-android \
armv7-linux-androideabi \
x86_64-linux-android
- name: Cache Cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock', '.cargo/config.toml', 'rust-toolchain.toml') }}
- name: Build Linux
run: |
cross build --release --target x86_64-unknown-linux-gnu
mkdir -p $PLUGINS/Linux/x86_64
cp target/x86_64-unknown-linux-gnu/release/libratatui_unity.so \
$PLUGINS/Linux/x86_64/
- name: Setup Android NDK
uses: android-actions/setup-android@v3
- name: Build Android
run: |
NDK_BIN="$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin"
CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER="$NDK_BIN/aarch64-linux-android30-clang" \
cargo build --release --target aarch64-linux-android
CARGO_TARGET_ARMV7_LINUX_ANDROIDEABI_LINKER="$NDK_BIN/armv7a-linux-androideabi30-clang" \
cargo build --release --target armv7-linux-androideabi
CARGO_TARGET_X86_64_LINUX_ANDROID_LINKER="$NDK_BIN/x86_64-linux-android30-clang" \
cargo build --release --target x86_64-linux-android
mkdir -p \
$PLUGINS/Android/libs/arm64-v8a \
$PLUGINS/Android/libs/armeabi-v7a \
$PLUGINS/Android/libs/x86_64
cp target/aarch64-linux-android/release/libratatui_unity.so $PLUGINS/Android/libs/arm64-v8a/
cp target/armv7-linux-androideabi/release/libratatui_unity.so $PLUGINS/Android/libs/armeabi-v7a/
cp target/x86_64-linux-android/release/libratatui_unity.so $PLUGINS/Android/libs/x86_64/
- uses: actions/upload-artifact@v4
with:
name: plugin-linux-android
path: |
${{ env.PLUGINS }}/Linux/
${{ env.PLUGINS }}/Android/
build-webgl:
name: WebGL (Emscripten)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Emscripten
uses: mymindstorm/setup-emsdk@v14
- name: Install Rust target
run: rustup target add wasm32-unknown-emscripten
- name: Cache Cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-webgl-cargo-${{ hashFiles('**/Cargo.lock', '.cargo/config.toml', 'rust-toolchain.toml') }}
- name: Build WebGL
run: |
EMCC_CFLAGS="-O3" cargo rustc --release --target wasm32-unknown-emscripten --crate-type staticlib
mkdir -p $PLUGINS/WebGL
cp target/wasm32-unknown-emscripten/release/libratatui_unity.a $PLUGINS/WebGL/
- uses: actions/upload-artifact@v4
with:
name: plugin-webgl
path: ${{ env.PLUGINS }}/WebGL/
publish-latest:
name: Publish latest branch
needs: [build-macos-ios, build-windows, build-linux-android, build-webgl]
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: artifacts/
- name: Merge native plugins into package
run: |
cp -r artifacts/plugin-macos-ios/. "$PLUGINS/"
mkdir -p "$PLUGINS/Windows"
cp -r artifacts/plugin-windows/. "$PLUGINS/Windows/"
cp -r artifacts/plugin-linux-android/. "$PLUGINS/"
mkdir -p "$PLUGINS/WebGL"
cp -r artifacts/plugin-webgl/. "$PLUGINS/WebGL/"
- name: Force push latest branch
run: |
cd "Packages/com.farukcan.ratatui.unity"
git init -b latest
git add -A
git -c user.name="github-actions[bot]" \
-c user.email="github-actions[bot]@users.noreply.github.com" \
commit -m "Build from ${GITHUB_SHA::8}"
git remote add origin \
"https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git"
git push --force origin latest