iyi

Platforms

Compiles for 9. Runs on five, every build.

Platform support here means three distinct checks, and each target reaches a different number of them. This page is the table, and every cell in it is a job and a line in one workflow.

What each check catches

  1. Type-checked. The library's platform files for that target compile, by cross-compiling with no linking. Catches a declaration that went missing from src/lib_c or src/crystal/system, which is invisible to every other job.
  2. Audited. An iyi program is cross-compiled for the target and the object is read for the symbols it leaves undefined. Catches a call nothing on that platform supplies, which a type-check cannot see.
  3. Run. The object is linked with the target's own toolchain and executed, and what it prints is compared with what the same program printed on the machine that built it. The only check that can fail for a reason the first two cannot reach.

The table

targettype-checkedobject auditedrunobject built by
x86_64-linux-gnuyesyesx86-64 glibcbuilt where it is run
x86_64-linux-muslyesnox86-64 muslObjects for other targets
aarch64-linux-gnuyesyesaarch64 under emulationObjects for other targets
arm-linux-gnueabihfyesnonobuilt where it is run
x86_64-darwinyesyesnobuilt where it is run
aarch64-darwinyesyesaarch64-darwin nativelybuilt where it is run
x86_64-w64-mingw32yesyesnobuilt where it is run
x86_64-windows-msvcyesyesnoObjects for other targets
wasm32-wasiyesyeswasm32-wasi under wasmtimeObjects for other targets

The five that run are x86-64 glibc, x86-64 musl, aarch64 under emulation, aarch64-darwin natively, wasm32-wasi under wasmtime. The rest type-check and have their objects audited, which is a weaker claim, and this page makes the difference visible rather than averaging it into one word.

The two loops, as they are written

Type-check the standard library for each target

9 targets, in the job targets. Cross-compiling emits an object and links nothing, so a library missing from the runner is not a failure and a declaration missing from the source is.

the type-check loop.github/workflows/iyi.yml, lines 985 to 987
for target in x86_64-linux-gnu x86_64-linux-musl aarch64-linux-gnu \
              arm-linux-gnueabihf x86_64-darwin aarch64-darwin \
              x86_64-w64-mingw32 x86_64-windows-msvc wasm32-wasi; do

What an iyi program asks each platform for

7 targets crossed with 5 programs (hello, webapp, io, socket, format), each object read for what it leaves undefined. Each program carries per-platform branches, and a branch only its own platform compiles is a branch nobody checks.

the audit loop.github/workflows/iyi.yml, lines 1014 to 1016
for target in x86_64-linux-gnu aarch64-linux-gnu x86_64-darwin \
              aarch64-darwin x86_64-windows-msvc x86_64-windows-gnu \
              wasm32-wasi; do

The audit loop writes x86_64-windows-gnu, which is the same platform the type-check loop lists under another of the compiler's names for it. The table above maps the two, and the generator behind it checks its audited set against the one read from the repository's own prose, so a spelling that turns into a real difference fails the build rather than this paragraph.

Where a cross-compiled object goes to be run

One job builds the objects for the other platforms; 5 jobs consume them. They are listed here by their own names, and each appears because it says it needs cross-objects, not because this page decided it was relevant.

Windows is in that list and not in the run set, and those are two different statements. The run set is the targets whose output is compared against what the same program printed on the machine that compiled it; Windows binaries are executed all the same, on the machines named beside each job above, and on the rest of the workflow's Windows jobs, which consume no cross-built object because they build their own there:

That is 8 jobs on a Windows machine every build, and every one is on the list release waits for, so a red one stops a tag rather than being read after it. The why page says what that means for somebody considering it.