It clutters up the page with unnecessary information. This information can be provided as release notes or another form if needed.
201 lines
8.1 KiB
YAML
201 lines
8.1 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 M1/M2 - no tests, only CLI build to be published on release artifacts
|
||
- 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-latest , 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 }
|
||
- { platform: macos-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
|