Skip to content

shoggoth compiles under Nimony; sem: a subscript on an erroneous operand reports it #7643

shoggoth compiles under Nimony; sem: a subscript on an erroneous operand reports it

shoggoth compiles under Nimony; sem: a subscript on an erroneous operand reports it #7643

Workflow file for this run

name: nif ci
on:
push:
branches:
- 'master'
pull_request:
# One in-flight run per branch/PR. The Windows job alone is ~40 minutes, so
# without this every follow-up push to an open PR leaves the superseded run
# burning a full matrix to produce results nobody will look at. `master` is
# excluded from cancellation (github.sha makes its group unique per commit)
# so the history of green builds there stays complete.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.ref == 'refs/heads/master' && github.sha || '' }}
cancel-in-progress: true
# The suite runs as TWO jobs per platform, in parallel:
#
# build — the tree walk minus `tests/boot`
# boot — `tests/boot` (the deterministic 3-stage self-host) on its own
#
# They are independent: `boot` reads `bin/` and writes `bin0..bin3` +
# `nimcache/boot`, the tree walk writes `nimcache/.par`. Serially the bootstrap
# was 601s of the 1917s Windows run (measured 2026-08-02) with everything else
# waiting on it, so splitting takes that platform's wall time down by roughly a
# third. The cost is a second runner per platform, which re-does the ~1 minute
# of setup and the toolchain build.
#
# Both jobs share the `.github/actions/setup` preamble; each adds one step.
jobs:
build:
strategy:
fail-fast: false
max-parallel: 20
matrix:
branch: [master]
target:
# `builder` lives on the target (not a keyed `include`) because the
# two linux rows need different runners: amd64 on ubuntu-24.04,
# arm64 on the arm-hosted image. An os-keyed include can't express
# that split.
- os: linux
cpu: amd64
nim_branch: devel
builder: ubuntu-24.04
- os: linux
cpu: i386
nim_branch: devel
builder: ubuntu-24.04
# linux/arm64 exercises the asm-generic `struct stat` layout and the
# arm64-divergent fcntl constants (O_DIRECTORY et al) that no other
# job reaches; tposixabi static_asserts the whole transcription
# against this platform's real headers — see nim-lang/nimony#2155.
- os: linux
cpu: arm64
nim_branch: devel
builder: ubuntu-24.04-arm
- os: macos
cpu: arm64
nim_branch: devel
builder: macos-15
- os: windows
cpu: amd64
nim_branch: devel
builder: windows-2025
name: '${{ matrix.target.os }}-${{ matrix.target.cpu }}-nim-${{ matrix.target.nim_branch }} (${{ matrix.branch }})'
runs-on: ${{ matrix.target.builder }}
env:
NIM_DIR: nim-${{ matrix.target.nim_branch }}-${{ matrix.target.cpu }}
NIM_BRANCH: ${{ matrix.target.nim_branch }}
NIM_ARCH: ${{ matrix.target.cpu }}
steps:
# A local `uses:` needs the action's file on disk first, and the setup
# action itself owns the real checkout (it has to configure `core.autocrlf`
# before git touches any source). So fetch just `.github/actions` into a
# path of its own — `nimony/` must stay untouched here, or this sparse
# config would be what the real checkout inherits.
- uses: actions/checkout@v7
with:
path: ci-actions
sparse-checkout: .github/actions
sparse-checkout-cone-mode: false
- uses: ./ci-actions/.github/actions/setup
with:
cpu: ${{ matrix.target.cpu }}
nim_branch: ${{ matrix.target.nim_branch }}
- name: Test building nimony (Linux i386)
# i386 runs no tests yet (see the tester step below), so without this it
# would assert nothing at all. `build all` is the coverage it does have:
# that the toolchain still compiles for a 32-bit target.
if: matrix.target.cpu == 'i386'
run: |
cd nimony
nim c -r src/hastur/hastur --release build all
- name: Run tester
if: matrix.target.cpu != 'i386' # TODO: enables i386
# Every platform tests with its default C toolchain. Windows forced
# clang from #1846 on ("faster cc step"), but an A/B of this exact
# step on identical runners measured gcc 1568s vs clang 1912s, and
# local 3x3 reps at 4 cores agree (gcc 683-830s, clang 854-933s).
# Export NIMONY_CC=clang here to exercise the clang-on-MinGW path
# again; tools/tester.nim then also adds the -fuse-ld=lld that
# clang's native PE TLS needs (ld.bfd lays out `.tls$` wrong).
#
# HASTUR_SKIP hands `tests/boot` to the `boot` job below. Unset — as it
# is for anyone running `nim c -r tools/tester.nim` locally — the tester
# still walks the whole tree, bootstrap included.
env:
HASTUR_SKIP: tests/boot
run: |
cd nimony
nim c -r tools/tester.nim
boot:
strategy:
fail-fast: false
max-parallel: 20
matrix:
branch: [master]
# No i386 row: that target runs no tests yet, so there is no bootstrap
# to run either. Otherwise this mirrors `build`'s matrix.
target:
- os: linux
cpu: amd64
nim_branch: devel
builder: ubuntu-24.04
- os: linux
cpu: arm64
nim_branch: devel
builder: ubuntu-24.04-arm
- os: macos
cpu: arm64
nim_branch: devel
builder: macos-15
- os: windows
cpu: amd64
nim_branch: devel
builder: windows-2025
name: 'boot ${{ matrix.target.os }}-${{ matrix.target.cpu }}-nim-${{ matrix.target.nim_branch }} (${{ matrix.branch }})'
runs-on: ${{ matrix.target.builder }}
env:
NIM_DIR: nim-${{ matrix.target.nim_branch }}-${{ matrix.target.cpu }}
NIM_BRANCH: ${{ matrix.target.nim_branch }}
NIM_ARCH: ${{ matrix.target.cpu }}
steps:
# A local `uses:` needs the action's file on disk first, and the setup
# action itself owns the real checkout (it has to configure `core.autocrlf`
# before git touches any source). So fetch just `.github/actions` into a
# path of its own — `nimony/` must stay untouched here, or this sparse
# config would be what the real checkout inherits.
- uses: actions/checkout@v7
with:
path: ci-actions
sparse-checkout: .github/actions
sparse-checkout-cone-mode: false
- uses: ./ci-actions/.github/actions/setup
with:
cpu: ${{ matrix.target.cpu }}
nim_branch: ${{ matrix.target.nim_branch }}
- name: Build the toolchain
# `tests/boot/setup.nim` requires a fully populated `bin/`, and a directly
# named suite does not run `tests/setup.hastur` (which is what builds it
# during a tree walk) — so the build is its own command here.
#
# `build all` includes arkham + nifasm (from the sibling `../nativenif`
# checked out by the setup action), which is what a native boot needs in
# `bin/`. WHICH backend the bootstrap then takes is `useNativeBoot`'s
# call, in Nim, per host — nothing here selects it. It matters that this
# step runs at all, though: the artifact cache is restored through a
# `restore-keys:` prefix, so a commit touching `src/**` gets the PREVIOUS
# commit's `bin/` handed to it and would otherwise boot stale tools.
run: |
cd nimony
nim c -r src/hastur/hastur --release build all
- name: Run native backend tests (Linux amd64)
# The curated native regression set (full ARC suite + closures + cps)
# through `nimony n`. Only Linux amd64 runs it as a step of its own:
# Windows reaches the same corpus from inside the tree walk instead,
# which compiles every whitelisted test with `nimony n` rather than
# `nimony c` (see `walkUsesNative` in src/hastur/nativelist.nim) — there, skipping
# gcc and the linker is what the step is FOR, so the coverage costs no
# extra runner time. `NativeTestDirsWindows` is the list it reads.
if: runner.os == 'Linux' && matrix.target.cpu == 'amd64'
run: |
cd nimony
nim c -r src/hastur/hastur --release native
- name: Run bootstrap
# `hastur tests/boot` is the same suite the tree walk would have reached;
# naming it directly is what lets the other job skip it.
run: |
cd nimony
nim c -r src/hastur/hastur --release tests/boot