mirror of
https://github.com/LGUG2Z/komorebi.git
synced 2026-11-14 21:04:04 +01:00
docs/dev/flake-checks.md records why the evaluation of the checks needed more than the host has (about 0.55 GB per VM suite and 0.4 GB per NixOS system of the module check, nothing shared), the sets and what is in each, how they are exposed (checkSets, checkMembers, defaultCheckSets in nix/checks.nix), the alternatives rejected, what was measured with the sets (nix flake check --no-build 4.54 GB / 33 s on one system, 6.55 GB / 40 s --all-systems; each set alone from 0.2 GB for the cheap ones to 11.6 GB for linux-nixos-eval), and why windows-nextest and macos-nextest ran no test. build-and-test.md gets the commands for one set, the default and one member and loses windows-nextest; flake.md, docs/linux/CONTRIBUTING.md, docs/linux/dev/vm-tests.md, the comment of nix/linux/tests/vm/default.nix and the CI step of CUTOVER-PLAN.md name the new places (checkSets, checkMembers, legacyPackages.<system>.vm.NAME) instead of the placeholder heavyChecks and checks.<system>.vm-NAME. Not run: the docs build.
163 lines
13 KiB
Markdown
163 lines
13 KiB
Markdown
# The flake
|
|
|
|
One `flake.nix` and one `flake.lock` at the repository root build, check and test the three platforms:
|
|
Windows (cross-built on Linux with xwin), KDE Plasma (native Linux) and macOS (native on an Apple machine).
|
|
The nested flakes of `komorebi-for-kde/` and `komorebi-for-mac/` and the `kfde-` and `kfm-` input prefixes are gone.
|
|
|
|
## Layout
|
|
|
|
| File | What it holds |
|
|
|---|---|
|
|
| `flake.nix` | the inputs and the list of modules; nothing else |
|
|
| `nix/common.nix` | the systems, `pkgs`, the formatter (treefmt), the pre-commit hook, the dev shells, the default overlay and the old-name aliases |
|
|
| `nix/lib.nix` | helpers: `repoFile` (a file of the repository as a store path of its own), `mkPkgs`, the workspace version, the systems of each platform, the manifest-only source |
|
|
| `nix/workspace-src.nix` | the source of one platform, cut from the one Cargo workspace (below) |
|
|
| `nix/windows/{build,flake-module}.nix` | the xwin SDK, the clang-cl environment, the crane derivations, the `windows-*` outputs, `e2e-windows` |
|
|
| `nix/linux/{build,flake-module}.nix` | the crane derivations of the KDE packages, the `linux-*` checks, the `vm-*` checks, the NixOS module, the Plasma guests |
|
|
| `nix/macos/{build,flake-module}.nix` | the crane derivations of the macOS packages, the `macos-*` checks, the darwin module |
|
|
| `nix/linux/*`, `nix/macos/*` | the NixOS module and options, the darwin module and options, the VM test suites, the KWin effects |
|
|
|
|
## Naming rule
|
|
|
|
The unprefixed names are the NATIVE build of the system: on Linux (`x86_64-linux`, `aarch64-linux`) they are
|
|
the KDE packages, on macOS (`aarch64-darwin`, `x86_64-darwin`) the macOS ones. The Windows cross-built outputs
|
|
are prefixed `windows-`. Checks are `<platform>-<check>` (`windows-clippy`, `linux-nextest`, `macos-deny`), and
|
|
the VM tests keep their `vm-NAME` names.
|
|
|
|
| System | Windows (`windows-*`) | Linux (native names, `linux-*` checks, `vm-*`) | macOS (native names, `macos-*` checks) |
|
|
|---|---|---|---|
|
|
| `x86_64-linux` | packages, apps, checks, `e2e-windows` | packages, apps, checks, VM tests | |
|
|
| `aarch64-linux` | packages, apps, checks | packages, apps, checks, VM tests | |
|
|
| `aarch64-darwin` | packages, apps, checks | checks and `legacyPackages.vm` (the fake desktop and the guests' definitions) | packages, apps, checks |
|
|
| `x86_64-darwin` | | | packages, apps, checks |
|
|
|
|
## Old name -> new name
|
|
|
|
The names of the root flake before this change (the Windows flake, plus the nested flakes re-exported with the
|
|
prefixes `kfde-` and `kfm-`) and of the nested flakes themselves.
|
|
|
|
### Packages and apps
|
|
|
|
| Old | New |
|
|
|---|---|
|
|
| `packages.<s>.komorebi`, `komorebic`, `komorebic-no-console`, `komorebi-bar`, `komorebi-gui`, `komorebi-shortcuts`, `komorebi-testwin`, `komorebi-e2e-agent` (Windows) | `windows-komorebi`, `windows-komorebic`, `windows-komorebic-no-console`, `windows-komorebi-bar`, `windows-komorebi-gui`, `windows-komorebi-shortcuts`, `windows-komorebi-testwin`, `windows-komorebi-e2e-agent` |
|
|
| `windowsSdk` | `windows-sdk` |
|
|
| `komorebi-testwin-e2e` | `windows-komorebi-testwin-e2e` |
|
|
| `komorebi-full` (Windows) | `windows-komorebi-full` |
|
|
| `default` (Windows), `apps.default` | `windows-default` (`default` is now the native package) |
|
|
| `apps.komorebi`, `komorebic`, `komorebic-no-console`, `komorebi-bar`, `komorebi-gui`, `komorebi-shortcuts` (Windows) | `apps.windows-komorebi`, ... (`e2e-windows` is unchanged) |
|
|
| `kfde-komorebi`, `kfde-komorebic`, `kfde-komorebi-full`, `kfde-default` | `komorebi`, `komorebic`, `komorebi-full`, `default` on the Linux systems |
|
|
| `kfde-kde-rounded-corners-komorebi`, `kfde-kwin-effect-geometry-change-komorebi`, `kfde-run-kde`, `kfde-wsl2-probe`, `kfde-wsl2-probe-guest` | the same names without `kfde-` |
|
|
| `kfm-komorebi`, `kfm-komorebic`, `kfm-komorebi-bar`, `kfm-komorebi-full`, `kfm-default` | `komorebi`, `komorebic`, `komorebi-bar`, `komorebi-full`, `default` on the Darwin systems |
|
|
| apps of the nested flakes: `komorebi`, `komorebic`, `run-kde`, `wsl2-probe`, `default` (Linux); `komorebi`, `komorebic`, `komorebi-bar`, `default` (macOS) | unchanged, per system |
|
|
|
|
### Checks
|
|
|
|
| Old | New |
|
|
|---|---|
|
|
| `komorebi-workspace-clippy`, `-fmt`, `-toml-fmt`, `-deny`, `-nextest` (Windows) | `windows-clippy`, `windows-fmt`, `windows-toml-fmt`, `windows-deny` (`-nextest` ran no test and is gone, see flake-checks.md) |
|
|
| `e2e-tests` | `windows-e2e-tests` |
|
|
| `kfde-komorebi-workspace-clippy`, `-doc`, `-fmt`, `-toml-fmt`, `-deny`, `-nextest` | `linux-clippy`, `linux-doc`, `linux-fmt`, `linux-toml-fmt`, `linux-deny`, `linux-nextest` |
|
|
| `kfde-komorebi-bridge-js` | `linux-bridge-js` |
|
|
| `kfde-schema-fresh`, `kfde-nix-options-validation`, `kfde-keybindings-fixtures`, `kfde-nixos-module-eval`, `kfde-plasma-guests-eval` | `linux-schema-fresh`, `linux-nix-options-validation`, `linux-keybindings-fixtures`, `linux-nixos-module-eval`, `linux-plasma-guests-eval` |
|
|
| `kfde-wsl2-probe`, `kfde-wsl2-probe-dry-run`, `kfde-run-kde`, `kfde-run-kde-doctor`, `kfde-run-kde-dry-run` | `linux-wsl2-probe`, `linux-wsl2-probe-dry-run`, `linux-run-kde`, `linux-run-kde-doctor`, `linux-run-kde-dry-run` |
|
|
| `kfde-kde-rounded-corners-komorebi-install`, `kfde-kwin-effect-geometry-change-komorebi-install` | `linux-kde-rounded-corners-komorebi-install`, `linux-kwin-effect-geometry-change-komorebi-install` |
|
|
| `vm-NAME`, `vm-lib` (nested KDE flake only; the root flake left them out) | unchanged names, in `checks` (`vm-lib`) or the sets `vm-fast`, `vm-slow` (see Checks and flake-checks.md); the suites are also `legacyPackages.<s>.vm.NAME` |
|
|
| `kfm-komorebi-workspace-clippy`, `-fmt`, `-toml-fmt`, `-deny`, `-nextest` | `macos-clippy`, `macos-fmt`, `macos-toml-fmt`, `macos-deny`, `macos-nextest` |
|
|
| `kfm-nix-options-validation`, `kfm-darwin-module-validation` | `macos-nix-options-validation`, `macos-darwin-module-validation` |
|
|
| `pre-commit`, `treefmt`, `kfde-pre-commit`, `kfde-treefmt`, `kfm-pre-commit`, `kfm-treefmt` | `pre-commit`, `treefmt` (one each, for the whole repository) |
|
|
|
|
### Other outputs
|
|
|
|
| Old | New |
|
|
|---|---|
|
|
| `legacyPackages.<s>.kfde-vm` (root); `legacyPackages.<s>.vm`, `vmTiers`, `vmGuests`, `vmTcg` (nested) | `legacyPackages.<s>.vm`, `vmTiers`, `vmGuests`, `vmTcg` |
|
|
| `nixosModules.komorebi-for-kde` (root); `nixosModules.default`, `komorebi`, `forVmTests` (nested) | `nixosModules.komorebi` (= `default`), `forVmTests`; `komorebi-for-kde` stays as an alias |
|
|
| `darwinModules.komorebi-for-mac` (root); `darwinModules.default`, `komorebi` (nested) | `darwinModules.komorebi` (= `default`); `komorebi-for-mac` stays as an alias |
|
|
| `overlays.komorebi-for-kde` (root); `overlays.default`, `komorebi`, `forVmTests` (nested) | `overlays.default` and `komorebi` (the native packages of the system the overlay is applied to), `overlays.linux`, `overlays.macos`, `overlays.forVmTests`; `komorebi-for-kde` stays as an alias |
|
|
| `nixosConfigurations.*` (nested KDE flake) | unchanged: `plasma-vm`, `plasma-vm-session`, `plasma-utm`, `plasma-vm-x86_64`, ..., `run-kde-x86_64`, `run-kde-aarch64` |
|
|
| `devShells.<s>.default` | `devShells.<s>.default` (all three platforms, cross environment for Windows) and `devShells.<s>.native` (the same without the cross environment) |
|
|
| `formatter.<s>` | `formatter.<s>` (one treefmt for the repository) |
|
|
|
|
## Inputs
|
|
|
|
One of each: `nixpkgs` (nixpkgs-unstable), `flake-parts`, `crane`, `rust-overlay`, `treefmt-nix`,
|
|
`git-hooks-nix`, and `asc` (the application-specific configuration komorebic embeds on Windows). They are the
|
|
revisions the KDE flake was locked to, because the KDE VM suites run against the Plasma and KWin of the pinned
|
|
nixpkgs and the KDE flake was the newest of the three (nixpkgs f05535a0, 2026-10-27, KWin 6.8.2, which is
|
|
`testedMax` in `nix/linux/supported-kwin.nix`; rust-overlay 19ecdd08 gives rustc 1.99.1, and sysinfo 0.39.6
|
|
needs 1.95).
|
|
|
|
One second nixpkgs, `nixpkgs-x86_64-darwin` (16c7794d, 2026-01-02), is used for the `x86_64-darwin` outputs and
|
|
for nothing else: nixpkgs 26.11 dropped x86_64-darwin and evaluating it with the unified pin throws
|
|
(`Nixpkgs 26.11 has dropped support for x86_64-darwin`). Drop the input together with x86_64-darwin when Intel
|
|
Macs are no longer supported.
|
|
|
|
Updating: `nix flake update NAME` for one input; never a blanket `nix flake update`. A new nixpkgs has to keep
|
|
every VM suite green (`just vm-all`), and the Windows and macOS groups build.
|
|
|
|
## The source of a build
|
|
|
|
The Cargo workspace lists the members of all three platforms (`default-members` is the Windows set), so cargo
|
|
loads every member in every build. `nix/workspace-src.nix` cuts one source per platform:
|
|
|
|
- `real` is the filtered source: the platform's members, the root manifest, lock and toolchain files, the
|
|
platform's own files of the crates the platforms share (`komorebic`, `komorebi-client`, `komorebi-bar`,
|
|
`komorebi-daemon`: the `linux`, `macos` and `windows` modules and tests are told apart by name) and the data
|
|
files the sources and tests read (docs, schemas, fixtures).
|
|
- `src` is `real` plus a stub for every other member: its manifest with an empty library and a `main` that does
|
|
nothing. Stubs are needed: cargo refuses a workspace with a member that is not there, and `--locked` refuses
|
|
a lock file that has packages the workspace does not have. A stub carries the manifest only, so an edit of
|
|
another platform's code changes nothing here.
|
|
- The dependency derivations (`buildDepsOnly`) use a dummy source made of the manifests of every member
|
|
(`manifestSource` in `nix/lib.nix`), the same for the three platforms. It is a plain path, not a
|
|
derivation, so crane reads it at evaluation without building: `nix flake check --no-build --all-systems`
|
|
needs that to evaluate the Darwin outputs on a Linux host.
|
|
|
|
The Linux source takes the crates listed in `nix/linux/root-crates.json` (the crates outside the Linux-only
|
|
ones that `cargo tree` says the KDE packages depend on, so an edit of the egui bar does not rebuild the KDE
|
|
packages); `tools/kde-closure-check` fails when the list and `cargo tree` differ. The Windows source is the
|
|
whole workspace except the Linux and macOS crates and files; the macOS source is the macOS crates, the shared
|
|
crates and `crates/`.
|
|
|
|
## Checks
|
|
|
|
Every platform's checks run on its own source, so a change in one platform's directories does not rebuild the
|
|
others' derivations. A change in a crate under `crates/` (or in `komorebic`, `komorebi-client`,
|
|
`komorebi-daemon`), in `Cargo.toml`, `Cargo.lock`, `rust-toolchain.toml` or `deny.toml` rebuilds those that read it.
|
|
|
|
- `windows-clippy`, `windows-fmt`, `windows-toml-fmt`, `windows-deny`, `windows-e2e-tests`
|
|
- `linux-clippy`, `linux-doc`, `linux-nextest`, `linux-fmt`, `linux-toml-fmt`, `linux-deny`, `linux-bridge-js`,
|
|
`linux-schema-fresh`, `linux-nix-options-validation`, `linux-keybindings-fixtures`, `linux-nixos-module-eval`,
|
|
`linux-plasma-guests-eval`, `linux-wsl2-probe`, `linux-wsl2-probe-dry-run`, `linux-run-kde*`,
|
|
`linux-*-install`
|
|
- `macos-clippy`, `macos-nextest`, `macos-fmt`, `macos-toml-fmt`, `macos-deny`, `macos-nix-options-validation`,
|
|
`macos-darwin-module-validation`
|
|
- `treefmt` and `pre-commit` for the whole tree
|
|
|
|
The checks are in sets (docs/dev/flake-checks.md): `checks.<system>` has the members of the sets of
|
|
`defaultCheckSets` in `nix/checks.nix`, the cheap ones. The ones that evaluate NixOS systems (the VM suites,
|
|
`linux-nixos-module-eval`, `linux-plasma-guests-eval`, `linux-run-kde*`) are the sets `vm-fast`, `vm-slow`,
|
|
`linux-nixos-eval` and `linux-demo`, which `nix flake check` leaves out (evaluating them took more memory than the host
|
|
has): `nix build -L .#checkSets.<set>`, or one member, `.#checkMembers.<set>.<name>`. A check is named as before
|
|
(`nix build -L .#checks.x86_64-linux.windows-clippy`). `nix flake check --no-build --all-systems` evaluates the
|
|
default sets and every other output of every system and is the evaluation test of this file.
|
|
|
|
## Dev shells
|
|
|
|
`nix develop` has the tools of all three platforms: the nightly rustfmt over the toolchain of
|
|
`rust-toolchain.toml` with the Windows target, the xwin cross environment (`CARGO_BUILD_TARGET` is
|
|
`x86_64-pc-windows-msvc`, so a bare `cargo` command builds for Windows), cargo-deny, cargo-nextest, the KDE
|
|
bridge's node and tsc, the VM library's ruff and ty, QEMU and swtpm for the Windows e2e guest. For `cargo`
|
|
commands on the Linux or macOS packages use `nix develop .#native` (the same tools, no cross environment), or
|
|
`--target` on a command.
|
|
|
|
## Updating the flake: what to run
|
|
|
|
- the evaluation: `nix flake check --no-build --all-systems`
|
|
- the Windows group: `windows-clippy`, `windows-fmt`, `windows-toml-fmt`, `windows-deny`,
|
|
`windows-e2e-tests`, the `windows-*` packages
|
|
- the Linux group: the `linux-*` checks and packages, one VM suite (`vm-lib`, then a cheap suite)
|
|
- on a Mac: `nix build -L .#checks.aarch64-darwin.macos-{clippy,nextest,fmt,toml-fmt,deny,nix-options-validation,darwin-module-validation}`
|
|
and `nix build -L .#packages.aarch64-darwin.{komorebi,komorebic,komorebi-bar}`
|