name: unix port

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

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  minimal:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v7
    - name: Build
      run: tools/ci.sh unix_minimal_build
    - name: Run main test suite
      run: tools/ci.sh 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@v7
    - name: Build with reproducible date
      run: tools/ci.sh unix_minimal_build
      env:
        SOURCE_DATE_EPOCH: 1234567890
    - name: Check reproducible build date
      run: echo | ports/unix/build-minimal/micropython -i | grep 'on 2009-02-13;'

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

  standard_v2:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v7
    - name: Build
      run: tools/ci.sh unix_standard_v2_build
    - name: Run main test suite
      run: tools/ci.sh unix_standard_v2_run_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  standard_error_terse:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v7
    - name: Build
      run: tools/ci.sh unix_standard_error_terse_build
    - name: Run main test suite
      run: tools/ci.sh unix_standard_error_terse_run_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  standard_error_none:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v7
    - name: Build
      run: tools/ci.sh unix_standard_error_none_build
    - name: Run main test suite
      run: tools/ci.sh unix_standard_error_none_run_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  coverage:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v7
    - uses: actions/setup-python@v7
      # Python 3.12 is the default for ubuntu-24.04, but that has compatibility issues with settrace tests.
      # Can remove this step when ubuntu-latest uses a more recent Python 3.x as the default.
      with:
        python-version: '3.11'
    - name: Install packages
      run: tools/ci.sh unix_coverage_setup
    - name: Build
      run: tools/ci.sh unix_coverage_build
    - name: Run main test suite
      run: tools/ci.sh unix_coverage_run_tests
    - name: Test merging .mpy files
      run: tools/ci.sh unix_coverage_run_mpy_merge_tests
    - name: Build native mpy modules
      run: tools/ci.sh native_mpy_modules_build
    - name: Test importing .mpy generated by mpy_ld.py
      run: tools/ci.sh 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@v7
      with:
        # Only fail the job on error if a token is set, or we're running against upstream repo.
        # This avoids the annoying situation of the job failing on every push to a fork (if no token is set).
        fail_ci_if_error: ${{ secrets.CODECOV_TOKEN != '' || github.repository_owner == 'micropython' }}
        verbose: true
        flags: unix-coverage-64bit
        name: unix-coverage-64bit
        # note: when a fork opens a PR into MicroPython repo, the pull_request trigger can't access
        # secrets so this token value will be empty (codecov will do a 'tokenless' upload).
        token: ${{ secrets.CODECOV_TOKEN }}
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  coverage_32bit:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v7
    - uses: actions/setup-python@v7
      # Python 3.12 is the default for ubuntu-24.04, but that has compatibility issues with settrace tests.
      # Can remove this step when ubuntu-latest uses a more recent Python 3.x as the default.
      with:
        python-version: '3.11'
    - name: Install packages
      run: tools/ci.sh unix_32bit_setup
    - name: Build
      run: tools/ci.sh unix_coverage_32bit_build
    - name: Run main test suite
      run: tools/ci.sh unix_coverage_32bit_run_tests
    - name: Build native mpy modules
      run: tools/ci.sh native_mpy_modules_32bit_build
    - name: Test importing .mpy generated by mpy_ld.py
      run: tools/ci.sh unix_coverage_32bit_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@v7
      with:
        # See corresponding comment above.
        fail_ci_if_error: ${{ secrets.CODECOV_TOKEN != '' || github.repository_owner == 'micropython' }}
        verbose: true
        flags: unix-coverage-32bit
        name: unix-coverage-32bit
        # See corresponding comment above.
        token: ${{ secrets.CODECOV_TOKEN }}
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  nanbox:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v7
    - uses: actions/setup-python@v7
      # Python 3.12 is the default for ubuntu-24.04, but that has compatibility issues with settrace tests.
      # Can remove this step when ubuntu-latest uses a more recent Python 3.x as the default.
      with:
        python-version: '3.11'
    - name: Install packages
      run: tools/ci.sh unix_32bit_setup
    - name: Build
      run: tools/ci.sh unix_nanbox_build
    - name: Run main test suite
      run: tools/ci.sh unix_nanbox_run_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  longlong:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v7
    - uses: actions/setup-python@v7
      # Python 3.12 is the default for ubuntu-24.04, but that has compatibility issues with settrace tests.
      # Can remove this step when ubuntu-latest uses a more recent Python 3.x as the default.
      with:
        python-version: '3.11'
    - name: Install packages
      run: tools/ci.sh unix_32bit_setup
    - name: Build
      run: tools/ci.sh unix_longlong_build
    - name: Run main test suite
      run: tools/ci.sh unix_longlong_run_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

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

  gil_enabled:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v7
    - name: Build
      run: tools/ci.sh unix_gil_enabled_build
    - name: Run main test suite
      run: tools/ci.sh unix_gil_enabled_run_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  stackless_clang:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v7
    - name: Install packages
      run: tools/ci.sh unix_clang_setup
    - name: Build
      run: tools/ci.sh unix_stackless_clang_build
    - name: Run main test suite
      run: tools/ci.sh unix_stackless_clang_run_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  float_clang:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v7
    - name: Install packages
      run: tools/ci.sh unix_clang_setup
    - name: Build
      run: tools/ci.sh unix_float_clang_build
    - name: Run main test suite
      run: tools/ci.sh unix_float_clang_run_tests
    - name: Build native mpy modules
      run: tools/ci.sh native_mpy_modules_clang_build
    - name: Test importing .mpy generated by mpy_ld.py
      run: tools/ci.sh unix_standard_run_native_mpy_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  settrace_stackless:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v7
    - uses: actions/setup-python@v7
      # Python 3.12 is the default for ubuntu-24.04, but that has compatibility issues with settrace tests.
      # Can remove this step when ubuntu-latest uses a more recent Python 3.x as the default.
      with:
        python-version: '3.11'
    - name: Build
      run: tools/ci.sh unix_settrace_stackless_build
    - name: Run main test suite
      run: tools/ci.sh unix_settrace_stackless_run_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  repr_b:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v7
    - uses: actions/setup-python@v7
      # Python 3.12 is the default for ubuntu-24.04, but that has compatibility issues with settrace tests.
      # Can remove this step when ubuntu-latest uses a more recent Python 3.x as the default.
      with:
        python-version: '3.11'
    - name: Install packages
      run: tools/ci.sh unix_32bit_setup
    - name: Build
      run: tools/ci.sh unix_repr_b_build
    - name: Run main test suite
      run: tools/ci.sh unix_repr_b_run_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  macos:
    runs-on: macos-26
    steps:
    - uses: actions/checkout@v7
    - uses: actions/setup-python@v7
      with:
        python-version: '3.8'
    - name: Build
      run: tools/ci.sh unix_macos_build
    - name: Run tests
      run: tools/ci.sh 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@v7
    - uses: actions/setup-python@v7
      # Python 3.12 is the default for ubuntu-24.04, but that has compatibility issues with settrace tests.
      # Can remove this step when ubuntu-latest uses a more recent Python 3.x as the default.
      with:
        python-version: '3.11'
    - name: Install packages
      run: tools/ci.sh unix_qemu_mips_setup
    - name: Build
      run: tools/ci.sh unix_qemu_mips_build
    - name: Run main test suite
      run: tools/ci.sh 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@v7
    - uses: actions/setup-python@v7
      # Python 3.12 is the default for ubuntu-24.04, but that has compatibility issues with settrace tests.
      # Can remove this step when ubuntu-latest uses a more recent Python 3.x as the default.
      with:
        python-version: '3.11'
    - name: Install packages
      run: tools/ci.sh unix_qemu_arm_setup
    - name: Build
      run: tools/ci.sh unix_qemu_arm_build
    - name: Run main test suite
      run: tools/ci.sh unix_qemu_arm_run_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  qemu_riscv64:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v7
    - uses: actions/setup-python@v7
      # Python 3.12 is the default for ubuntu-24.04, but that has compatibility issues with settrace tests.
      # Can remove this step when ubuntu-latest uses a more recent Python 3.x as the default.
      with:
        python-version: '3.11'
    - name: Install packages
      run: tools/ci.sh unix_qemu_riscv64_setup
    - name: Build
      run: tools/ci.sh unix_qemu_riscv64_build
    - name: Run main test suite
      run: tools/ci.sh unix_qemu_riscv64_run_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  qemu_loong64:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v7
    - uses: actions/setup-python@v7
      # Python 3.12 is the default for ubuntu-24.04, but that has compatibility issues with settrace tests.
      # Can remove this step when ubuntu-latest uses a more recent Python 3.x as the default.
      with:
        python-version: '3.11'
    - name: Install packages
      run: tools/ci.sh unix_qemu_loong64_setup
    - name: Build
      run: tools/ci.sh unix_qemu_loong64_build
    - name: Run main test suite
      run: tools/ci.sh unix_qemu_loong64_run_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  qemu_x64:
    runs-on: ubuntu-24.04-arm
    steps:
    - uses: actions/checkout@v7
    - uses: actions/setup-python@v7
      # Python 3.12 is the default for ubuntu-24.04, but that has compatibility issues with settrace tests.
      # Can remove this step when ubuntu-latest uses a more recent Python 3.x as the default.
      with:
        python-version: '3.11'
    - name: Install packages
      run: tools/ci.sh unix_qemu_x64_setup
    - name: Build
      run: tools/ci.sh unix_qemu_x64_build
    - name: Run main test suite
      run: tools/ci.sh unix_qemu_x64_run_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  sanitize_address:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v7
    - uses: actions/setup-python@v7
      # Python 3.12 is the default for ubuntu-24.04, but that has compatibility issues with settrace tests.
      # Can remove this step when ubuntu-latest uses a more recent Python 3.x as the default.
      with:
        python-version: '3.11'
    - name: Install packages
      run: tools/ci.sh unix_coverage_setup
    - name: Build
      run: tools/ci.sh unix_sanitize_address_build
    - name: Run main test suite
      run: tools/ci.sh unix_sanitize_address_run_tests
    - name: Test merging .mpy files
      run: tools/ci.sh unix_coverage_run_mpy_merge_tests
    - name: Build native mpy modules
      run: tools/ci.sh native_mpy_modules_build
    - name: Test importing .mpy generated by mpy_ld.py
      run: tools/ci.sh unix_coverage_run_native_mpy_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures

  sanitize_undefined:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v7
    - uses: actions/setup-python@v7
      # Python 3.12 is the default for ubuntu-24.04, but that has compatibility issues with settrace tests.
      # Can remove this step when ubuntu-latest uses a more recent Python 3.x as the default.
      with:
        python-version: '3.11'
    - name: Install packages
      run: tools/ci.sh unix_coverage_setup
    - name: Build
      run: tools/ci.sh unix_sanitize_undefined_build
    - name: Run main test suite
      run: tools/ci.sh unix_sanitize_undefined_run_tests
    - name: Test merging .mpy files
      run: tools/ci.sh unix_coverage_run_mpy_merge_tests
    - name: Build native mpy modules
      run: tools/ci.sh native_mpy_modules_build
    - name: Test importing .mpy generated by mpy_ld.py
      run: tools/ci.sh unix_coverage_run_native_mpy_tests
    - name: Print failures
      if: failure()
      run: tests/run-tests.py --print-failures
