name: unix port

on:
  push:
  pull_request:
    paths:
      - '.github/workflows/*.yml'
      - 'tools/**'
      - 'py/**'
      - 'extmod/**'
      - 'lib/**'
      - 'examples/**'
      - 'ports/unix/**'
      - 'tests/**'

jobs:
  minimal:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Build
      run: source tools/ci.sh && ci_unix_minimal_build
    - name: Run main test suite
      run: source tools/ci.sh && ci_unix_minimal_run_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  reproducible:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Build with reproducible date
      run: source tools/ci.sh && ci_unix_minimal_build
      env:
        SOURCE_DATE_EPOCH: 1234567890
    - name: Check reproducible build date
      run: echo | ports/unix/build-minimal/micropython-minimal -i | grep 'on 2009-02-13;'

  standard:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Build
      run: source tools/ci.sh && ci_unix_standard_build
    - name: Run main test suite
      run: source tools/ci.sh && ci_unix_standard_run_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  dev:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Build
      run: source tools/ci.sh && ci_unix_dev_build
    - name: Run main test suite
      run: source tools/ci.sh && ci_unix_dev_run_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  coverage:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Install packages
      run: source tools/ci.sh && ci_unix_coverage_setup
    - name: Build
      run: source tools/ci.sh && ci_unix_coverage_build
    - name: Run main test suite
      run: source tools/ci.sh && ci_unix_coverage_run_tests
    - name: Test merging .mpy files
      run: source tools/ci.sh && ci_unix_coverage_run_mpy_merge_tests
    - name: Build native mpy modules
      run: source tools/ci.sh && ci_native_mpy_modules_build
    - name: Test importing .mpy generated by mpy_ld.py
      run: source tools/ci.sh && ci_unix_coverage_run_native_mpy_tests
    - name: Run gcov coverage analysis
      run: |
        (cd ports/unix && gcov -o build-coverage/py ../../py/*.c || true)
        (cd ports/unix && gcov -o build-coverage/extmod ../../extmod/*.c || true)
    - name: Upload coverage to Codecov
      uses: codecov/codecov-action@v1
      with:
        fail_ci_if_error: true
        verbose: true
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  coverage_32bit:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Install packages
      run: source tools/ci.sh && ci_unix_32bit_setup
    - name: Build
      run: source tools/ci.sh && ci_unix_coverage_32bit_build
    - name: Run main test suite
      run: source tools/ci.sh && ci_unix_coverage_32bit_run_tests
    - name: Build native mpy modules
      run: source tools/ci.sh && ci_native_mpy_modules_32bit_build
    - name: Test importing .mpy generated by mpy_ld.py
      run: source tools/ci.sh && ci_unix_coverage_32bit_run_native_mpy_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  nanbox:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Install packages
      run: source tools/ci.sh && ci_unix_32bit_setup
    - name: Build
      run: source tools/ci.sh && ci_unix_nanbox_build
    - name: Run main test suite
      run: source tools/ci.sh && ci_unix_nanbox_run_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  float:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Build
      run: source tools/ci.sh && ci_unix_float_build
    - name: Run main test suite
      run: source tools/ci.sh && ci_unix_float_run_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  stackless_clang:
    runs-on: ubuntu-20.04
    steps:
    - uses: actions/checkout@v2
    - name: Install packages
      run: source tools/ci.sh && ci_unix_clang_setup
    - name: Build
      run: source tools/ci.sh && ci_unix_stackless_clang_build
    - name: Run main test suite
      run: source tools/ci.sh && ci_unix_stackless_clang_run_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  float_clang:
    runs-on: ubuntu-20.04
    steps:
    - uses: actions/checkout@v2
    - name: Install packages
      run: source tools/ci.sh && ci_unix_clang_setup
    - name: Build
      run: source tools/ci.sh && ci_unix_float_clang_build
    - name: Run main test suite
      run: source tools/ci.sh && ci_unix_float_clang_run_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  settrace:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Build
      run: source tools/ci.sh && ci_unix_settrace_build
    - name: Run main test suite
      run: source tools/ci.sh && ci_unix_settrace_run_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  settrace_stackless:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Build
      run: source tools/ci.sh && ci_unix_settrace_stackless_build
    - name: Run main test suite
      run: source tools/ci.sh && ci_unix_settrace_stackless_run_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  macos:
    runs-on: macos-11.0
    steps:
    - uses: actions/checkout@v2
    - uses: actions/setup-python@v2
      with:
        python-version: '3.8'
    - name: Build
      run: source tools/ci.sh && ci_unix_macos_build
    - name: Run tests
      run: source tools/ci.sh && ci_unix_macos_run_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  qemu_mips:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Install packages
      run: source tools/ci.sh && ci_unix_qemu_mips_setup
    - name: Build
      run: source tools/ci.sh && ci_unix_qemu_mips_build
    - name: Run main test suite
      run: source tools/ci.sh && ci_unix_qemu_mips_run_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  qemu_arm:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Install packages
      run: source tools/ci.sh && ci_unix_qemu_arm_setup
    - name: Build
      run: source tools/ci.sh && ci_unix_qemu_arm_build
    - name: Run main test suite
      run: source tools/ci.sh && ci_unix_qemu_arm_run_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures
