cxpm docs

Roadmap

cxpm is being redesigned from a build tool that sits beside CMake into the tool that replaces it: a package manager that fetches a project’s dependencies, builds against a sysroot made of exactly those dependencies, and hands the result to the package manager of the system it is installed on.

The plan was six milestones, in dependency order. Each one is tracked issue by issue on the project board, planning.pb, at the root of the repository; the issue numbers below are the board’s. The itemized findings that several of these issues close — every A# reference on this page — are in planning.pb (board #46, “SRS: Architecture & Flaws”), with file and line citations.

Version Milestone Issues
0.2 Foundation #2 – #11
0.3 Manifest model #12 – #19
0.4 Lifecycle #20 – #28
0.5 Sysroot isolation and native packaging #29 – #34
0.6 Self-hosting #35 – #40
0.7 Package index #41 – #45

Status on 2026-10-04

Milestones 0.3, 0.4 and 0.5 are complete. The sections below were written as the plan and are kept as such; what is still open:

# Open issue What is missing
10 CI on every push No green run yet: the runners cannot reach the submodules’ host
37 Submodules replaced by fetched dependencies The cx libraries need manifests in their own repositories
38 Delete CMake CMake was deleted, then brought back on 2026-10-04 as a second way to build cxpm locally; cxpm still builds itself without it
39 Migrate softforge-payments-server Not started; it is another repository
44 cxpm login and cxpm publish Both work, with a token from the operator of a cxpm serve index or with the name and password of an account on a cx-pm-web-index; the payments-platform login is not integrated
45 Deploy the public index cxpm serve and cx-pm-web-index (the index with accounts and a page, in its own repository) exist; nothing is deployed and no package is published

0.2 — Foundation: cx libraries and modular CMake

cxpm stops carrying its own containers, serialization, command-line, process and logging code and is built on the cx-core and cx-console libraries, vendored as submodules under third-party/ the same way softforge-payments-server does. CMake stays for now, reshaped into one independent project per target, which is the shape cxpm itself will have.

Done when cxpm builds from a fresh clone with submodules, the hand-rolled CXPM::Core and CXPM::Modules code is gone, and CI runs the tests on every push.

# Issue Closes
2 Vendor the cx libraries as submodules under third-party/
3 Reshape the CMake build into the modular layout that mimics cxpm
4 Replace CXPM::Core containers and patterns with cx-core A14, A15, A16b, A18, A24, A25
5 Replace the JSON codec with cx-core serialization
6 Rebuild the CLI on cx-console
7 Run every external process through cx-core-process A26, A27, A28
8 Move logging, threading and tests to cx-core A19, A20
9 Link cxpm as a static executable — see static-linking.md
10 CI: build and run the tests on every push A36
11 Replace this page with the board

0.3 — Manifest model: one target, declared dependencies

package.cpp and package.json describe one target per project, and a target can only see what it declares: every include path and library comes from a declared dependency. What CMake solves with several targets inside one project becomes several projects related by dependencies. Toolchains declare the sysroot they compile against, the staging directory they install into and the package manager of the system that sysroot belongs to.

Done when the examples are rewritten in the new model and each one builds from its declared dependencies alone.

# Issue Closes
12 One target per project
13 Dependencies are the only source of includes and libraries A9
14 Glob patterns in source lists
15 Toolchain-neutral compiler options
16 Toolchain declares its sysroot, staging directory and package manager
17 Check a descriptor schema version before trusting a loaded plugin A23
18 Toolchain plugin name comes from the descriptor A22
19 package.json, cxpm generate and the examples follow the new model A32

0.4 — Lifecycle: fetch, configure, build, pack, install

The five commands that are enough to distribute an application: fetch the dependencies, configure against a toolchain, build, pack into the staging directory, install through a package manager interface. Everything a command produces lives under the project’s .cxpm/ directory.

Done when an example with one fetched dependency goes through all five stages from a clean checkout.

# Issue Closes
20 Specify the lifecycle and the .cxpm directory
21 cxpm fetch: download the declared dependencies
22 cxpm configure: resolve the toolchain and dependencies once A21
23 cxpm build: incremental and parallel — see planning.pb (board #53, “SRS: Parallel Build”) A12
24 cxpm test
25 cxpm pack: stage, then produce a package
26 cxpm install and uninstall go through a package manager interface A10, A11, A13
27 cxpm project create
28 Test the lifecycle against a fake toolchain

0.5 — Sysroot isolation and native packaging

Builds run against a sysroot assembled from the project’s complete declared dependencies, never against whatever the host has installed. pack produces the package format of the target sysroot’s package manager, and install is a wrapper over that package manager.

Done when the same project produces a pacman package on an Arch sysroot and an rpm on an Amazon Linux sysroot, and each installs and uninstalls cleanly with the native tool.

# Issue
29 Build the sysroot from the declared dependencies
30 Compile and link only against the sysroot
31 Package manager backend: pacman
32 Package manager backend: rpm
33 Package manager backend: deb
34 Confine the descriptor sandbox and the build with namespaces — see planning.pb (board #52, “SRS: Descriptor Sandbox”)

0.6 — Self-hosting: CMake removed

cxpm builds, tests, packs and installs itself, and softforge-payments-server does the same. Every CMakeLists.txt is deleted.

A CMake build has since been brought back for working on cxpm locally (see quickstart ). It is not needed: the bootstrap script and cxpm itself still build everything with no CMake on the machine.

Done when a fresh clone goes from the bootstrap script to an installed cxpm package with no CMake on the machine.

# Issue
35 cxpm builds cxpm
36 Bootstrap from a bare compiler
37 Replace the third-party submodules with fetched dependencies
38 Delete CMake
39 Migrate softforge-payments-server to cxpm
40 Rewrite the documentation around the lifecycle

0.7 — Package index: cx::pm::index::server

An npm-like index that maps package names and versions to their repositories. It holds no code: each entry points at the package’s repository. The index is served by cxpm itself and published at 01.dev.soft-forge.dev/cxpm/index, with the Soft Forge payments platform as the login.

Done when cxpm fetch resolves a dependency by name and version through the index and cxpm publish registers a new version.

# Issue
41 Specify the package index format and API
42 cx::pm::index::server: serve the index
43 cxpm fetch resolves names and versions through the index
44 cxpm login and cxpm publish
45 Deploy the index at 01.dev.soft-forge.dev/cxpm/index

Where the previous roadmap went

The page this one replaces listed 19 items written against the old --build/--install flags. None of them was dropped: the ones already done stay recorded in planning.pb (board #46, “SRS: Architecture & Flaws”), and every one still open was carried into an issue above, labelled tech-debt on the board and tagged with its A# number so it can be traced back to the finding that motivated it.