name: CI on: push: branches: [master] paths-ignore: - "docs/**" - "LICENCE" - "CONTRIBUTION.md" - "README.md" pull_request: branches: [master] paths-ignore: - "docs/**" - "LICENCE" - "CONTRIBUTION.md" - "README.md" concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: build: strategy: matrix: os: [linux, macos, windows] config: [debug, releaseWithDebugInfo] compiler: [gcc, clang, cl] platform: [x86_64, aarch64, wasm] exclude: # Default to x64, but aarch64 on osx - { os: linux, platform: aarch64 } - { os: windows, platform: aarch64 } - { os: macos, platform: x86_64 } - { os: linux, config: debug, platform: wasm } - { os: windows, platform: wasm } - { os: macos, platform: wasm } # Unused compiler configs - { os: linux, compiler: clang } - { os: linux, compiler: cl } - { os: windows, compiler: gcc } - { os: windows, compiler: clang } - { os: macos, compiler: gcc } - { os: macos, compiler: cl } include: - { os: linux, runs-on: ubuntu-20.04 } - { os: macos, runs-on: macos-latest } - { os: windows, runs-on: windows-latest } # Warnings are treated as errors by default. # But we may want to disable it temporarily. - { os: linux, warnings-as-errors: true } - { os: macos, warnings-as-errors: true } - { os: windows, warnings-as-errors: true } # Set a test category depending on the config, smoke by default, # quick or full conditionally otherwise - test-category: smoke - { os: windows, test-category: quick } - { config: releaseWithDebugInfo, test-category: full } # default not full gpu tests - full-gpu-tests: false # The runners don't have a GPU by default except for the self-hosted ones - has-gpu: false # Self-hosted aarch64 build - os: linux config: releaseWithDebugInfo compiler: gcc platform: aarch64 test-category: smoke full-gpu-tests: false runs-on: [self-hosted, Linux, ARM64] has-gpu: true # Self-hosted full gpu build - os: windows config: releaseWithDebugInfo compiler: cl platform: x86_64 test-category: full full-gpu-tests: true runs-on: [Windows, self-hosted] has-gpu: true fail-fast: false runs-on: ${{ matrix.runs-on }} defaults: run: shell: bash steps: - uses: actions/checkout@v3 with: submodules: "recursive" fetch-depth: "0" - name: Setup uses: ./.github/actions/common-setup with: os: ${{matrix.os}} compiler: ${{matrix.compiler}} platform: ${{matrix.platform}} config: ${{matrix.config}} build-llvm: ${{ matrix.platform != 'wasm' }} - name: Build Slang run: | if [[ "${{ matrix.platform }}" = "wasm" ]]; then git clone https://github.com/emscripten-core/emsdk.git pushd emsdk ./emsdk install latest ./emsdk activate latest source ./emsdk_env.sh popd cmake --workflow --preset generators --fresh mkdir generators cmake --install build --prefix generators --component generators emcmake cmake -DSLANG_GENERATORS_PATH=generators/bin --preset emscripten -DSLANG_SLANG_LLVM_FLAVOR=DISABLE cmake --build --preset emscripten --config "$cmake_config" --target slang [ -f "build.em/$cmake_config/lib/libslang.a" ] [ -f "build.em/$cmake_config/lib/libcompiler-core.a" ] [ -f "build.em/$cmake_config/lib/libcore.a" ] else if [[ "${{ matrix.os }}" =~ "windows" && "${{ matrix.config }}" != "release" && "${{ matrix.config }}" != "releaseWithDebugInfo" ]]; then # Doing a debug build will try to link against a release built llvm, this # is a problem on Windows, so make slang-llvm in release build and use # that as though it's a fetched binary via these presets. cmake --workflow --preset slang-llvm # Configure, pointing to our just-generated slang-llvm archive cmake --preset default --fresh \ -DSLANG_SLANG_LLVM_FLAVOR=FETCH_BINARY \ "-DSLANG_SLANG_LLVM_BINARY_URL=$(pwd)/build/dist-release/slang-llvm.zip" \ "-DCMAKE_COMPILE_WARNING_AS_ERROR=${{matrix.warnings-as-errors}}" cmake --workflow --preset "${{matrix.config}}" else # Otherwise, use the "system" llvm we have just build or got from the # cache in the setup phase cmake --preset default --fresh \ -DSLANG_SLANG_LLVM_FLAVOR=USE_SYSTEM_LLVM \ -DCMAKE_COMPILE_WARNING_AS_ERROR=${{matrix.warnings-as-errors}} cmake --workflow --preset "${{matrix.config}}" fi fi - name: Test Slang if: ${{ matrix.platform != 'wasm' }} run: | export SLANG_RUN_SPIRV_VALIDATION=1 export SLANG_USE_SPV_SOURCE_LANGUAGE_UNKNOWN=1 if [[ "${{matrix.full-gpu-tests}}" == "true" ]]; then "$bin_dir/slang-test" \ -use-test-server \ -server-count 8 \ -category ${{ matrix.test-category }} \ -api all-cpu elif [[ "${{matrix.has-gpu}}" == "true" ]]; then "$bin_dir/slang-test" \ -use-test-server \ -category ${{ matrix.test-category }} \ -api all-dx12 \ -expected-failure-list tests/expected-failure-github.txt else "$bin_dir/slang-test" \ -use-test-server \ -category ${{ matrix.test-category }} \ -api all-dx12 \ -expected-failure-list tests/expected-failure-github.txt \ -expected-failure-list tests/expected-failure-record-replay-tests.txt fi - name: Test Slang via glsl if: ${{ matrix.full-gpu-tests && matrix.platform != 'wasm' }} run: | export SLANG_RUN_SPIRV_VALIDATION=1 export SLANG_USE_SPV_SOURCE_LANGUAGE_UNKNOWN=1 "$bin_dir/slang-test" \ -use-test-server \ -server-count 8 \ -category ${{ matrix.test-category }} \ -emit-spirv-via-glsl \ -api vk \ -expected-failure-list tests/expected-failure.txt - uses: actions/upload-artifact@v3 if: ${{ ! matrix.full-gpu-tests }} with: name: slang-build-${{matrix.os}}-${{matrix.platform}}-${{matrix.compiler}}-${{matrix.config}} # The install directory used in the packaging step path: build/dist-${{matrix.config}}/**/ZIP/slang/*