200 lines
7.9 KiB
YAML
200 lines
7.9 KiB
YAML
name: Build & Test
|
||
|
||
env:
|
||
CARGO_TERM_COLOR: always
|
||
RUSTFLAGS: "-D warnings"
|
||
CROSS_DEBUG: 1
|
||
|
||
on:
|
||
workflow_call:
|
||
inputs:
|
||
run_test:
|
||
default: true
|
||
type: boolean
|
||
|
||
jobs:
|
||
build:
|
||
name: ${{ matrix.platform }} (${{ matrix.target }}) (${{ matrix.os }})
|
||
runs-on: ${{ matrix.os }}
|
||
timeout-minutes: 40
|
||
strategy:
|
||
fail-fast: false
|
||
matrix:
|
||
platform:
|
||
- linux-arm64 #
|
||
- linux-arm #
|
||
- linux-x64 #
|
||
- linux-x86 #
|
||
- linux-powerpc64 #
|
||
- windows-arm64 #
|
||
- windows-x64 # <-- No C library build - requires an additional adapted Makefile for `cl.exe` compiler
|
||
- windows-x86 # -- // --
|
||
- macos-arm64 #
|
||
- macos-x64 #
|
||
|
||
include:
|
||
# When adding a new `target`:
|
||
# 1. Define a new platform alias above
|
||
# 2. Add a new record to a matrix map in `cli/npm/install.js`
|
||
- { platform: linux-arm64 , target: aarch64-unknown-linux-gnu , os: ubuntu-latest , use-cross: true }
|
||
- { platform: linux-arm , target: arm-unknown-linux-gnueabi , os: ubuntu-latest , use-cross: true }
|
||
- { platform: linux-x64 , target: x86_64-unknown-linux-gnu , os: ubuntu-20.04 , enable-wasm: true } #2272
|
||
- { platform: linux-x86 , target: i686-unknown-linux-gnu , os: ubuntu-latest , use-cross: true }
|
||
- { platform: linux-powerpc64 , target: powerpc64-unknown-linux-gnu , os: ubuntu-latest , use-cross: true }
|
||
- { platform: windows-arm64 , target: aarch64-pc-windows-msvc , os: windows-latest }
|
||
- { platform: windows-x64 , target: x86_64-pc-windows-msvc , os: windows-latest , enable-wasm: true }
|
||
- { platform: windows-x86 , target: i686-pc-windows-msvc , os: windows-latest }
|
||
- { platform: macos-arm64 , target: aarch64-apple-darwin , os: macos-14 , enable-wasm: true }
|
||
- { platform: macos-x64 , target: x86_64-apple-darwin , os: macos-latest , enable-wasm: true }
|
||
|
||
# Cross compilers for C library
|
||
- { platform: linux-arm64 , cc: aarch64-linux-gnu-gcc , ar: aarch64-linux-gnu-ar }
|
||
- { platform: linux-arm , cc: arm-linux-gnueabi-gcc , ar: arm-linux-gnueabi-ar }
|
||
- { platform: linux-x86 , cc: i686-linux-gnu-gcc , ar: i686-linux-gnu-ar }
|
||
- { platform: linux-powerpc64 , cc: powerpc64-linux-gnu-gcc , ar: powerpc64-linux-gnu-ar }
|
||
|
||
# See #2041 tree-sitter issue
|
||
- { platform: windows-x64 , rust-test-threads: 1 }
|
||
- { platform: windows-x86 , rust-test-threads: 1 }
|
||
|
||
# CLI only build
|
||
- { platform: windows-arm64 , cli-only: true }
|
||
|
||
env:
|
||
BUILD_CMD: cargo
|
||
EMSCRIPTEN_VERSION: ""
|
||
EXE: ${{ contains(matrix.target, 'windows') && '.exe' || '' }}
|
||
|
||
defaults:
|
||
run:
|
||
shell: bash
|
||
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
|
||
- name: Read Emscripten version
|
||
run: |
|
||
echo "EMSCRIPTEN_VERSION=$(cat cli/loader/emscripten-version)" >> $GITHUB_ENV
|
||
|
||
- name: Install Emscripten
|
||
if: ${{ !matrix.cli-only && !matrix.use-cross }}
|
||
uses: mymindstorm/setup-emsdk@v14
|
||
with:
|
||
version: ${{ env.EMSCRIPTEN_VERSION }}
|
||
|
||
- run: rustup toolchain install stable --profile minimal
|
||
- run: rustup target add ${{ matrix.target }}
|
||
- uses: Swatinem/rust-cache@v2
|
||
|
||
- name: Install cross
|
||
if: ${{ matrix.use-cross }}
|
||
uses: taiki-e/install-action@v2
|
||
with:
|
||
tool: cross
|
||
|
||
- name: Build custom cross image
|
||
if: ${{ matrix.use-cross && matrix.os == 'ubuntu-latest' }}
|
||
run: |
|
||
cd ..
|
||
|
||
target="${{ matrix.target }}"
|
||
image=ghcr.io/cross-rs/$target:custom
|
||
echo "CROSS_IMAGE=$image" >> $GITHUB_ENV
|
||
|
||
echo "[target.$target]" >> Cross.toml
|
||
echo "image = \"$image\"" >> Cross.toml
|
||
echo "CROSS_CONFIG=$PWD/Cross.toml" >> $GITHUB_ENV
|
||
|
||
echo "FROM ghcr.io/cross-rs/$target:edge" >> Dockerfile
|
||
echo "ENV DEBIAN_FRONTEND=noninteractive" >> Dockerfile
|
||
echo "RUN apt-get update && apt-get install -y nodejs" >> Dockerfile
|
||
docker build -t $image .
|
||
|
||
- name: Setup env extras
|
||
env:
|
||
RUST_TEST_THREADS: ${{ matrix.rust-test-threads || '' }}
|
||
USE_CROSS: ${{ matrix.use-cross }}
|
||
TARGET: ${{ matrix.target }}
|
||
CC: ${{ matrix.cc }}
|
||
AR: ${{ matrix.ar }}
|
||
IS_WINDOWS: ${{ contains(matrix.os, 'windows') }}
|
||
ENABLE_WASM: ${{ matrix.enable-wasm }}
|
||
run: |
|
||
PATH="$PWD/.github/scripts:$PATH"
|
||
echo "$PWD/.github/scripts" >> $GITHUB_PATH
|
||
|
||
echo "TREE_SITTER=tree-sitter.sh" >> $GITHUB_ENV
|
||
echo "TARGET=$TARGET" >> $GITHUB_ENV
|
||
echo "ROOT=$PWD" >> $GITHUB_ENV
|
||
|
||
[ -n "$RUST_TEST_THREADS" ] && \
|
||
echo "RUST_TEST_THREADS=$RUST_TEST_THREADS" >> $GITHUB_ENV
|
||
|
||
[ -n "$CC" ] && echo "CC=$CC" >> $GITHUB_ENV
|
||
[ -n "$AR" ] && echo "AR=$AR" >> $GITHUB_ENV
|
||
|
||
[ "$IS_WINDOWS" = "false" ] && echo "CFLAGS=-Werror" >> $GITHUB_ENV
|
||
|
||
if [ "$ENABLE_WASM" == "true" ]; then
|
||
echo "CLI_FEATURES=wasm" >> $GITHUB_ENV
|
||
fi
|
||
|
||
if [ "$USE_CROSS" == "true" ]; then
|
||
echo "BUILD_CMD=cross" >> $GITHUB_ENV
|
||
runner=$(BUILD_CMD=cross cross.sh bash -c "env | sed -nr '/^CARGO_TARGET_.*_RUNNER=/s///p'")
|
||
[ -n "$runner" ] && echo "CROSS_RUNNER=$runner" >> $GITHUB_ENV
|
||
fi
|
||
|
||
- name: Build C library
|
||
if: ${{ !contains(matrix.os, 'windows') }} # Requires an additional adapted Makefile for `cl.exe` compiler
|
||
run: make.sh -j
|
||
|
||
- name: Build wasm library
|
||
if: ${{ !matrix.cli-only && !matrix.use-cross }} # No sense to build on the same Github runner hosts many times
|
||
run: script/build-wasm
|
||
|
||
- name: Build CLI
|
||
run: $BUILD_CMD build --release --target=${{ matrix.target }} --features=${CLI_FEATURES}
|
||
|
||
- name: Fetch fixtures
|
||
if: ${{ !matrix.cli-only && inputs.run_test }} # Don't fetch fixtures for only CLI building targets
|
||
run: script/fetch-fixtures
|
||
|
||
- name: Generate fixtures
|
||
if: ${{ !matrix.cli-only && inputs.run_test }} # Can't natively run CLI on Github runner's host
|
||
run: script/generate-fixtures
|
||
|
||
- name: Generate WASM fixtures
|
||
if: ${{ !matrix.cli-only && !matrix.use-cross && inputs.run_test }} # See comment for the "Build wasm library" step
|
||
run: script/generate-fixtures-wasm
|
||
|
||
- name: Run main tests
|
||
if: ${{ !matrix.cli-only && inputs.run_test }} # Can't natively run CLI on Github runner's host
|
||
run: $BUILD_CMD test --target=${{ matrix.target }} --features=${CLI_FEATURES}
|
||
|
||
- name: Run wasm tests
|
||
if: ${{ !matrix.cli-only && !matrix.use-cross && inputs.run_test }} # See comment for the "Build wasm library" step
|
||
run: script/test-wasm
|
||
|
||
- name: Run benchmarks
|
||
if: ${{ !matrix.cli-only && !matrix.use-cross && inputs.run_test }} # Cross-compiled benchmarks make no sense
|
||
run: $BUILD_CMD bench benchmark -p tree-sitter-cli --target=${{ matrix.target }}
|
||
|
||
- name: Upload CLI artifact
|
||
uses: actions/upload-artifact@v4
|
||
with:
|
||
name: tree-sitter.${{ matrix.platform }}
|
||
path: target/${{ matrix.target }}/release/tree-sitter${{ env.EXE }}
|
||
if-no-files-found: error
|
||
retention-days: 7
|
||
|
||
- name: Upload WASM artifacts
|
||
if: ${{ matrix.platform == 'linux-x64' }}
|
||
uses: actions/upload-artifact@v4
|
||
with:
|
||
name: tree-sitter.wasm
|
||
path: |
|
||
lib/binding_web/tree-sitter.js
|
||
lib/binding_web/tree-sitter.wasm
|
||
if-no-files-found: error
|
||
retention-days: 7
|