
# (C) 2020,2022 Jack Lloyd
# (C) 2022      René Meusel, Rohde & Schwarz Cybersecurity
#
# Botan is released under the Simplified BSD License (see license.txt)

name: ci

permissions:
  contents: read
  # implicitly all other scopes not listed become none

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

# cancel running workflows when new commits are being pushed in pull requests
# but not on the master branch
concurrency:
  group: ${{ github.workflow }} @ ${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

jobs:
  windows:
    name: "Windows"
    strategy:
      fail-fast: false

      matrix:
        include:
          - target: shared
            arch: x86_64
            host_os: windows-2022
          - target: static
            arch: x86_64
            host_os: windows-2022
          - target: amalgamation
            arch: x86_64
            host_os: windows-2022
          - target: shared
            arch: x86
            host_os: windows-2022

    runs-on: ${{ matrix.host_os }}

    steps:
      - uses: actions/checkout@v3

      - name: Setup Build Agent
        uses: ./.github/actions/setup-build-agent
        with:
          target: ${{ matrix.target }}
          cache-key: ${{ matrix.host_os }}-msvc-${{ matrix.arch }}-${{ matrix.target }}
          arch: ${{ matrix.arch }}

      - name: Build and Test Botan
        run: python3 ./src/scripts/ci_build.py --cc='msvc' --make-tool='ninja' --cpu='${{ matrix.arch }}' --test-results-dir=junit_results ${{ matrix.target }}

  linux:
    name: "Linux"
    strategy:
      fail-fast: false

      matrix:
        include:
          - compiler: gcc
            target: shared
          - compiler: gcc
            target: amalgamation
          - compiler: gcc
            target: static
          - compiler: clang
            target: shared

    runs-on: ubuntu-22.04

    steps:
      - uses: actions/checkout@v3

      - name: Setup Build Agent
        uses: ./.github/actions/setup-build-agent
        with:
          target: ${{ matrix.target }}
          cache-key: linux-${{ matrix.compiler }}-x86_64-${{ matrix.target }}

      - name: Build and Test Botan
        run: python3 ./src/scripts/ci_build.py --cc='${{ matrix.compiler }}' --test-results-dir=junit_results ${{ matrix.target }}

  macos:
    name: "macOS"
    strategy:
      fail-fast: false

      matrix:
        include:
          - target: shared
            compiler: clang
          - target: amalgamation
            compiler: clang

    runs-on: macos-13

    steps:
      - uses: actions/checkout@v3

      - name: Setup Build Agent
        uses: ./.github/actions/setup-build-agent
        with:
          target: ${{ matrix.target }}
          cache-key: macos-${{ matrix.compiler }}-x86_64-${{ matrix.target }}

      - name: Build and Test Botan
        run: python3 ./src/scripts/ci_build.py --cc='${{ matrix.compiler }}' --test-results-dir=junit_results ${{ matrix.target }}

  clang-tidy:
    name: "Clang Tidy"
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v3

      - name: Setup Build Agent
        uses: ./.github/actions/setup-build-agent
        with:
          target: clang-tidy
          cache-key: linux-x86_64-clang-tidy

      - name: Configure Build
        run: python3 ./configure.py --cc=clang

      - name: Run Clang Tidy
        run: |
           ./src/scripts/ci/gh_get_changes_in_pr.py $(git rev-parse HEAD) --api-token=${{ secrets.GITHUB_TOKEN }} | \
             python3 ./src/scripts/dev_tools/run_clang_tidy.py --verbose --take-file-list-from-stdin --export-fixes-dir=clang_tidy_diagnostics

      - name: Display Clang Tidy Results
        if: failure()
        run: ./src/scripts/ci/gh_clang_tidy_fixes_in_pr.py clang_tidy_diagnostics

  analysis:
    name: "Analysis"
    strategy:
      fail-fast: false

      matrix:
        include:
          - target: coverage
            compiler: gcc
            host_os: ubuntu-22.04
          - target: sanitizer
            compiler: msvc
            host_os: windows-2022
            make_tool: ninja
          - target: sanitizer
            compiler: clang
            host_os: ubuntu-22.04
          - target: sanitizer
            compiler: gcc
            host_os: ubuntu-22.04
          - target: valgrind
            compiler: gcc
            host_os: ubuntu-22.04
          - target: fuzzers
            compiler: gcc
            host_os: ubuntu-22.04
          - target: lint
            compiler: gcc
            host_os: ubuntu-22.04
          - target: format
            compiler: gcc
            host_os: ubuntu-22.04

    runs-on: ${{ matrix.host_os }}

    env:
      COVERALLS_REPO_TOKEN: pbLoTMBxC1DFvbws9WfrzVOvfEdEZTcCS

    steps:
      - uses: actions/checkout@v3
        with:
          path: ./source

      - name: Fetch BoringSSL fork for BoGo tests
        uses: actions/checkout@v3
        with:
          repository: randombit/boringssl
          ref: rene/runner-20230705
          path: ./boringssl
        if: matrix.target == 'coverage' || matrix.target == 'sanitizer'

      - name: Setup Build Agent
        uses: ./source/.github/actions/setup-build-agent
        with:
          target: ${{ matrix.target }}
          cache-key: ${{ matrix.host_os }}-${{ matrix.compiler }}-x86_64-${{ matrix.target }}

      - name: Build and Test Botan
        run: python3 ./source/src/scripts/ci_build.py --root-dir=${{ github.workspace }}/source --build-dir=${{ github.workspace }}/build --boringssl-dir=${{ github.workspace }}/boringssl --cc='${{ matrix.compiler }}' --make-tool='${{ matrix.make_tool }}' --test-results-dir=junit_results ${{ matrix.target }}

  specials:
    name: "Special"
    strategy:
      fail-fast: false

      matrix:
        include:
          - target: examples
            compiler: gcc
            host_os: ubuntu-22.04
          - target: minimized
            compiler: gcc
            host_os: ubuntu-22.04
          - target: bsi
            compiler: gcc
            host_os: ubuntu-22.04

    runs-on: ${{ matrix.host_os }}

    steps:
      - uses: actions/checkout@v3
        with:
          path: ./source

      - name: Setup Build Agent
        uses: ./source/.github/actions/setup-build-agent
        with:
          target: ${{ matrix.target }}
          cache-key: ${{ matrix.host_os }}-${{ matrix.compiler }}-x86_64-${{ matrix.target }}

      - name: Build and Test Botan
        run: python3 ./source/src/scripts/ci_build.py --root-dir=${{ github.workspace }}/source --build-dir=${{ github.workspace }}/build --boringssl-dir=${{ github.workspace }}/boringssl --cc='${{ matrix.compiler }}' --make-tool='${{ matrix.make_tool }}' --test-results-dir=junit_results ${{ matrix.target }}

  x-compile:
    name: "Cross"
    strategy:
      fail-fast: false

      matrix:
        include:
          - target: cross-i386
            compiler: gcc
            host_os: ubuntu-22.04
          - target: cross-arm32
            compiler: gcc
            host_os: ubuntu-22.04
          - target: cross-arm64
            compiler: gcc
            host_os: ubuntu-22.04
          - target: cross-ppc64
            compiler: gcc
            host_os: ubuntu-22.04
          - target: cross-riscv64
            compiler: gcc
            host_os: ubuntu-22.04
          - target: cross-s390x
            compiler: gcc
            host_os: ubuntu-22.04
          - target: cross-android-arm32
            compiler: clang
            host_os: ubuntu-22.04
          - target: cross-android-arm64
            compiler: clang
            host_os: ubuntu-22.04
          - target: static
            compiler: gcc
            host_os: windows-2022
            make_tool: mingw32-make
          - target: cross-ios-arm64
            compiler: clang
            host_os: macos-13
          - target: emscripten
            compiler: emcc
            host_os: macos-13

    runs-on: ${{ matrix.host_os }}

    env:
      ANDROID_NDK: android-ndk-r26

    steps:
      - uses: actions/checkout@v3

      - name: Setup Build Agent
        uses: ./.github/actions/setup-build-agent
        with:
          target: ${{ matrix.target }}
          cache-key: ${{ matrix.host_os }}-${{ matrix.compiler }}-xcompile-${{ matrix.target }}

      - name: Build and Test Botan
        run: python3 ./src/scripts/ci_build.py --cc='${{ matrix.compiler }}' --test-results-dir=junit_results ${{ matrix.target }}
