# Copyright 2021-2025 The OpenSSL Project Authors. All Rights Reserved.
#
# Licensed under the Apache License 2.0 (the "License").  You may not use
# this file except in compliance with the License.  You can obtain a copy
# in the file LICENSE in the source distribution or at
# https://www.openssl.org/source/license.html

name: Compiler Zoo CI

on: [push]

permissions:
  contents: read

jobs:
  compiler:
    strategy:
      fail-fast: false
      matrix:
        zoo: [
          {
            cc: gcc-9,
            distro: ubuntu-22.04
          }, {
            cc: gcc-10,
            distro: ubuntu-22.04
          }, {
            cc: gcc-11,
            distro: ubuntu-22.04
          }, {
            cc: gcc-12,
            distro: ubuntu-22.04
          }, {
            cc: gcc-13,
            distro: ubuntu-22.04,
            gcc-ppa-name: ubuntu-toolchain-r/test
          }, {
            cc: clang-11,
            distro: ubuntu-22.04
          }, {
            cc: clang-12,
            distro: ubuntu-22.04
          }, {
            cc: clang-13,
            distro: ubuntu-22.04
          }, {
            cc: clang-14,
            distro: ubuntu-22.04
          }, {
            cc: clang-15,
            distro: ubuntu-22.04,
            llvm-ppa-name: jammy
          }, {
            cc: clang-16,
            distro: ubuntu-22.04,
            llvm-ppa-name: jammy
          }, {
            cc: clang-17,
            distro: ubuntu-22.04,
            llvm-ppa-name: jammy
          }
        ]
    # We set per-compiler now to allow testing with both older and newer sets
    # Often, the full range of oldest->newest compilers we want aren't available
    # in a single version of Ubuntu.
    runs-on: ${{ matrix.zoo.distro }}
    steps:
    - name: install packages
      run: |
        gcc_ppa_name="${{ matrix.zoo.gcc-ppa-name }}"
        llvm_ppa_name="${{ matrix.zoo.llvm-ppa-name }}"

        # In the Matrix above:
        # - we set gcc-ppc-name if the GCC version isn't part of the Ubuntu version we're using (see https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test).
        # - we set llvm-ppa-name if an LLVM version isn't part of the Ubuntu version we're using (see https://apt.llvm.org/).
        # This is especially needed because even new Ubuntu LTSes aren't available
        # until a while after release on Github Actions.
        if [[ -n ${gcc_ppa_name} ]] ; then
          sudo add-apt-repository ppa:ubuntu-toolchain-r/test
          sudo apt-get update
        elif [[ -n ${llvm_ppa_name} ]] ; then
            wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key |\
                gpg --dearmor |\
                sudo tee /usr/share/keyrings/llvm-snapshot.gpg.key > /dev/null

            clang_version="${{ matrix.zoo.cc }}"
            clang_version="${clang_version/clang-}"

            echo "deb [signed-by=/usr/share/keyrings/llvm-snapshot.gpg.key] http://apt.llvm.org/${{ matrix.zoo.llvm-ppa-name }}/ llvm-toolchain-${{ matrix.zoo.llvm-ppa-name }}-${clang_version} main" \
                | sudo tee /etc/apt/sources.list.d/llvm.list
            echo "deb-src [signed-by=/usr/share/keyrings/llvm-snapshot.gpg.key] http://apt.llvm.org/${{ matrix.zoo.llvm-ppa-name }}/ llvm-toolchain-${{ matrix.zoo.llvm-ppa-name }}-${clang_version} main" \
                | sudo tee -a /etc/apt/sources.list.d/llvm.list

            cat /etc/apt/sources.list.d/llvm.list
        fi

        sudo apt-get update
        sudo apt-get -y install ${{ matrix.zoo.cc }}

    - uses: actions/checkout@v4
    - name: checkout fuzz/corpora submodule
      run: git submodule update --init --depth 1 fuzz/corpora

    - name: config
      run: |
        CC=${{ matrix.zoo.cc }} ./config --banner=Configured no-shared \
            -Wall -Werror enable-fips --strict-warnings

    - name: config dump
      run: ./configdata.pm --dump
    - name: make
      run: make -s -j4
    - name: get cpu info
      run: |
        cat /proc/cpuinfo
        ./util/opensslwrap.sh version -c
    - name: make test
      run: make test HARNESS_JOBS=${HARNESS_JOBS:-4}
