Skip to content

feat: workspace support (Phase 1)#27

Merged
Sunrisepeak merged 9 commits into
mainfrom
workspace-phase1
May 12, 2026
Merged

feat: workspace support (Phase 1)#27
Sunrisepeak merged 9 commits into
mainfrom
workspace-phase1

Conversation

@Sunrisepeak
Copy link
Copy Markdown
Member

Summary

Adds multi-package workspace support to mcpp:

  • [workspace] section parsing — members list, exclude list, [workspace.dependencies] with namespaced subtables
  • .workspace = true — members inherit dependency versions from workspace root
  • Virtual workspace — root mcpp.toml with [workspace] but no [package] (pure management node)
  • Workspace discoveryfind_workspace_root() walks up from member to find workspace root
  • -p, --package flag — build a specific workspace member: mcpp build -p http
  • Config inheritance — workspace toolchain and target overrides propagate to members (member overrides win)

Design

  • Workspace uses existing path = "..." dependency mechanism — no new dependency semantics
  • Workspace only manages: member discovery, version centralization, config inheritance
  • Module visibility is controlled by C++23 export/import, not by the build system

Test plan

  • 3 new unit tests: workspace parsing, .workspace = true, no-workspace detection
  • All 95 existing unit tests pass
  • E2e test: 3-member workspace (core lib + greeter lib + hello binary)

- Add WorkspaceConfig struct to Manifest (members, exclude, dependencies)
- Parse [workspace] section with members array and version declarations
- Parse [workspace.dependencies] and [workspace.dependencies.<ns>]
- Support .workspace = true in dependency specs for version inheritance
- Make [package] optional when [workspace] is present (virtual workspace)
- Add 3 unit tests for workspace parsing
- Add find_workspace_root() for upward workspace discovery
- Add merge_workspace_deps() for .workspace = true resolution
- Virtual workspace: auto-select binary member as build target
- Workspace toolchain/target overrides inherit to members
- -p/--package flag for selective member builds
- Members inside a workspace auto-inherit workspace config
- Add e2e test: 3-member workspace (core + greeter + hello)
Path dependencies of transitive deps were resolved relative to the
main project root, which fails for workspace members when greeter
depends on core via path = "../core" but the build target is apps/hello.

Fix: add resolveRoot to WorkItem so child deps resolve relative to
their parent dep's directory. Also fix CI to pick the newest built
mcpp binary (avoids stale cached binaries from different fingerprints).
- 05_errors.sh: remove naming prefix enforcement test (relaxed in 0.0.10)
- 12_add_command.sh: mcpplibs is now default ns, no subtable header
- 21_ninja_dyndep.sh: P1 per-file dyndep replaces global build.ninja.dd
- Name check in SemVer merge path now also accepts the map key name
  (handles synthesize_from_xpkg_lua setting composite package.name)
- Rename test module from 'util' to 'acme.util' (util is a forbidden
  top-level name since 0.0.10)
@Sunrisepeak Sunrisepeak merged commit 8e89174 into main May 12, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant