name: Compile Examples

# See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows
on:
  push:
    paths:
      - ".github/workflows/compile-platform-examples.ya?ml"
      - "cores/**"
      - "libraries/**"
      - "variants/**"
      - "boards.txt"
      - "platform.txt"
  pull_request:
    paths:
      - ".github/workflows/compile-platform-examples.ya?ml"
      - "cores/**"
      - "libraries/**"
      - "variants/**"
      - "boards.txt"
      - "platform.txt"
  workflow_dispatch:
  repository_dispatch:

jobs:
  build:
    name: ${{ matrix.board.fqbn }}
    runs-on: ubuntu-latest

    env:
      SKETCHES_REPORTS_PATH: sketches-reports

    strategy:
      fail-fast: false

      matrix:
        board:
          - fqbn: arduino:avr:yun
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:uno
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:diecimila:cpu=atmega328
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:diecimila:cpu=atmega168
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:nano:cpu=atmega328
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:nano:cpu=atmega328old
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:nano:cpu=atmega168
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:mega:cpu=atmega2560
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:mega:cpu=atmega1280
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:megaADK
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:leonardo
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:leonardoeth
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:micro
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:esplora
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:mini:cpu=atmega328
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:mini:cpu=atmega168
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:ethernet
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:fio
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:bt:cpu=atmega328
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:bt:cpu=atmega168
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:LilyPadUSB
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:lilypad:cpu=atmega328
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:lilypad:cpu=atmega168
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:pro:cpu=16MHzatmega328
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:pro:cpu=8MHzatmega328
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:pro:cpu=16MHzatmega168
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:pro:cpu=8MHzatmega168
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:atmegang:cpu=atmega168
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:atmegang:cpu=atmega8
            serial: true
            softwareserial: false
          - fqbn: arduino:avr:robotControl
            serial: true
            softwareserial: false
          - fqbn: arduino:avr:robotMotor
            serial: true
            softwareserial: false
          - fqbn: arduino:avr:gemma
            serial: false
            softwareserial: false
          - fqbn: arduino:avr:circuitplay32u4cat
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:yunmini
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:chiwawa
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:one
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:unowifi
            serial: true
            softwareserial: true
          - fqbn: arduino:avr:unomini
            serial: true
            softwareserial: true

        # Make board type-specific customizations to the matrix jobs
        include:
          - board:
              # Boards with Serial interface
              serial: true
            # Compile these sketches in addition to the ones compiled for all boards
            serial-sketch-paths: |
              - libraries/EEPROM/examples/eeprom_crc
              - libraries/EEPROM/examples/eeprom_get
              - libraries/EEPROM/examples/eeprom_put
              - libraries/EEPROM/examples/eeprom_read
              - libraries/SPI
              - libraries/Wire
          - board:
              serial: false
            serial-sketch-paths: ""
          - board:
              # Boards compatible with the SoftwareSerial library
              softwareserial: true
            softwareserial-sketch-paths: |
              - libraries/SoftwareSerial
          - board:
              softwareserial: false
            softwareserial-sketch-paths: ""

    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Compile examples
        uses: arduino/compile-sketches@v1
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          fqbn: ${{ matrix.board.fqbn }}
          platforms: |
            # Use Boards Manager to install the latest release of the platform to get the toolchain.
            - name: arduino:avr
            # Overwrite the Boards Manager installation with the platform from the repository.
            - source-path: ./
              name: arduino:avr
          sketch-paths: |
            # Compile these sketches for all boards
            - libraries/EEPROM/examples/eeprom_clear
            - libraries/EEPROM/examples/eeprom_iteration
            - libraries/EEPROM/examples/eeprom_update
            - libraries/EEPROM/examples/eeprom_write
            # Board-specific sketches
            ${{ matrix.serial-sketch-paths }}
            ${{ matrix.softwareserial-sketch-paths }}
          enable-deltas-report: true
          sketches-report-path: ${{ env.SKETCHES_REPORTS_PATH }}

      - name: Save sketches report as workflow artifact
        uses: actions/upload-artifact@v3
        with:
          if-no-files-found: error
          path: ${{ env.SKETCHES_REPORTS_PATH }}
          name: ${{ env.SKETCHES_REPORTS_PATH }}
