---
# System prepended metadata

title: Flake `system`

---

# Flake `system`

Oldest flake user issues
 - #3487 Custom flake checkers
   - flake-parts?
 - #3602 follows behavior for flakes used as inputs
   - Unsolved, 9 comments
 - #3733 Confusing default update lock file behavoir
   - Appears solved
 - #3811 flake: command to build all the derivations
   - Solved with flake check
 - **#3843 provide builtins.currentSystem as a input to flakes**
   - Unsolved, 48 comments
   - **Better solution possible**

We can't have such a protracted experimental stage and not improve the flake schema despite the issues.




## Basic Solution

 - Solution for unusable rare `system` values

 - Incidentally, make `flake-utils` `forAllSystems` redundant

 - No semantic compromise
 
 - Close to the current schema

### Schema

 - Add `systems :: ListOf String` (or `AttrsOf {}`)

 - Add `perSystem :: ({ system :: String } -> Any) -> FlakeAttrs'`

 - `FlakeAttrs`:
   - `packages.<name>`
   - `checks.<name>`
   - ...
   
   but not `overlays`, `nixosConfigurations`, etc

### `call-flake.nix`

 - Improve the flake attributes
 
    - Generate `packages.<system>` etc using `systems` and `perSystem` if both are defined
    - Generate `perSystem` if any of `packages` etc is defined, but not `perSystem`

    - Wrap `perSystem` to memoize it, at least for the keys in `systems`


## Convenient Solution

 - `perSystem :: FlakeInputs' -> FlakeAttrs'`
 
 - `FlakeInputs'`:
 
    - For each input `${name} = flake.perSystem system`

    - `self = top.self // perSystem system` where `top` is the top level flake output arguments (aka inputs)

    - `system`


# FIXME

 - System is more complicated than a string


# Refs

 - https://github.com/NixOS/nix/issues/3843#issuecomment-1150111304