Architecture

How the projects meet: what crosses a boundary between them, and how the separate repositories relate to the one working copy. README.md says what each project is; BUILDING.md lists the dependency edges.

Compile-time edges

obSCEne's host tooling reaches three siblings by relative path: SELFish for the formats, Prosperous for the link layer and process control, and oops-libs for the build stamp, logging and paths every tool shares.

selfish-abi       = { path = "../../selfish/crates/selfish-abi" }
selfish-nid       = { path = "../../selfish/crates/selfish-nid" }
selfish-elf       = { path = "../../selfish/crates/selfish-elf" }
selfish-container = { path = "../../selfish/crates/selfish-container" }
pros-link         = { path = "../../prosperous/crates/pros-link" }
pros-core         = { path = "../../prosperous/crates/pros-core" }
oops-build        = { path = "../../oops-libs/crates/oops-build" }
oops-log          = { path = "../../oops-libs/crates/oops-log" }
oops-paths        = { path = "../../oops-libs/crates/oops-paths" }

The C edges do not appear in a manifest. obSCEne's Makefile compiles oops-sdk's sources into its module, eboot and payloads. Every app in oops-apps includes ../../oops-sdk/oops-sdk.mk and compiles the SDK into its own payload. oops-mesa carries upstream Mesa's radeonsi route onto the target to give applications OpenGL, builds on oops-sdk's runtime through oops-mesa.mk, and supplies the generated preamble a GL app such as gl1-cube includes. oops-sdk's own gl.h is a fixed-function instrument, and the two GL implementations never link into one title (oops-sdk#D007).

A path out of the repository works because the submodules sit side by side. A lone clone of obSCEne does not build without SELFish beside it. A git dependency on SELFish is not an alternative for individual crates: several of them read data files outside their own package root,

const FORMAT: &str = include_str!("../../../data/self-format.tsv");

and every crate is publish = false, so cargo package, cargo vendor and cargo publish cannot work on one crate. Only a path dependency or a whole-repository git dependency does. This follows from SELFish's rule that its format tables are the source of truth and the code reads them.

Artefact edges

Two ELF readers

SELFish and Orbistoun each parse the ELF, ABI and NID formats. Orbistoun's reader loads guests; selfish-elf is its dev-dependency, used only by a differential test that runs both readers over the corpus and reports every field on which they disagree (orbistoun#D653).

Separate repositories, one working copy

Development happens in this repository, where every project is present and builds against the others. Each project has its own repository because it has its own audience, releases and issue tracker: obSCEne is a conformance suite that can run against any loader, Prosperous is a hardware instrument, SELFish is a format library worth depending on from outside.

A cross-repository dependency therefore costs nothing structural. What each repository owes its audience is a release, a binary or a versioned library, not a checkout that builds alone.

Citing across projects

Each project numbers its decisions from D001. A citation of another project's decision names the project: orbistoun#D242, never a bare D242 (CONVENTIONS section 9). prosperity is a third-party project; prosperous is ours.