Skip to content

Ecosystem gap supplement: launchers, naming, build dependencies, pack providers and runners - #940

Open
Sunrisepeak wants to merge 11 commits into
mainfrom
eco/2026.11.16-gap-supplement
Open

Sunrisepeak wants to merge 11 commits into
mainfrom
eco/2026.11.16-gap-supplement

Conversation

@Sunrisepeak

@Sunrisepeak Sunrisepeak commented Nov 15, 2026 •

Copy link
Copy Markdown
Member

This pull request implements the mcpp part of the ecosystem gap supplement (design record .agents/docs/2026-11-15-ecosystem-gap-supplement-design.md, section 5). Each commit is one checkpoint and carries its own tests, specification clauses, English and Chinese documentation, and CHANGELOG entries. Review goes checkpoint by checkpoint, and the commits are kept when the branch is merged.

Checkpoint Content State
design The design record, including the findings made during implementation (section 13) done
m1 N29: two build-dependency requests that no version satisfies are refused, naming both requesters done
m2 N20: launchers use the system table and do not fall back to PATH. N11: one launcher per program. N30: mcpp::pack_program (protocol 19), and a provider's stated reasons appear in the refusal done
m3 N9: a stated program name is followed on every row, and a link produces one file. N16: [resources] applies only to Windows programs done
m4 N23: execution relations. N26: wasm exceptions. N33: optional companions done
m5 R1: the runner key enabled, plus wine runner data done
m6 R2: runner model alignment, runner_spec, {pkg:}, longlived in data done
m7 Runner program rules (Windows suffixes for a directory-qualified name; arguments with command-interpreter syntax refused for .bat/.cmd) and documentation done
m8 G7: x86_64-linux-android runs in the Android Emulator on request (dirun and the API 34 image package's profile; exclusive for a provider runner). e2e 653 follows N26 done
m9 #932: mcpp test --guide reads the resolved graph and plans nothing. #936: a group's programs are planned together, so a shared module is compiled once. #938: a missing source named by its path is refused, naming its table (design record 13.4; N39 for review) done

The PR is a draft until every checkpoint is in and the full CI passes.

Closes #932, closes #936, closes #938.

The record of the cross-platform port gaps, the runner model and the plan this pull
request implements, with the findings made while implementing it (section 13).
… name (N29)

A build dependency is a module of a build program, which the module rename does not
separate. The rename was tried and failed on the requester's sources with a message about
staging; the refusal now names both requesters, the merge's reason and the override line.
… format provider states

- N20: the POSIX launcher names the system by the system table's uname column; a package that
  carries its runner runs only its own and exits 126 naming what it holds (POSIX and Windows).
- N11: --all-programs of an ok image gives every program its own pair of launchers.
- N30: mcpp::pack_program (protocol 19) states the program a pack-format provider assembles
  from; a provider that submits nothing has the warnings it stated in the refusal.
…r Windows programs

- N9: the statement's program and library names are followed on a built-in row as on a
  platform's; the temporary link name keeps the file's extension, so DJGPP writes one file.
- N16: [resources] is compiled for a PE row whose execution system is Windows, not for UEFI.
@Sunrisepeak
Sunrisepeak force-pushed the eco/2026.11.16-gap-supplement branch from 7245760 to 2174213 Compare November 15, 2026 11:28
…3, N26, N33)

- [[platform.executes]] states which architectures a machine executes besides
  its own; a same-arch runner is built for the artifact's architecture there,
  and both package launchers fall back to it. linux-x86_64 executes i686.
- A planned row the platform lists with its toolchain is built as a carrier.
- A row's exceptions model applies where the project states none;
  wasm32-emscripten states wasm, and its long jump follows.
- A row's companions (.wasm beside app.js) are removed before each link and
  staged when written; -sSINGLE_FILE=1 links and packs without a module.
- [resources] compile where the system table states resources = true, which
  replaces the literal system name in the resource gate.
- link-output moves aside only when the edge asks (--aside).
- A runner states enabled = false when its first use fetches a machine image
  or an emulator, or leaves state outside the build tree and the store. run
  refuses it with status 2 and test leaves the tests built and not run,
  naming [runner-not-enabled], what it installs and how to enable it, before
  anything is installed.
- A table without cmd in config.toml or the project adjusts the runner below
  it; cmd, requires and enabled are one statement; the environment's
  MCPP_TARGET_<TRIPLE>_RUNNER_ENABLED enables it once; --runner <name>
  enables the runner it names.
- A named runner takes the default runner's table and merge rule; longlived
  is a key of the table; a provider's runner states host and enabled.
- The MinGW providers state Wine on linux-x86_64, same-arch, not enabled.
… a runner names (R2, N21, N27)

- mcpp::runner_spec states a runner as the table of data (protocol 19):
  .arg(), .require(), .hosts(), host, longlived, exclusive, enabled; one
  runner-spec payload, refused when not a runner or when the name is also
  stated by the token calls. {pkg:<name>} names a program outside a
  package's bin/, its package in requires.
- docs/30 and docs/41 state one lookup rule: name the program; requires,
  then the graph's payloads, then PATH, never the current directory.
- On Windows a name with a directory and no suffix takes the system's
  suffixes; a script the system starts through its command interpreter
  (the system table's command-scripts, .bat and .cmd) is refused an
  argument holding the interpreter's syntax.
- docs/04 states the order of the flag lists (measured); docs/24 states
  the terminal under node (measured: a terminal read fails with EIO).
- The directive unit tests name protocol 19; the agents index is
  regenerated; design records N38 for review.
…d together, a missing source named by its path is refused (#932, #936, #938)

- mcpp test --guide reads the test frameworks from the resolved graph
  (resolve_graph: the phases of prepare_build up to the graph) and plans,
  scans and builds nothing; several members are resolved by configuration
  group and their frameworks united (collect_test_frameworks, shared with
  the plan).
- mcpp test over several members plans a group's programs together, as
  mcpp build --workspace does; a member is planned alone only to attribute
  a failure. A shared module was compiled three times a run before.
- A sources entry without a pattern that names no file is a scan error
  naming the table that states it.
- Design record 13.4 (analysis) and 13.5 (N39, for review); docs 04, 08;
  e2e 1094, 1095, 1096.
- The android-ndk provider is two entries, one per architecture; the
  x86_64 one states a runner: dirun with the API 34 system image
  package's profile, the emulator and adb from their packages,
  same-arch, exclusive, not enabled by default. The aarch64 row states
  none: the emulator package serves no aarch64 machine.
- A provider's runner states exclusive (generator, schema, statement).
- e2e 653 (case and script): with no table the row's exception model
  (N26) catches; exceptions = false aborts at the throw and refuses a
  dependency that requires exceptions.
- Unit: the Android row's runner data. Docs 41, SPEC-016 1.3, design.
@Sunrisepeak
Sunrisepeak marked this pull request as ready for review November 15, 2026 14:08
…before the build; design notes for op, N17 and N40

- single_file_unmade: the one reading of a named system before the build and
  of --systems all (a row this mcpp builds no program for, or a carrier where
  the platform's runner does not exist). A planned row the platform serves is
  built since N23, so a named --systems macos for an x86_64 image passed the
  pre-build check and was refused after the build (e2e 956 on macOS).
- e2e sets 986: the pair without a carrier is said with its row.
- Version 2026.11.16.1; CHANGELOG section.
- Design record: op scope (runners that boot a machine enabled on request,
  hosted rows' runners as full providers), N17 located (openkal-dos#3), N40
  for review.
…ee and warned of in a fetched package

The scanner states the entries (unnamed_sources) and the prepare step decides
their weight by whose tree the package is, the line state.editablePackage
draws for a dependency's lints: a published package's tarball cannot be
changed by its consumer, and refusing it would refuse a release that built
before. e2e 1097 asserts the fetched side.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant