Build
March has been a big month for SC::Build.
Introducing the standalone native backend to build executables directly!
It now supports static libraries, shared libraries, direct host builds on Windows, binary stripping and more control over exported symbols.
Parallel compile jobs and scheduling of independent projects are already in in this first draft, but more features will be coming!
Detailed list of commits:
- Build: Add a standalone build backend and support for static libraries
- Build: Parallelize compile jobs in standalone native backend
- Build: Add Windows implementation to native backend
- Build: Parallel scheduling of independent projects
- Build: Add support for binaries stripping
- Build: Add support for shared libraries
- Build: Enable preserving export symbols for given libraries and directories
- Everywhere: Make it possible to export symbols per library
- Documentation: Add information about the new Build native backend
- Documentation: Improve Build documentation
Http and HttpClient
The Http work this month has been improving the hot path while cleaning up the internal API surface.
A parser benchmark has been added, the parser itself gained a specialized fast path, and both request parsing and response header emission have been tightened up.
On the server side, Http also gained chunked encoding support and better AsyncFileServer PUT handling.
These are the kind of features that slowly move a draft implementation away from toy examples and toward something that can be stress-tested more seriously.
The biggest user-facing addition is probably the new HttpClient library.
It is a separate streaming-first HTTP client built on native OS backends (NSURLSession on Apple, WinHTTP on Windows and libcurl on Linux), while keeping the same caller-owned memory style used by the rest of the project.
Detailed list of commits:
- Http: Add parser benchmark
- Http: Add a specialized fast path to HttpParser
- Http: Optimize request headers parsing and response headers emission
- Http: Improve AsyncFileServer PUT support
- Http: Extract common Request/Response code into Incoming/Outgoing
- Http: Improve headers parser
- Http: Add server side chunked encoding and draft http client
- HttpClient: Add standalone http(s) client library based on OS API
Platform and Runtime
Another major theme of the month has been widening the platform surface exposed by the lower level libraries.
FileSystem and File received a proper batch of metadata, permission and descriptor APIs, including link metadata, stat / lstat, path permissions, descriptor stat / sync / permissions, and reading stored symlink targets on Windows.
These are not especially flashy additions, but they matter because they reduce the amount of platform-specific glue needed by applications built on top of Sane C++. The libraries become more useful precisely when they cover this boring but essential operating-system surface in a clean and cross-platform way.
At the same time Socket and Async keep filling in some gaps with TCP_NODELAY, multicast, AsyncSignal, clearer io_uring diagnostics, explicit wake-up coalescing, easier OS-handle association helpers and a fix to make offset-zero writes use pwrite / pwritev instead of silently falling back to write / writev.
Detailed list of commits:
- Socket: Expose TCP_NODELAY
- Socket: Add multicast support
- Async: Add AsyncSignal
- Async: Explicit offset 0 now uses pwrite/pwritev instead of falling back to write/writev
- Async: When stopping flag async with NeedsTeardown on poll‑based backends
- FileSystem: Add link metadata operations and cross-platform tests
- FileSystem: Add stat and lstat metadata APIs
- FileSystem: Add path permission operations
- File: Add descriptor stat/sync/permission APIs
- FileSystem: Read stored symlink targets on Windows
- Async: Add an explicit coalesce option to AsyncLoopWakeUp
- Async: Add handy overloads for associating / removing os handles
- Async: Print errno value on io_uring failures
AsyncStreams and Tooling
AsyncStreams can now reason about backpressure more precisely inside AsyncPipeline, slice buffers more conveniently, check whether a readable stream can be started, and most importantly it has dropped an internal dependency on Async.
That same dependency cleanup extends to FileSystemWatcher, which now uses a template-based approach to avoid depending directly on Async, while Linux relative-path storage has been improved too.
These changes are useful because they keep the dependency graph tighter and make the individual libraries easier to reuse in isolation.
The month also brought a few practical tooling improvements: a command line parser in Strings, a more reliable bootstrap timestamp check, updated tool dependencies, and repository skills for the various libraries and workflows.
Detailed list of commits:
- AsyncStreams: Handle backpressure more precisely inside AsyncPipeline
- AsyncStream: Allow slicing buffer in equal parts up to number of available buffers
- FileSystemWatcher: Increment relative path storage for Linux
- FileSystemWatcher: Use a template to break dependency from Async
- AsyncStreams: Get rid of internal dependency on Async
- Strings: Add command line parser
- Tools: Use high resolution modification time in bootstrap
- AsyncStreams: Add method to check if a readable stream can be started
- Tools: Remove 7zip and update clang to 20.1.8
- Skills: Add skills for all libraries and some additional workflows
See you next month!