Platform support
mino targets C99 with no external dependencies beyond the C runtime and POSIX file primitives where available. Any conforming C99 toolchain on a reasonably modern OS should build and run mino. The list below names the platforms and toolchains exercised by CI and the floors below which no testing happens.
Continuously tested
Every push runs build + test suite + release-gate (where applicable) on four pinned GitHub-hosted runners covering every supported host architecture:
| Platform | Runner image | Compiler | Release gate |
|---|---|---|---|
| x86_64 Linux | ubuntu-24.04 | system cc (GCC) | yes |
| ARM64 Linux | ubuntu-24.04-arm | system cc (GCC) | yes |
| ARM64 Darwin | macos-14 | system cc (Apple Clang) | yes |
| x86_64 Windows | windows-2022 | MinGW-w64 gcc | smoke only |
Windows skips the composite release-gate because the ASan step relies on a libsanitizer that MinGW does not ship; the smoke build + test suite still gate every push on that runner. A separate cross-compile job runs on macos-14 every push and verifies that the committed CPJIT stencil byte tables for every supported target (ARM64 Linux, x86_64 Linux, x86_64 Darwin, x86_64 Windows) regenerate identically — this is the verification floor for x86_64 Darwin since GitHub has been retiring Intel Mac runners.
A nightly workflow (04:00 UTC daily) re-runs the release-gate plus extended suites (GC stress, fault injection, embedding stress) on the three non-Windows runners. Toolchain drift surfaces from the cron tick instead of waiting for the next PR to trip on it.
Language and library floors
- Standard: C99. Builds pass
-std=c99; the code does not rely on C11 or C++ features. - libc: a hosted C99 implementation with
math.h(link-lm). POSIXunistd.h,dirent.h, and the usualsys/stat.hsurface are assumed on non-Windows. - Threads: host responsibility. The runtime itself is single-threaded per
mino_state. Cross-state serialization uses a small internal mutex (pthreads on POSIX, Win32 primitives on Windows).
Recommended minimums
These floors are the oldest environments CI would plausibly cover if the runners moved down. Older versions often work but are not exercised.
| Platform | Minimum | Notes |
|---|---|---|
| Ubuntu | 20.04 | glibc 2.31, GCC 9, Clang 10. Anything GitHub still builds ubuntu-latest from. |
| macOS | 11 (Big Sur) | Apple Clang shipped with Xcode 12 and later. |
| Windows | 10 | MinGW-w64 GCC 9+ via MSYS2. MSVC is discussed below. |
| GCC | 9 | Any GCC with full C99 support works. 9 is the CI floor. |
| Clang | 10 | Apple Clang 12 or mainline Clang 10. Sanitizer build targets assume the modern driver. |
Windows and MSVC
Windows CI builds with MinGW-w64 gcc. MSVC is not in the CI matrix. Historical MSVC had weak C99 support; MSVC 2019 (v16.8) and later accept /std:c11 or /std:c17, which is a superset of C99 sufficient for mino. If you build with MSVC, pass /std:c11 (or later) and report build or runtime issues against the current release.
JIT support per host
The copy-and-patch JIT (CPJIT) ships byte tables for every supported host arch. The full mino binary auto-detects the host and enables the JIT; the parallel mino-lean binary is the same build with the JIT pipeline compiled out — useful when a host has no executable memory primitives, or when a smaller binary is more valuable than peak throughput.
| Host | Format | CPJIT byte tables |
|---|---|---|
| ARM64 Darwin | Mach-O 64 | yes (dev host; release-gate every push) |
| ARM64 Linux | ELF64 | yes (release-gate every push) |
| x86_64 Linux | ELF64 | yes (release-gate every push) |
| x86_64 Darwin | Mach-O 64 | yes (cross-compile parity every push) |
| x86_64 Windows | PE/COFF | yes (smoke build every push) |
Per-state runtime control lives behind mino_state_set_jit_mode (AUTO / OFF / ON) and mino_state_set_jit_hot_threshold (call-count before the JIT compiles a function); the CLI exposes both as --jit=auto|off|on and --jit-threshold=N. Capability discovery returns a mino_jit_capability struct documenting {available, mode, threshold, host_arch, host_os} so an embedder can size the host's tuning at startup.
Out of scope
- 32-bit targets. Pointer-tagging and heap layout assume a 64-bit word.
- Exotic libc implementations (uClibc, musl on niche distros, embedded bare-metal). These may work; none are tested.
- Pre-C99 compilers.
Reporting platform issues
If mino does not build or fails tests on a platform that meets the floors above, file an issue at github.com/leifericf/mino/issues with the compiler banner (cc --version), the OS release, and the failing command output.