name: CI on: [push, pull_request] jobs: build: name: Build runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] rust: [stable] lua: [lua55, lua54, lua53, lua52, lua51, luajit, luau, luau-jit, luau-vector4] include: - os: ubuntu-latest target: x86_64-unknown-linux-gnu - os: macos-latest target: aarch64-apple-darwin - os: windows-latest target: x86_64-pc-windows-msvc steps: - uses: actions/checkout@main - uses: dtolnay/rust-toolchain@stable with: toolchain: ${{ matrix.rust }} target: ${{ matrix.target }} - uses: Swatinem/rust-cache@v2 - name: Build ${{ matrix.lua }} vendored run: | cargo build --features "${{ matrix.lua }},vendored" cargo build --features "${{ matrix.lua }},vendored,async,serde,macros,anyhow,userdata-wrappers" cargo build --features "${{ matrix.lua }},vendored,async,serde,macros,anyhow,userdata-wrappers,send" shell: bash - name: Build ${{ matrix.lua }} pkg-config if: ${{ matrix.os == 'ubuntu-latest' && matrix.lua != 'lua55' }} run: | sudo apt-get update sudo apt-get install -y --no-install-recommends liblua5.4-dev liblua5.3-dev liblua5.2-dev liblua5.1-0-dev libluajit-5.1-dev cargo build --features "${{ matrix.lua }}" build_aarch64_cross_ubuntu: name: Cross-compile to aarch64-unknown-linux-gnu runs-on: ubuntu-latest needs: build strategy: matrix: lua: [lua55, lua54, lua53, lua52, lua51, luajit] steps: - uses: actions/checkout@main - uses: dtolnay/rust-toolchain@stable with: toolchain: stable target: aarch64-unknown-linux-gnu - name: Install ARM compiler toolchain run: | sudo apt-get update sudo apt-get install -y --no-install-recommends gcc-aarch64-linux-gnu libc6-dev-arm64-cross shell: bash - name: Cross-compile run: cargo build --target aarch64-unknown-linux-gnu --features "${{ matrix.lua }},vendored,async,send,serde,macros,anyhow,userdata-wrappers" shell: bash build_armv7_cross_ubuntu: name: Cross-compile to armv7-unknown-linux-gnueabihf runs-on: ubuntu-latest needs: build strategy: matrix: lua: [lua55, lua54, lua53, lua52, lua51] steps: - uses: actions/checkout@main - uses: dtolnay/rust-toolchain@stable with: toolchain: stable target: armv7-unknown-linux-gnueabihf - name: Install ARM compiler toolchain run: | sudo apt-get update sudo apt-get install -y --no-install-recommends gcc-arm-linux-gnueabihf libc-dev-armhf-cross shell: bash - name: Cross-compile run: cargo build --target armv7-unknown-linux-gnueabihf --features "${{ matrix.lua }},vendored,async,send,serde,macros,anyhow,userdata-wrappers" shell: bash test: name: Test runs-on: ${{ matrix.os }} needs: build strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] rust: [stable, nightly] lua: [lua55, lua54, lua53, lua52, lua51, luajit, luajit52, luau, luau-jit, luau-vector4] include: - os: ubuntu-latest target: x86_64-unknown-linux-gnu - os: macos-latest target: aarch64-apple-darwin - os: windows-latest target: x86_64-pc-windows-msvc steps: - uses: actions/checkout@main - uses: dtolnay/rust-toolchain@stable with: toolchain: ${{ matrix.rust }} target: ${{ matrix.target }} - uses: Swatinem/rust-cache@v2 - name: Run ${{ matrix.lua }} tests run: | cargo test --features "${{ matrix.lua }},vendored" cargo test --features "${{ matrix.lua }},vendored,async,serde,macros,anyhow,userdata-wrappers" cargo test --features "${{ matrix.lua }},vendored,async,serde,macros,anyhow,userdata-wrappers,send" shell: bash - name: Run compile tests (macos lua55) if: ${{ matrix.os == 'macos-latest' && matrix.lua == 'lua55' }} run: | TRYBUILD=overwrite cargo test --features "${{ matrix.lua }},vendored" --tests -- --ignored TRYBUILD=overwrite cargo test --features "${{ matrix.lua }},vendored,async,send,serde,macros" --tests -- --ignored shell: bash test_with_sanitizer: name: Test with address sanitizer runs-on: ${{ matrix.os }} needs: build strategy: matrix: os: [ubuntu-latest] rust: [nightly] lua: [lua55, lua54, lua53, lua52, lua51, luajit, luau, luau-jit, luau-vector4] include: - os: ubuntu-latest target: x86_64-unknown-linux-gnu steps: - uses: actions/checkout@main - uses: dtolnay/rust-toolchain@stable with: toolchain: ${{ matrix.rust }} target: ${{ matrix.target }} - uses: Swatinem/rust-cache@v2 - name: Run ${{ matrix.lua }} tests with address sanitizer run: | cargo test --tests --features "${{ matrix.lua }},vendored,async,serde,macros,anyhow" --target x86_64-unknown-linux-gnu -- --skip test_too_many_recursions cargo test --tests --features "${{ matrix.lua }},vendored,async,serde,macros,anyhow,userdata-wrappers,send" --target x86_64-unknown-linux-gnu -- --skip test_too_many_recursions shell: bash env: RUSTFLAGS: -Z sanitizer=address test_with_memory_limit: name: Test with memory limit runs-on: ${{ matrix.os }} needs: build strategy: matrix: os: [ubuntu-latest] rust: [nightly] lua: [lua55, lua54, lua53, lua52, lua51, luajit, luau, luau-jit, luau-vector4] include: - os: ubuntu-latest target: x86_64-unknown-linux-gnu steps: - uses: actions/checkout@main - uses: dtolnay/rust-toolchain@stable with: toolchain: ${{ matrix.rust }} target: ${{ matrix.target }} - uses: Swatinem/rust-cache@v2 - name: Run ${{ matrix.lua }} tests with forced memory limit run: | cargo test --tests --features "${{ matrix.lua }},vendored,async,send,serde,macros,anyhow,userdata-wrappers" shell: bash env: RUSTFLAGS: --cfg=force_memory_limit test_modules: name: Test modules runs-on: ${{ matrix.os }} needs: build strategy: matrix: os: [ubuntu-latest, macos-latest] rust: [stable] lua: [lua55, lua54, lua53, lua52, lua51, luajit] include: - os: ubuntu-latest target: x86_64-unknown-linux-gnu - os: macos-latest target: aarch64-apple-darwin steps: - uses: actions/checkout@main - uses: dtolnay/rust-toolchain@stable with: toolchain: ${{ matrix.rust }} target: ${{ matrix.target }} - uses: Swatinem/rust-cache@v2 - name: Run ${{ matrix.lua }} module tests run: | (cd tests/module && cargo build --release --features "${{ matrix.lua }}") (cd tests/module/loader && cargo test --release --features "${{ matrix.lua }},vendored") shell: bash test_modules_windows: name: Test modules on Windows runs-on: windows-latest needs: build strategy: matrix: lua: [lua54, luajit] defaults: run: shell: msys2 {0} steps: - uses: msys2/setup-msys2@v2 - uses: actions/checkout@main - name: Install Rust & Lua run: | pacman -S --noconfirm mingw-w64-x86_64-rust mingw-w64-x86_64-lua mingw-w64-x86_64-luajit mingw-w64-x86_64-pkg-config - name: Run ${{ matrix.lua }} module tests run: | (cd tests/module && cargo build --release --features "${{ matrix.lua }}") (cd tests/module/loader && cargo test --release --features "${{ matrix.lua }}") test_wasm32_emscripten: name: Test on wasm32-unknown-emscripten runs-on: ubuntu-latest needs: build strategy: matrix: lua: [lua55, lua54, lua53, lua52, lua51, luau] steps: - uses: actions/checkout@main - uses: dtolnay/rust-toolchain@stable with: toolchain: stable target: wasm32-unknown-emscripten - name: Install Emscripten run: | sudo apt-get update sudo apt-get install -y --no-install-recommends emscripten - name: Run ${{ matrix.lua }} tests run: | cargo test --tests --features "${{ matrix.lua }},vendored" cargo test --tests --features "${{ matrix.lua }},vendored,async,serde,macros,anyhow,userdata-wrappers" test_wasm32_wasip2: name: Test on wasm32-wasip2 runs-on: ubuntu-latest needs: build strategy: matrix: lua: [lua55, lua54, lua53, lua52, lua51] steps: - uses: actions/checkout@main - uses: dtolnay/rust-toolchain@stable with: toolchain: nightly-2025-10-02 target: wasm32-wasip2 - name: Install wasi-sdk/Wasmtime working-directory: ${{ runner.tool_cache }} run: | wasi_sdk=29 wasmtime=v40.0.1 curl -LO https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-$wasi_sdk/wasi-sdk-$wasi_sdk.0-x86_64-linux.tar.gz tar xf wasi-sdk-$wasi_sdk.0-x86_64-linux.tar.gz WASI_SDK_PATH=`pwd`/wasi-sdk-$wasi_sdk.0-x86_64-linux echo "WASI_SDK_PATH=$WASI_SDK_PATH" >> $GITHUB_ENV echo "CC_wasm32_wasip2=$WASI_SDK_PATH/bin/clang" >> $GITHUB_ENV echo "CARGO_TARGET_WASM32_WASIP2_LINKER=$WASI_SDK_PATH/bin/clang" >> $GITHUB_ENV echo "CARGO_TARGET_WASM32_WASIP2_RUSTFLAGS=-Clink-arg=-Wl,--export=cabi_realloc" >> $GITHUB_ENV curl -LO https://github.com/bytecodealliance/wasmtime/releases/download/$wasmtime/wasmtime-$wasmtime-x86_64-linux.tar.xz tar xf wasmtime-$wasmtime-x86_64-linux.tar.xz echo "CARGO_TARGET_WASM32_WASIP2_RUNNER=`pwd`/wasmtime-$wasmtime-x86_64-linux/wasmtime -W exceptions" >> $GITHUB_ENV - name: Run ${{ matrix.lua }} tests run: | cargo test --target wasm32-wasip2 --tests --features "${{ matrix.lua }},vendored" cargo test --target wasm32-wasip2 --tests --features "${{ matrix.lua }},vendored,serde,macros,anyhow,userdata-wrappers" rustfmt: name: Rustfmt runs-on: ubuntu-latest steps: - uses: actions/checkout@main - uses: dtolnay/rust-toolchain@nightly with: components: rustfmt - run: cargo fmt -- --check clippy: name: Clippy runs-on: ubuntu-latest strategy: matrix: lua: [lua55, lua54, lua53, lua52, lua51, luajit, luau, luau-jit, luau-vector4] steps: - uses: actions/checkout@main - uses: dtolnay/rust-toolchain@stable with: toolchain: nightly components: clippy - uses: giraffate/clippy-action@v1 with: reporter: 'github-pr-review' clippy_flags: --features "${{ matrix.lua }},vendored,async,send,serde,macros,anyhow,userdata-wrappers"