name: CI
on:
push:
branches: [master]
pull_request:
workflow_dispatch:
permissions:
contents: read
concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true
jobs:
changes:
runs-on: ubuntu-latest
outputs:
docs: ${{ steps.compute.outputs.docs }}
windows: ${{ steps.compute.outputs.windows }}
linux: ${{ steps.compute.outputs.linux }}
macos: ${{ steps.compute.outputs.macos }}
ios: ${{ steps.compute.outputs.ios }}
android: ${{ steps.compute.outputs.android }}
emscripten: ${{ steps.compute.outputs.emscripten }}
gdextension: ${{ steps.compute.outputs.gdextension }}
wheels: ${{ steps.compute.outputs.wheels }}
sdist: ${{ steps.compute.outputs.sdist }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 with:
persist-credentials: false
- uses: dorny/paths-filter@ceb8a2b8f2d89434be7ff52d3de7ec3738c5cc9d id: filter
with:
filters: |
docs:
- 'doc/**'
gdext_src:
- 'gdextension/**'
windows:
- 'source/backends/sapi.cpp'
- 'source/backends/nvda.cpp'
- 'source/backends/jaws.cpp'
- 'source/backends/uia.cpp'
- 'source/backends/onecore.cpp'
- 'source/backends/window_eyes.cpp'
- 'source/backends/zdsr.cpp'
- 'source/backends/zoom_text.cpp'
- 'source/backends/pc_talker.cpp'
- 'source/backends/boy_pc_reader.cpp'
- 'source/backends/sense_reader.cpp'
- 'third_party/moderncom/**'
- 'source/delayimp.cpp'
- 'source/backends/speech_dispatcher.cpp'
- 'source/backends/orca.cpp'
- 'idl/**'
linux:
- 'source/backends/speech_dispatcher.cpp'
- 'source/backends/orca.cpp'
- 'winelibs/**'
apple:
- 'source/backends/voiceover.cpp'
- 'source/backends/avspeech.cpp'
android:
- 'source/backends/android_tts.cpp'
- 'source/backends/android_screen_reader.cpp'
- 'source/backends/android/**'
- 'source/AndroidManifest.xml'
- 'android/**'
- 'build.gradle'
- 'settings.gradle'
- 'gradle.properties'
- 'gradle/**'
- 'gradlew'
- 'gradlew.bat'
- 'third_party/djinni/**'
- 'tests/android/**'
web:
- 'source/backends/web_speech_synthesis_backend.cpp'
python:
- 'bindings/py/**'
- 'pyproject.toml'
- 'pytest.ini'
- 'uv.lock'
core:
- 'include/**'
- 'source/*.cpp'
- 'source/*.h'
- 'third_party/simdutf/**'
- 'third_party/concurrentqueue/**'
- 'third_party/dr_wav/**'
- 'third_party/highway/**'
- 'third_party/fmt/**'
- 'CMakeLists.txt'
- 'cmake/**'
- 'shims/**'
ci_core:
- '.github/workflows/ci.yml'
ci_docs:
- '.github/workflows/build-docs.yml'
ci_windows:
- '.github/workflows/build-windows.yml'
ci_linux:
- '.github/workflows/build-linux.yml'
ci_macos:
- '.github/workflows/build-macos.yml'
ci_ios:
- '.github/workflows/build-ios.yml'
ci_android:
- '.github/workflows/build-android.yml'
ci_emscripten:
- '.github/workflows/build-emscripten.yml'
ci_gdextension:
- '.github/workflows/build-gdextension.yml'
ci_wheels:
- '.github/workflows/build-wheels.yml'
ci_sdist:
- '.github/workflows/build-sdist.yml'
- id: compute
env:
F_DOCS: ${{ steps.filter.outputs.docs }}
F_GDEXT_SRC: ${{ steps.filter.outputs.gdext_src }}
F_WINDOWS: ${{ steps.filter.outputs.windows }}
F_LINUX: ${{ steps.filter.outputs.linux }}
F_APPLE: ${{ steps.filter.outputs.apple }}
F_ANDROID: ${{ steps.filter.outputs.android }}
F_WEB: ${{ steps.filter.outputs.web }}
F_PYTHON: ${{ steps.filter.outputs.python }}
F_CORE: ${{ steps.filter.outputs.core }}
F_CI_CORE: ${{ steps.filter.outputs.ci_core }}
F_CI_DOCS: ${{ steps.filter.outputs.ci_docs }}
F_CI_WINDOWS: ${{ steps.filter.outputs.ci_windows }}
F_CI_LINUX: ${{ steps.filter.outputs.ci_linux }}
F_CI_MACOS: ${{ steps.filter.outputs.ci_macos }}
F_CI_IOS: ${{ steps.filter.outputs.ci_ios }}
F_CI_ANDROID: ${{ steps.filter.outputs.ci_android }}
F_CI_EMSCRIPTEN: ${{ steps.filter.outputs.ci_emscripten }}
F_CI_GDEXT: ${{ steps.filter.outputs.ci_gdextension }}
F_CI_WHEELS: ${{ steps.filter.outputs.ci_wheels }}
F_CI_SDIST: ${{ steps.filter.outputs.ci_sdist }}
run: |
any() {
for v in "$@"; do
if [ "$v" = "true" ]; then echo true; return; fi
done
echo false
}
CI_ALL=$(any "$F_CORE" "$F_CI_CORE")
PLATFORM_ANY=$(any "$F_WINDOWS" "$F_LINUX" "$F_APPLE" "$F_ANDROID" "$F_WEB")
{
echo "docs=$(any "$CI_ALL" "$F_DOCS" "$F_CI_DOCS")"
echo "windows=$(any "$CI_ALL" "$F_WINDOWS" "$F_CI_WINDOWS")"
echo "linux=$(any "$CI_ALL" "$F_LINUX" "$F_CI_LINUX")"
echo "macos=$(any "$CI_ALL" "$F_APPLE" "$F_CI_MACOS")"
echo "ios=$(any "$CI_ALL" "$F_APPLE" "$F_CI_IOS")"
echo "android=$(any "$CI_ALL" "$F_ANDROID" "$F_CI_ANDROID")"
echo "emscripten=$(any "$CI_ALL" "$F_WEB" "$F_CI_EMSCRIPTEN")"
echo "gdextension=$(any "$CI_ALL" "$F_GDEXT_SRC" "$PLATFORM_ANY" "$F_CI_GDEXT")"
echo "wheels=$(any "$CI_ALL" "$F_PYTHON" "$PLATFORM_ANY" "$F_CI_WHEELS")"
echo "sdist=$(any "$CI_ALL" "$F_PYTHON" "$F_CI_SDIST")"
} >> "$GITHUB_OUTPUT"
build-docs:
needs: changes
if: needs.changes.outputs.docs == 'true'
uses: $/.github/workflows/build-docs.yml
build-windows:
needs: changes
if: needs.changes.outputs.windows == 'true'
uses: $/.github/workflows/build-windows.yml
build-linux:
needs: changes
if: needs.changes.outputs.linux == 'true'
uses: $/.github/workflows/build-linux.yml
build-macos:
needs: changes
if: needs.changes.outputs.macos == 'true'
uses: $/.github/workflows/build-macos.yml
build-ios:
needs: changes
if: needs.changes.outputs.ios == 'true'
uses: $/.github/workflows/build-ios.yml
build-tvos:
needs: changes
if: needs.changes.outputs.ios == 'true'
uses: $/.github/workflows/build-tvos.yml
build-visionos:
needs: changes
if: needs.changes.outputs.ios == 'true'
uses: $/.github/workflows/build-visionos.yml
build-watchos:
needs: changes
if: needs.changes.outputs.ios == 'true'
uses: $/.github/workflows/build-watchos.yml
build-android:
needs: changes
if: needs.changes.outputs.android == 'true'
uses: $/.github/workflows/build-android.yml
build-emscripten:
needs: changes
if: needs.changes.outputs.emscripten == 'true'
uses: $/.github/workflows/build-emscripten.yml
build-gdextension:
needs: changes
if: needs.changes.outputs.gdextension == 'true'
uses: $/.github/workflows/build-gdextension.yml
build-wheels:
needs: changes
if: needs.changes.outputs.wheels == 'true'
uses: $/.github/workflows/build-wheels.yml
build-sdist:
needs: changes
if: needs.changes.outputs.sdist == 'true'
uses: $/.github/workflows/build-sdist.yml