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.