CI runs on pull requests to main, pushes to main and version tags. The build matrix contains a dependency-free core configuration plus full GCC and Clang configurations.
Every matrix entry performs four distinct checks: configure/build, CTest correctness tests, cmake --install, and a fresh downstream consumer build using find_package(TinyML CONFIG REQUIRED COMPONENTS Core). This catches packaging/export errors that an in-tree build cannot detect.
Core-only verification:
cmake -S . -B build-core -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DTINYML_BUILD_EXTENDED=OFF
cmake --build build-core --parallel
ctest --test-dir build-core --output-on-failureFull verification:
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build --parallel
ctest --test-dir build --output-on-failure --timeout 120Installed-consumer verification:
cmake --install build --prefix "$PWD/install"
cmake -S tests/install_consumer -B consumer-build -G Ninja \
-DCMAKE_PREFIX_PATH="$PWD/install"
cmake --build consumer-build
ctest --test-dir build --output-on-failure
./consumer-build/tinyml_install_consumerWall-clock thresholds are not release correctness gates on shared CI hardware. The tests still print measured timings, while assertions are enabled locally with:
TINYML_PERF_ASSERTS=1 ctest --test-dir build --output-on-failureBenchmarks are excluded from normal builds and from CTest. Enable the supported benchmark targets explicitly:
cmake -S . -B build-bench \
-DCMAKE_BUILD_TYPE=Release \
-DTINYML_BUILD_TESTS=OFF \
-DTINYML_BUILD_BENCHMARKS=ON
cmake --build build-bench --parallelBenchmark numbers should be recorded with compiler, flags, CPU, operating system, power mode and dataset/input shape. Results from an unspecified shared runner are not suitable for performance claims.
The following tests remain compiled but disabled in the default CTest run:
| Test | Status |
|---|---|
Phase8PhysicsInformedTest |
Long-running experiment; unsuitable for the fast release gate |
Phase8PhysicsComprehensiveTest |
Non-deterministic convergence; requires a deterministic acceptance criterion |
Phase12ReinforcementTest |
Known Linux failure; module remains preview until fixed |
A module with a known-failure test cannot graduate to the stable API surface.
Run an individual disabled test locally with CTest's disabled-test override, for example:
ctest --test-dir build -R Phase12ReinforcementTest \
--output-on-failure --force-new-ctest-processSanitizer runs and dedicated-hardware performance baselines are appropriate release-hardening checks, but they are intentionally separate from the current fast CI matrix. They should be added only when the corresponding test corpus is deterministic enough that a failure represents a code defect rather than runner variance.
A v* tag is packaged from the CMake install graph. The release job produces separate core and extended archives and SHA-256 checksums. The core archive contains no xsimd dependency. The extended package records xsimd as a CMake dependency rather than vendoring it into the TinyML SDK.