5.1 KiB
5.1 KiB
Capability Resolution & Installer Shadowing
Layer Hierarchy
┌───────────────────────────┐ Highest layer
│ OS-PACKAGES │ (PKGBUILD / debian / rpm)
└───────────▲───────────────┘
│ shadows lower layers
┌───────────┴───────────────┐
│ NIX │ (flake.nix)
└───────────▲───────────────┘
│ shadows lower layers
┌───────────┴───────────────┐
│ PYTHON │ (pyproject.toml)
└───────────▲───────────────┘
│ shadows lower layers
┌───────────┴───────────────┐
│ MAKEFILE │ (Makefile)
└────────────────────────────┘ Lowest layer
Scenario Matrix
| Scenario | Makefile | Python | Nix | OS-Pkgs | Test Name |
|---|---|---|---|---|---|
| 1) Only Makefile | ✔ | – | – | – | only_makefile |
| 2) Python + Makefile | ✔ | ✔ | – | – | python_and_makefile |
| 3) Python shadows Makefile | ✗ | ✔ | – | – | python_shadows_makefile |
| 4) Nix shadows Py & MF | ✗ | ✗ | ✔ | – | nix_shadows_python_makefile |
| 5) OS-Pkgs shadow all | ✗ | ✗ | ✗ | ✔ | os_packages_shadow_all |
Legend: ✔ = installer runs ✗ = installer skipped (shadowed by upper layer) – = no such layer present
What the Integration Test Confirms
Goal: Validate that the capability-shadowing mechanism correctly determines which installers actually run for a given repository layout.
1) Only Makefile
- Makefile provides
make-install. - No higher layers → MakefileInstaller runs.
2) Python + Makefile
- Python provides
python-runtime. - Makefile additionally provides
make-install. - No capability overlap → both installers run.
3) Python shadows Makefile
- Python also provides
make-install. - Makefile’s capability is fully covered → MakefileInstaller is skipped.
4) Nix shadows Python & Makefile
- Nix provides all capabilities below it.
- Only NixInstaller runs.
5) OS-Packages shadow all
- PKGBUILD/debian/rpm provide all capabilities.
- Only the corresponding OS package installer runs.
Capability Processing Flowchart
┌────────────────────────────┐
│ Start │
└───────────────┬────────────┘
│
provided_capabilities = ∅
│
▼
┌──────────────────────────────────────────────┐
│ For each installer in layer order (low→high) │
└───────────────────┬──────────────────────────┘
│
supports(ctx)?│
┌─────────┴──────────┐
│ no │
│ → skip installer │
└─────────┬──────────┘
│ yes
▼
caps = detect_capabilities(layer)
│
caps ⊆ provided_capabilities ?
┌─────────────┬─────────────┐
│ yes │ no │
│ skip │ run installer│
└─────────────┴──────────────┘
│
▼
provided_capabilities ∪= caps
│
▼
┌────────────────────────┐
│ End of installer list │
└────────────────────────┘
Core Principle (one sentence)
A layer only executes if it provides at least one capability not already guaranteed by any higher layer.