Repository navigation
Releases
v0.0.57
cmake/CompilerFlags.cmaketurns the unsafe floating-point optimizations off one by one,-fno-associative-math -fno-reciprocal-math -fsigned-zeros, in place of-fno-unsafe-math-optimizations(#129). In Clang 19 and later that flag also turned trapping math on, which put every Clang build in strict floating-point exception mode, against the file's own comment, and stopped every file on 32-bit ARM under warnings as errors. GCC's options are unchanged.
A library syncing takes this tag. Measured before release: maul-rhi's objects are byte-identical on linux-clang-20 and it now builds for armeabi-v7a; maul-audio's goldens, bake, voice and EQ figures and the objects of its two files with libm on constants are identical. A library with src/fpenv.c still refuses 32-bit ARM by design, since its float environment is known only on x86, AArch64 and WebAssembly.
v0.0.56
cpp.ymltakes a new input,download-keys: a glob of the files that pin what the build downloads by version and SHA-256 (#127). When it is set, the job tells the build where to keep its downloads (MAUL_DOWNLOAD_DIR), restores that folder from a cache keyed by the runner, the preset and those files, and saves it on main pushes when the restore missed. A glob that matches no file fails the job. Empty by default, so every current caller runs as before.
A caller passes the folder to FetchContent's DOWNLOAD_DIR after converting it with cmake_path(SET ...), since GitHub gives a Windows path with backslashes. The build still checks each kept file against its pinned hash.
v0.0.55
tools/fuzz_target.shkeeps up to fiveFILE:LINE: expectation failed: ...lines in a finding's report, read from the same part of the log above libFuzzer's first input dump as the sanitizer lines (#128). A harness whose check prints in that form now shows in CI which promise broke and with what values; a harness that prints nothing reports as before.docs/internals/maul-conventions.mdnames that form: a harness's failure message names the broken promise and the values that broke it, never the input's bytes.
A library syncing takes this tag. Nothing changes for a library until its harness prints in that form.
v0.0.54
src/cpu.h(renamed file) includes@LIB@/base.hand marks@P@IsCpuBackendSupportedand@P@CheckCpuwith@PP@_NODISCARD(#126), so a library carrying it passestools/check_nodiscard.pyfrom v0.0.53. maul2d, maul3d and maul-anim carry it.
A library syncing for the nodiscard check takes this tag rather than v0.0.53. A shared build of a library whose public base.h declares the two functions now compiles cpu.c with that declaration in view; its exports test shows any change.
v0.0.53
tools/check_nodiscard.py, new (#124): every internal function returningboolcarries the library's<PP>_NODISCARD, every one in asrc/header and every static one in a source file, parts intools/source-dirs.txtincluded. It reads the library's macro frombase.h, takes standard attributes and the two-linebool/name(shape clang-format writes, and fails on a bool declaration in any other shape. Run it with--self-testand without incheck.sh's rules step.maul-conventions.mdstates the rule and lists the check.src/inflate.c,src/elementary.candsrc/elementary_float.c(renamed files) mark their static bool functions; the two elementary files include@LIB@/base.h.
Each library takes these by syncing to this tag, wires the check into check.sh, and marks its own bool functions in the same pull request, with (void) where a drop is deliberate.
v0.0.52
cmake/Testing.cmake:maul_add_header_testsalso checks, in C23, that the library's<PP>_NODISCARDis not empty (#122). GCC 14 reports its C23 as__STDC_VERSION__202000L, so a macro that waited for 202311L was empty there and a dropped status went unwarned. Every library's main already passes; a library that went back to the old test now fails its header tests.maul-conventions.mdsays how the nodiscard macro reads C dialects and that the header tests check it in C23 and C++17.
Each library takes both files by syncing to this tag.
v0.0.51
maul-conventions.md: the rule on state a caller holds (v0.0.50) gains one exception (#120). A struct the header also documents as caller-built input may point into the library's data, provided the call that takes it reads through it as through any buffer argument: only within the ranges its own pointers and counts state, checking every value it reads there as untrusted, and relying on nothing the library validated earlier. A header line alone exempts nothing.
Each library takes the page by syncing to this tag. No script or workflow changed since v0.0.49.
v0.0.50
maul-conventions.md: one rule for state a caller holds (#119). Opaque state the library alone writes is checked by its cookie, its ABI version where it records one, and every index, slot and length being in bounds; a forged one is outside the contract. A value struct with documented fields that a call takes back from the caller carries no raw pointer and size into the library's data, but names what it came from and an index, checked on each call. Caller memory a call keeps "as checked" is read only within the extents recorded. A library's value struct that breaks this is a bug for it to fix, with!before 1.0.
Each library takes the page by syncing to this tag. No script or workflow changed since v0.0.49.
v0.0.49
maul/renamed/src/cpu.h:@P@CheckCpucarriesNOLINTNEXTLINE(readability-redundant-declaration), like the other two declarations since v0.0.46, so a library whose public header declares its CPU check (maul-anim'smaniCheckCpu) passes a header-filter tidy pass. The header comment says a library may declare any of the three publicly (#118).
maul2d, maul3d and maul-anim render this file and take it by syncing to this tag; everything else is as in v0.0.48. No workflow changed since v0.0.47.
v0.0.48
maul/files/tools/tidy_filter.sh(new family file):tidy_filter.sh <build tree> [subdirectory ...]prints clang-tidy's--header-filterfor a tree,^<CMAKE_HOME_DIRECTORY>/(src|include)/with the directory regex-escaped, and((rhi|window)/)?before it when subdirectories are named. It exits 1 when the cache has noCMAKE_HOME_DIRECTORY(#117).maul-conventions.md: every clang-tidy call passes the filter from this script, and a changed header tidies every source.
Each library takes it by syncing its family files to this tag (family_sync.py --write) and switching every clang-tidy call to filter=$(tools/tidy_filter.sh <tree> [subdirectories]) in the same pull request, assigned on its own line so a failure stops the step. Until then the nightly family check reports the file missing. No workflow changed since v0.0.47.