name: MicroPython

on:
  push:
  pull_request:
  release:
    types: [created]

env:
  MICROPYTHON_VERSION: 9dfabcd6d3d080aced888e8474e921f11dc979bb

jobs:
  deps:
    runs-on: ubuntu-20.04
    name: Dependencies
    steps:
    - name: Workspace Cache
      id: cache
      uses: actions/cache@v2
      with:
        path: ${{runner.workspace}}
        key: workspace-micropython-${{env.MICROPYTHON_VERSION}}-with-libs
        restore-keys: |
          workspace-micropython-${{env.MICROPYTHON_VERSION}}-with-libs

    # Check out MicroPython
    - name: Checkout MicroPython
      if: steps.cache.outputs.cache-hit != 'true'
      uses: actions/checkout@v2
      with:
        repository: micropython/micropython
        ref: ${{env.MICROPYTHON_VERSION}}
        submodules: false  # MicroPython submodules are hideously broken
        path: micropython

    # Check out MicroPython Libs
    - name: Checkout MicroPython Libs
      if: steps.cache.outputs.cache-hit != 'true'
      uses: actions/checkout@v2
      with:
        repository: micropython/micropython-lib
        path: micropython-lib

    - name: Fetch base MicroPython submodules
      if: steps.cache.outputs.cache-hit != 'true'
      shell: bash
      working-directory: micropython
      run: git submodule update --init

    - name: Fetch Pico SDK submodules
      if: steps.cache.outputs.cache-hit != 'true'
      shell: bash
      working-directory: micropython/lib/pico-sdk
      run: git submodule update --init

    - name: Build mpy-cross
      if: steps.cache.outputs.cache-hit != 'true'
      shell: bash
      working-directory: micropython/mpy-cross
      run: make

  build:
    needs: deps
    name: Build  ${{matrix.name}} (${{matrix.board}})
    runs-on: ubuntu-20.04
    strategy:
      matrix:
        include:
        - name: picow
          board: PICO_W
        - name: picow_enviro
          board: PICO_W_ENVIRO
        - name: picow_galactic_unicorn
          board: PICO_W

    env:
      # MicroPython version will be contained in github.event.release.tag_name for releases
      RELEASE_FILE: pimoroni-${{matrix.name}}-${{github.event.release.tag_name || github.sha}}-micropython

    steps:
    - name: Compiler Cache
      uses: actions/cache@v2
      with:
        path: /home/runner/.ccache
        key: ccache-micropython-${{matrix.name}}-${{github.ref}}-${{github.sha}}
        restore-keys: |
          ccache-micropython-${{matrix.name}}-${{github.ref}}
          ccache-micropython-${{matrix.name}}-
  
    - name: Workspace Cache
      uses: actions/cache@v2
      with:
        path: ${{runner.workspace}}
        key: workspace-micropython-${{env.MICROPYTHON_VERSION}}-with-libs
        restore-keys: |
          workspace-micropython-${{env.MICROPYTHON_VERSION}}-with-libs

    - name: Install Compiler & CCache
      if: runner.os == 'Linux'
      run: |
        sudo apt update && sudo apt install ccache gcc-arm-none-eabi
  
    - uses: actions/checkout@v2
      with:
        submodules: true
        path: pimoroni-pico-${{ github.sha }}
  
    - name: "HACK: MicroPython Board Fixups"
      shell: bash
      working-directory: micropython/ports/rp2
      run: |
        ../../../pimoroni-pico-${GITHUB_SHA}/micropython/_board/board-fixup.sh ${{matrix.name}} ${{matrix.board}} ../../../pimoroni-pico-${GITHUB_SHA}/micropython/_board

    - name: Configure MicroPython
      shell: bash
      working-directory: micropython/ports/rp2
      run: |
        cmake -S . -B build-${{matrix.board}} -DPICO_BUILD_DOCS=0 -DUSER_C_MODULES=../../../pimoroni-pico-${GITHUB_SHA}/micropython/modules/micropython-${{matrix.name}}.cmake -DMICROPY_BOARD=${{matrix.board}} -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache

    - name: Build MicroPython
      shell: bash
      working-directory: micropython/ports/rp2
      run: |
        ccache --zero-stats || true
        cmake --build build-${{matrix.board}} -j 2
        ccache --show-stats || true

    - name: Rename .uf2 for artifact
      shell: bash
      working-directory: micropython/ports/rp2/build-${{matrix.board}}
      run: |
        cp firmware.uf2 $RELEASE_FILE.uf2
        cp firmware.elf $RELEASE_FILE.elf

    - name: Store .uf2 as artifact
      uses: actions/upload-artifact@v2
      with:
        name: ${{env.RELEASE_FILE}}.uf2
        path: micropython/ports/rp2/build-${{matrix.board}}/${{env.RELEASE_FILE}}.uf2

    - name: Store .elf as artifact
      uses: actions/upload-artifact@v2
      with:
        name: ${{env.RELEASE_FILE}}.elf
        path: micropython/ports/rp2/build-${{matrix.board}}/${{env.RELEASE_FILE}}.elf

    - name: Upload .uf2
      if: github.event_name == 'release'
      uses: actions/upload-release-asset@v1
      env:
        GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
      with:
        asset_path: micropython/ports/rp2/build-${{matrix.board}}/firmware.uf2
        upload_url: ${{github.event.release.upload_url}}
        asset_name: ${{env.RELEASE_FILE}}.uf2
        asset_content_type: application/octet-stream
