name: FreeRTOS-Kernel Demos
on: [push, pull_request]

jobs:
  WIN32-MSVC:
    name: WIN32 MSVC
    runs-on: windows-latest
    steps:
      - name: Checkout the FreeRTOS/FreeRTOS Repository
        uses: actions/checkout@v3
        with:
          ref: main
          repository: FreeRTOS/FreeRTOS
          submodules: 'recursive'
          fetch-depth: 1

      # Checkout user pull request changes
      - name: Checkout Pull Request
        uses: actions/checkout@v3
        with:
          path: ./FreeRTOS/Source

      - name: Add msbuild to PATH
        uses: microsoft/setup-msbuild@v1.1

      - name: Build WIN32-MSVC Demo
        working-directory: FreeRTOS/Demo/WIN32-MSVC
        run: msbuild WIN32.sln -t:rebuild

      - name: Build WIN32-MSVC-Static-Allocation-Only Demo
        working-directory: FreeRTOS/Demo/WIN32-MSVC-Static-Allocation-Only
        run: msbuild WIN32.sln -t:rebuild

  WIN32-MingW:
    name: WIN32 MingW
    runs-on: windows-latest
    steps:
      - name: Checkout the FreeRTOS/FreeRTOS Repository
        uses: actions/checkout@v3
        with:
          ref: main
          repository: FreeRTOS/FreeRTOS
          submodules: 'recursive'
          fetch-depth: 1

      # Checkout user pull request changes
      - name: Checkout Pull Request
        uses: actions/checkout@v3
        with:
          path: ./FreeRTOS/Source

      - name: Build WIN32-MingW Demo
        working-directory: FreeRTOS/Demo/WIN32-MingW
        run: |
          gcc --version
          make --version
          make

  POSIX-GCC:
    name: Native GCC
    runs-on: ubuntu-latest
    steps:
      - name: Checkout the FreeRTOS/FreeRTOS Repository
        uses: actions/checkout@v3
        with:
          ref: main
          repository: FreeRTOS/FreeRTOS
          submodules: 'recursive'
          fetch-depth: 1

      # Checkout user pull request changes
      - name: Checkout Pull Request
        uses: actions/checkout@v3
        with:
          path: ./FreeRTOS/Source

      - name: Install GCC
        shell: bash
        run: |
          sudo apt-get -y update
          sudo apt-get -y install build-essential

      - name: Build Posix_GCC Demo
        shell: bash
        working-directory: FreeRTOS/Demo/Posix_GCC
        run: make -j

      - name: Build Posix_GCC Demo for Coverage Test
        shell: bash
        working-directory: FreeRTOS/Demo/Posix_GCC
        run: make -j COVERAGE_TEST=1

  CMake-Example:
    name: CMake Example with Native GCC
    runs-on: ubuntu-latest
    steps:
      # Checkout user pull request changes
      - name: Checkout Repository
        uses: actions/checkout@v3

      - name: Install GCC
        shell: bash
        run: |
          sudo apt-get -y update
          sudo apt-get -y install build-essential

      - name: Build CMake Example Demo
        shell: bash
        working-directory: examples/cmake_example
        run: |
          cmake -S . -B build
          cmake --build build

      - name: Build CMake SMP Example Demo
        shell: bash
        working-directory: examples/cmake_example
        run: |
          cmake -S . -B build -DFREERTOS_SMP_EXAMPLE=1
          cmake --build build

  MSP430-GCC:
    name: GNU MSP430 Toolchain
    runs-on: ubuntu-latest
    steps:
      - name: Checkout the FreeRTOS/FreeRTOS Repository
        uses: actions/checkout@v3
        with:
          ref: main
          repository: FreeRTOS/FreeRTOS
          submodules: 'recursive'
          fetch-depth: 1

      # Checkout user pull request changes
      - name: Checkout Pull Request
        uses: actions/checkout@v3
        with:
          path: ./FreeRTOS/Source

      - name: Install MSP430 Toolchain
        shell: bash
        run: |
          sudo apt-get -y update
          sudo apt-get -y install gcc-msp430 build-essential

      - name: Build msp430_GCC Demo
        shell: bash
        working-directory: FreeRTOS/Demo/msp430_GCC
        run: make -j

  ARM-GCC:
    name: GNU ARM Toolchain
    runs-on: ubuntu-latest
    steps:
      - name: Checkout the FreeRTOS/FreeRTOS Repository
        uses: actions/checkout@v3
        with:
          ref: main
          repository: FreeRTOS/FreeRTOS
          fetch-depth: 1

      - name: Fetch Community-Supported-Demos Submodule
        shell: bash
        run: |
          # Fetch Community-Supported-Demos Submodule
          echo "::group::Fetch Community-Supported-Demos Submodule"
          git submodule update --checkout --init --depth 1 FreeRTOS/Demo/ThirdParty/Community-Supported-Demos
          echo "::engdroup::"
          if [ "$?" = "0" ]; then
            echo -e "\033[32;3mCloned the Community-Supported-Demos\033[0m"
          else
            echo -e "\033[32;31mCommunity-Supported-Demos Clone Failed...\033[0m"
            exit 1
          fi

      # Checkout user pull request changes
      - name: Checkout Pull Request
        uses: actions/checkout@v3
        with:
          path: ./FreeRTOS/Source

      - name: Install GNU ARM Toolchain
        shell: bash
        run: |
          sudo apt-get -y update
          sudo apt-get -y install gcc-arm-none-eabi build-essential cmake git ninja-build python3-minimal

      - name: Build CORTEX_MPU_M3_MPS2_QEMU_GCC Demo
        shell: bash
        working-directory: FreeRTOS/Demo/CORTEX_MPU_M3_MPS2_QEMU_GCC
        run: make -j

      - name: Build CORTEX_LM3S102_GCC Demo
        shell: bash
        working-directory: FreeRTOS/Demo/CORTEX_LM3S102_GCC
        run: make -j

      - name: Build CORTEX_LM3S811_GCC Demo
        shell: bash
        working-directory: FreeRTOS/Demo/CORTEX_LM3S811_GCC
        run: make -j

      - name: Build CORTEX_M0+_RP2040 Demos
        shell: bash
        working-directory: FreeRTOS/Demo/ThirdParty/Community-Supported-Demos/CORTEX_M0+_RP2040
        run: |
          git clone https://github.com/raspberrypi/pico-sdk.git
          cmake -B build -DPICO_SDK_PATH=pico-sdk -GNinja
          ninja -C build --verbose

      - name: Build CORTEX_MPS2_QEMU_IAR_GCC Demo
        shell: bash
        working-directory: FreeRTOS/Demo/CORTEX_MPS2_QEMU_IAR_GCC
        run: make -C build/gcc -j
