v0.1.2
ipcprims v0.1.2
Release date: 2026-02-15
Lifecycle phase: alpha
License: MIT OR Apache-2.0
Summary
Release pipeline: multi-platform FFI build matrix, SBOM generation, and structured draft releases — matching the sysprims/docprims release pattern. Resolves the v0.1.1 known issue where release.yml was still the minimal v0.1.0 skeleton.
release.yml Rewrite
Complete rewrite from 4-job skeleton to 14 release-specific jobs (35 total including CI workflow_call).
Release Jobs
| Job | Runner | Purpose |
|---|---|---|
validate-version |
ubuntu-latest | Tag matches VERSION file, outputs version |
ci |
(workflow_call) | Full CI suite (21 jobs) |
verify-go-bindings-assets |
ubuntu-latest | Verify prebuilt libs for 7 platforms in Go module |
build-linux |
ubuntu-latest (container) | 4-target matrix (x64/arm64 x glibc/musl), CLI + FFI |
build-macos |
macos-latest | x64 + arm64, CLI + FFI, @rpath dylib fix |
build-windows |
windows-latest | MinGW/GNU x64, FFI only (CGo compat) |
build-windows-arm64 |
windows-latest-arm64-s | MSVC arm64, FFI only (self-hosted) |
build-windows-msvc |
windows-latest | MSVC x64 shared-only, FFI only |
cbindgen |
ubuntu-latest (container) | Generate ipcprims.h C header |
sbom |
ubuntu-latest (container) | CycloneDX SBOM via syft |
verify-ffi-shared-assets |
ubuntu-latest | Verify shared libs present, no musl shared |
package-ffi-bundle |
ubuntu-latest | Structured bundle with 8 platform dirs + MANIFEST.json |
publish-check |
ubuntu-latest | cargo package --workspace dry-run |
publish |
ubuntu-latest | Draft GitHub release with all artifacts + platform table |
CLI Artifacts (6 platforms)
| Platform | Archive |
|---|---|
| Linux x64 (glibc) | ipcprims-<version>-linux-amd64.tar.gz |
| Linux x64 (musl) | ipcprims-<version>-linux-amd64-musl.tar.gz |
| Linux arm64 (glibc) | ipcprims-<version>-linux-arm64.tar.gz |
| Linux arm64 (musl) | ipcprims-<version>-linux-arm64-musl.tar.gz |
| macOS x64 | ipcprims-<version>-darwin-amd64.tar.gz |
| macOS arm64 | ipcprims-<version>-darwin-arm64.tar.gz |
No Windows CLI — CLI requires Unix domain sockets (named pipe transport lands in v0.2.0).
FFI Bundle Structure
bundle/
lib/
linux-amd64/ static/ + shared/
linux-amd64-musl/ static/ only
linux-arm64/ static/ + shared/
linux-arm64-musl/ static/ only
darwin-amd64/ static/ + shared/
darwin-arm64/ static/ + shared/
windows-amd64/ static/ + shared/ (GNU + MSVC import libs)
windows-arm64/ static/ + shared/ (MSVC)
include/
ipcprims.h
MANIFEST.json
VERSION
LICENSE-MIT
LICENSE-APACHE
Build Patterns
- Linux:
cargo-zigbuildin goneat container, glibc 2.17 baseline for GNU targets, crt-static for musl - macOS: native cross-compile x64+arm64,
MACOSX_DEPLOYMENT_TARGET=11.0,install_name_tool -id @rpath/... - Windows: real Windows runners required (ring needs MSVC
lib.exe); MinGW/GNU for CGo compat, MSVC for arm64 and shared-only - SBOM: syft CycloneDX in sbom-tools container
Peer Crate Windows Compilation
cfg-gated ipcprims-peer Unix-specific imports behind #[cfg(unix)] so ipcprims-ffi compiles on all Windows targets:
connector.rs:UnixDomainSocketimport gated;#[cfg(not(unix))]returnsTransportError::ConnectwithUnsupportedlistener.rs:PeerListenerstruct uses#[cfg(unix)] socket/#[cfg(not(unix))] _unavailable: (); bind/accept returnUnsupported- Tests gated with
#[cfg(all(test, unix))] - No fake runtime support — non-Unix builds fail explicitly at the API boundary
This follows the IpcStreamInner::Unavailable placeholder pattern from ipcprims-transport. Full Windows implementation (named pipes) deferred to v0.2.0.
Adaptation from Brief
Windows x64 shared artifact names split into GNU and MSVC variants (ffi-shared-windows-amd64-gnu, ffi-shared-windows-amd64-msvc) to avoid upload-artifact name collision. Both are merged into bundle/lib/windows-amd64/shared/ in the final FFI bundle, preserving both import library variants for consumers.
Quality
- 122 tests passing (
cargo test --workspace --all-features) - Zero clippy warnings (
--all-features) make prepushgreen (fmt + clippy + goneat lint + test + cargo deny)- All dependencies permissively licensed
- actionlint passes on release.yml
Known Issues
- Go prebuilt libs: Not yet populated —
go-bindings.ymlmust run before tagging to create prebuilt libs PR (d4-02 pre-tag checklist). - Async API: Feature flags declared but no async code exists. Planned for v0.2.0.
- Transitive dep duplication:
getrandom(0.2 + 0.3) andwindows-sys(0.60 + 0.61) viajsonschemadep tree. No functional impact.
What's Next
- v0.1.2 pre-tag: Run
go-bindings.ymlvia workflow_dispatch, merge prebuilt libs PR, then tag - v0.2.0: Tokio-native async API, named pipe transport for Windows (full
IpcStreamInner::NamedPipevariant), TCP transport (per DDR-0001), CLI P2 commands