0.5.0
Repins the C library to openkal-musl 0.9.0, which answers truncate(2), repins openkal-linux 0.7.1 and openkal-macos 0.6.1, and makes a build able to state which version of the C library it holds.
What a program above this package gets
Two things that did not work now do, and neither is a C++ problem — both are std::filesystem reaching a system call.
std::filesystem::copy_file reported Resource temporarily unavailable for two ordinary files. libc++ opens a copy's source with O_RDONLY | O_NONBLOCK | O_BINARY, which on a kernel is meaningless for a regular file and is ignored. openkal-musl routes an O_NONBLOCK descriptor through the bounded-transfer path and expresses copy_file_range as a read/write loop, so every byte of a file copy went through it — and the backends' kal_timeout_read decoded a borrowed kal_stream handle with the decoder for an owned one, waiting upon the descriptor below the one it then transferred upon. EAGAIN is not in libc++'s fallback list, so the error reached the caller verbatim.
std::filesystem::resize_file worked for no path at all, because libc++ expresses it as the name-shaped truncate and only the descriptor-shaped ftruncate was answered.
Both reported in mcpplibs/openkal-linux#13.
A consumer can now say what it built
$ OPENKAL_MUSL_TRACE=enosys ./your-program
openkal-musl 0.9.0
Named before the program runs and whether or not anything is missing. Two rounds of that issue were answered against the wrong version because neither this line nor an honest uname release field existed. With the variable unset the library writes zero bytes to the error stream, asserted on every row of its matrix.
Verified through the index rather than through working trees
Every repository in this family substitutes working trees for its dependencies in CI, so none of those runs examines the index entry, the archive, its hash or the resolved graph. One program, one source file, differing only in the version its manifest names:
openkal-musl = "0.7.0" (index+mcpplibs@0.7.0 -> openkal-linux 0.7.0)
note: 1 of 16 pipes reported readable
FAIL: a pipe with a byte in it is reported readable
openkal-musl = "0.8.0" (index+mcpplibs@0.7.1 -> openkal-linux 0.7.1)
ok: truncate(2) by name
ok: the length set by name is reported
ok: a pipe with a byte in it is reported readable
Sixteen pipes, a byte written into each, poll(POLLIN) on each reading end. One of sixteen passed under the defect — the first, the only one whose neighbour below was not the previous pipe's writing end.