antlr-runtime-sys 0.2.0

antlr-runtime library.
Documentation
name: antlr4

concurrency:
  group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

on:
  push:
    branches: [ master, dev, hostedci ]
  pull_request:
    branches: [ master, dev ]

permissions:
  contents: read

jobs:
  cpp-lib-build:
    runs-on: ${{ matrix.os }}

    strategy:
      fail-fast: false
      matrix:
        os: [
          macos-15,
          ubuntu-20.04,
          windows-2022
        ]
        compiler: [ clang, gcc ]
        unity_build: [ ON, OFF ]
        exclude:
          - os: windows-2022
            compiler: gcc
        include:
          - os: windows-2022
            compiler: cl

    steps:
    - name: Install dependencies (Ubuntu)
      if: startswith(matrix.os, 'ubuntu')
      run: |
        sudo apt-get update -qq
        sudo apt install -y ninja-build

    - name: Install dependencies (MacOS)
      if: startswith(matrix.os, 'macos')
      run: brew install ninja

    - name: Setup Clang
      if: (matrix.compiler == 'clang') && !startswith(matrix.os, 'macos')
      uses: egor-tensin/setup-clang@v1
      with:
        version: 13
        platform: x64
        cygwin: 0

    - name: Check out code
      uses: actions/checkout@v3

    - name: Use ccache
      if: startswith(matrix.os, 'macos') || startswith(matrix.os, 'ubuntu')
      uses: hendrikmuhs/ccache-action@v1.2
      with:
        key: ${{ matrix.os }}-${{ matrix.compiler }}

    - name: Configure shell (Ubuntu)
      if: startswith(matrix.os, 'ubuntu')
      run: echo 'PATH=/usr/lib/ccache:'"$PATH" >> $GITHUB_ENV

    - name: Configure shell (MacOS)
      if: startswith(matrix.os, 'macos')
      run: echo "PATH=$(brew --prefix)/opt/ccache/libexec:$PATH" >> $GITHUB_ENV

    - name: Build (Windows)
      if: startswith(matrix.os, 'windows')
      shell: cmd
      run: |
        call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat"

        if "${{ matrix.compiler }}" EQU "cl" (
          set CC=cl
          set CXX=cl
          echo 'CC=cl' >> $GITHUB_ENV
          echo 'CXX=cl' >> $GITHUB_ENV
        ) else (
          set CC=clang
          set CXX=clang++
          echo 'CC=clang' >> $GITHUB_ENV
          echo 'CXX=clang++' >> $GITHUB_ENV
        )

        set
        where cmake && cmake --version
        where ninja && ninja --version
        where %CC% && %CC% -version
        where %CXX% && %CXX% -version

        cd runtime/Cpp

        cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DANTLR_BUILD_CPP_TESTS=OFF -DCMAKE_UNITY_BUILD=${{ matrix.unity_build }} -DCMAKE_UNITY_BUILD_BATCH_SIZE=20 -S . -B out/Debug
        if %errorlevel% neq 0 exit /b %errorlevel%

        cmake --build out/Debug -j %NUMBER_OF_PROCESSORS%
        if %errorlevel% neq 0 exit /b %errorlevel%

        cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DANTLR_BUILD_CPP_TESTS=OFF -S . -B out/Release
        if %errorlevel% neq 0 exit /b %errorlevel%

        cmake --build out/Release -j %NUMBER_OF_PROCESSORS%
        if %errorlevel% neq 0 exit /b %errorlevel%

    - name: Build (non-Windows)
      if: startswith(matrix.os, 'macos') || startswith(matrix.os, 'ubuntu')
      run: |
        if [ "${{matrix.compiler}}" == "clang" ]; then
          export CC=clang
          export CXX=clang++
          echo 'CC=clang' >> $GITHUB_ENV
          echo 'CXX=clang++' >> $GITHUB_ENV
        else
          export CC=gcc
          export CXX=g++
          echo 'CC=gcc' >> $GITHUB_ENV
          echo 'CXX=g++' >> $GITHUB_ENV
        fi

        env
        which cmake && cmake --version
        which ninja && ninja --version
        which $CC && $CC --version
        which $CXX && $CXX --version

        cd runtime/Cpp

        cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DANTLR_BUILD_CPP_TESTS=OFF -DCMAKE_UNITY_BUILD=${{ matrix.unity_build }} -DCMAKE_UNITY_BUILD_BATCH_SIZE=20 -S . -B out/Debug
        cmake --build out/Debug --parallel

        cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DANTLR_BUILD_CPP_TESTS=OFF -S . -B out/Release
        cmake --build out/Release --parallel

    - name: Prepare artifacts
      if: always()
      run: |
        cd ${{ github.workspace }}/..
        tar czfp antlr_${{ matrix.os }}_${{ matrix.compiler }}.tgz --exclude='.git' antlr4
        mv antlr_${{ matrix.os }}_${{ matrix.compiler }}.tgz ${{ github.workspace }}/.

    - name: Archive artifacts
      if: always()
      continue-on-error: true
      uses: actions/upload-artifact@v4
      with:
        name: antlr_${{ matrix.os }}_${{ matrix.compiler }}
        path: antlr_${{ matrix.os }}_${{ matrix.compiler }}.tgz


  build:
    runs-on: ${{ matrix.os }}

    strategy:
      fail-fast: false
      matrix:
        os: [
          macos-15,
          ubuntu-20.04,
          windows-2022
        ]
        target: [
          tool,
          cpp,
          csharp,
          dart,
          go,
          java,
          javascript,
          typescript,
          php,
          python3,
          # swift,
        ]
        exclude:
          - os: windows-2022
            target: swift

    steps:
      # Check out the code before setting the environment since some
      # of the actions actually parse the files to figure out the
      # dependencies, for instance, the setup-java actually parses
      # **/pom.xml files to decide what to cache.
    - name: Check out code
      uses: actions/checkout@v3

    - name: Checkout antlr PHP runtime
      if: matrix.target == 'php'
      uses: actions/checkout@v3
      with:
        repository: antlr/antlr-php-runtime
        path: runtime/PHP

    - name: Setup PHP 8.2
      if: matrix.target == 'php'
      uses: shivammathur/setup-php@v2
      with:
        php-version: '8.3'
        extensions: mbstring
        tools: composer

    - name: Install dependencies
      env:
        COMPOSER_CACHE_DIR: ${{ github.workspace }}/.cache
      if: matrix.target == 'php'
      run: |-
        cd runtime/PHP
        composer install --no-progress --no-interaction --prefer-dist --optimize-autoloader

    - name: Install dependencies (Ubuntu)
      if: startswith(matrix.os, 'ubuntu')
      run: |
        sudo apt-get update -qq
        sudo apt install -y ninja-build

    - name: Install dependencies (MacOS)
      if: startswith(matrix.os, 'macos')
      run: brew install ninja

    - name: Set up JDK 11
      id: setup-java
      uses: actions/setup-java@v3
      with:
        distribution: 'zulu'
        java-version: 11
        cache: 'maven'

    - name: Set up Maven
      if: steps.setup-java.outputs.cache-hit != 'true'
      uses: stCarolas/setup-maven@v4.5
      with:
        maven-version: 3.8.5

    - name: Add msbuild to PATH
      if: startswith(matrix.os, 'windows') && (matrix.target == 'cpp')
      uses: microsoft/setup-msbuild@v1.1

    - name: Set up Python 3
      if: matrix.target == 'python3'
      uses: actions/setup-python@v4
      with:
        python-version: '3.x'
        architecture: 'x64'

    - name: Set up Node 16
      if: (matrix.target == 'javascript') || (matrix.target == 'typescript')
      uses: actions/setup-node@v3.6.0
      with:
        node-version: '16'

    - name: Setup Dotnet
      if: matrix.target == 'csharp'
      uses: actions/setup-dotnet@v3.0.3
      with:
        dotnet-version: '7.0.x'

    - name: Setup Dart 2.12.1
      if: matrix.target == 'dart'
      uses: dart-lang/setup-dart@v1.3
      with:
        sdk: 2.12.1

    - name: Setup Go 1.19
      if: matrix.target == 'go'
      uses: actions/setup-go@v3.3.1
      with:
        go-version: '^1.19'

    - name: Setup Swift
      if: matrix.target == 'swift'
      uses: swift-actions/setup-swift@v1.19.0
      with:
        swift-version: '5.2'

    - name: Use ccache
      if: (startswith(matrix.os, 'macos') || startswith(matrix.os, 'ubuntu')) && (matrix.target == 'cpp')
      uses: hendrikmuhs/ccache-action@v1.2
      with:
        key: ${{ matrix.os }}-${{ matrix.target }}

    - name: Configure shell (Ubuntu)
      if: startswith(matrix.os, 'ubuntu') && (matrix.target == 'cpp')
      run: echo 'PATH=/usr/lib/ccache:'"$PATH" >> $GITHUB_ENV

    - name: Configure shell (MacOS)
      if: startswith(matrix.os, 'macos') && (matrix.target == 'cpp')
      run: echo "PATH=$(brew --prefix)/opt/ccache/libexec:$PATH" >> $GITHUB_ENV

    - name: Build ANTLR with Maven
      run: mvn install -DskipTests=true -Darguments="-Dmaven.javadoc.skip=true" -B -V

    - name: Test tool
      if: matrix.target == 'tool'
      run: |
        cd tool-testsuite
        mvn test

    - name: Test runtime (Windows)
      if: startsWith(matrix.os, 'windows') && (matrix.target != 'tool')
      run: |
        gci env:* | sort-object name

        cd runtime-testsuite
        switch ("${{ matrix.target }}")
        {
          python3 { mvn -X '-Dantlr-python3-exec="${{ env.pythonLocation }}\python.exe"' '-Dtest=python3.**' test }
          default { mvn -X '-Dtest=${{ matrix.target }}.**' test }
        }

      env:
        CMAKE_GENERATOR: Ninja

    - name: Test runtime (non-Windows)
      if: (startsWith(matrix.os, 'ubuntu') || startsWith(matrix.os, 'macos'))  && (matrix.target != 'tool')
      run: |
        env

        cd runtime-testsuite
        case ${{ matrix.target }} in
          python3) mvn -X '-Dantlr-python3-exec=${{ env.pythonLocation }}/bin/python' '-Dtest=python3.**' test ;;
          *) mvn -X '-Dtest=${{ matrix.target }}.**' test ;;
        esac

    - name: Prepare artifacts
      if: always()
      run: |
        cd ${{ github.workspace }}/..
        tar czfp antlr_${{ matrix.os }}_${{ matrix.target }}.tgz --exclude='.git' antlr4
        mv antlr_${{ matrix.os }}_${{ matrix.target }}.tgz ${{ github.workspace }}/.

    - name: Archive artifacts
      if: always()
      continue-on-error: true
      uses: actions/upload-artifact@v4
      with:
        name: antlr_${{ matrix.os }}_${{ matrix.target }}
        path: antlr_${{ matrix.os }}_${{ matrix.target }}.tgz